NUnit是否适合Selenium测试?

10

在搜索 NUnit + 依赖方法 + 测试执行顺序时,我已经阅读了许多 SO 上的答案。每个答案都建议强制为单元测试设定任何顺序都是极其不好的。

我正在使用 NUnit 编写 Selenium 测试。 因此,我正在尝试使用单元测试框架编写集成测试!

举一个集成测试的例子(这只是一个例子)。在进行其他测试之前,我需要创建一个有效的帐户。如果帐户创建失败,则我希望中止整个测试执行。

由于我不想依赖于测试的字母顺序,并真正体现 NUnit 精神,所以决定在进一步测试之前创建一个帐户。尽管对我来说存在两个核心原因不太合适:

  1. 不必要的代码重复/执行
  2. 如果应用程序帐户创建不起作用,所有测试仍将尝试创建帐户并一遍又一遍地失败

我倾向于认为 NUnit 可能不正确地处理 Selenium 测试。 但如果不是 NUnit,那我应该使用什么?


想要补充一下,TestNG与Selenium测试非常契合,适用于上述所有指针。尽管TestNG是为Java设计的。 - Tarun
有人看过这篇文章吗 - http://beust.com/weblog/2005/03/17/are-dependent-test-methods-really-evil/? - Tarun
你能分享一下你过去一年的经验吗? - user247702
5个回答

2
Selenium Core本身带有一个由Javascript编写的TestRunner,您可以直接从浏览器中运行测试。更多信息请参见:http://www.developerfusion.com/article/84484/light-up-your-development-with-selenium-tests/
除此之外,使用Nunit和用C#编写的测试更容易编写和维护。您在编写测试时是否使用SetUp和TearDown?这样您就可以避免代码重复。
关于第二点,您可以设置一个标志,在第一次设置失败后跳过下一次设置,或者跟踪设置本身并在下一次迅速失败。如果设置失败,则在Nunit中不运行测试。

2
我经常使用NUnit运行Selenium。这取决于如何编写你的测试。为了避免代码重复,我创建了一个帮助函数库,用于执行常见的操作,例如登录或退出我的站点,其他测试使用这些函数来进入他们需要测试的页面。(我使用“库”这个词是宽泛的意义;我实际上没有将它们拆分成自己的C#项目。)
如果账户创建功能出现问题,则其他测试将无法通过。但是就我个人而言,我不认为这是一个问题,因为单元测试的目的是确保你的更改没有在项目其他地方产生意外影响。如果账户创建失败,显然会影响到很多事情。同样,如果我的登录帮助方法失败:如果你无法登录,就无法进入站点中的任何内容。实际上,整个站点都崩溃了。

2
如果您需要在每个测试中创建新帐户,那么我会采取的方法是将该代码移动到SetUp代码中。如果某些测试不需要登录,请将它们拆分到不同的文件中。
应该删除任何重复的部分,测试代码应该像生产代码一样清洁和健壮。将具有不同测试的文件拆分有助于维护单一职责的思想。

2
看到你的观点了,但并不完全认同。登录/注册只是一个很小的例子,可以在每个测试方法之前执行(尽管我认为这样做会耗费时间,因为相同的操作一遍又一遍地执行)。考虑以下情况。某大学有课程注册流程。在申请课程之前,学生必须通过15个不同的步骤,任何一个步骤失败都将阻止您继续进行。因此,这些步骤本身就是测试,申请课程也是如此。您仍然希望将所有这些步骤保留在设置中吗? - Tarun
另外,这个“SetUp”代码是否可以在多个类中使用?因为我必须创建不同的类来使测试模块化。 - Tarun

1

你也看过PNunit吗?

在这个问题的一个答案中可以看到:

有人找到了一种运行C# Selenium RC测试的并行方法吗?

我还不确定TestNG如何与网格一起工作,假设您有一个三步注册过程,并将其分成三个测试。TestNG与网格会对您有所帮助吗?我想可能不会,或者它会检测到测试C需要在同一线程上运行测试A和B吗?

PNunit看起来可以提供一种将依赖测试分发到同一台机器的方法。虽然设置可能相当复杂。


1
是的,TestNG确实会处理依赖测试在并行运行时的顺序。这些方法在不同的线程中运行,但它们保留了顺序 - http://testng.org/doc/documentation-main.html#parallel-running。我遇到的最大问题是集成测试的测试顺序。我需要在多个系统中创建帐户,然后转到一个系统并验证它。如果帐户创建本身失败,则不会继续执行更多测试。我想我无法解释单元测试和集成测试之间的区别,并且所有人似乎都支持单元测试方法。 - Tarun
我理解你的意思,我认为最好向Gallio/PNunit用户/开发人员询问他们的框架是否可以/将支持与TestNG类似的功能。在stackoverflow上也有pnunit、mbunit、gallio标签,你可以用它们标记你的问题。 - Ivo Grootjes

1

对于你描述的问题,有两种方法可以帮助你,作为回答AutomatedTester的答案:

首先,NUnit 2.4.4定义了一个SuiteAttribute,让你按照你想要的顺序运行测试。非常方便,但它有一个主要限制:它与TestCaseAttribute不兼容。这意味着所有的测试都必须仅由TestAttribute触发;如果你的目标是基于值的边界测试覆盖率(因此需要多个数据驱动测试用例),那么这将非常麻烦。更多信息请参见http://www.nunit.org/index.php?p=suite&r=2.5.10

另一种方法是准备一个专门为你的测试用例量身定制的集成示例数据库。比如说你有一个15步的注册流程:创建一个学生记录并将其推到第一步,然后创建另一个学生并将其推到第二步,以此类推。保存你的数据库,并将其恢复为测试夹具设置。然后使用不同的学生测试每个步骤。

在大多数情况下,为每个步骤使用不同的记录进行集成测试是完全有效的,因为它提供了相同的功能和代码覆盖,并且遵循集成测试的思想,因为您在数据库中的记录是真实的记录(由UI创建并带有所有缺陷)。

当然,由于您需要存储DB副本,因此需要更多的运行时间和存储空间。如果您的系统无法承受这种负担,那么您可能需要考虑第一个解决方案。

它还使您能够在较早的步骤不稳定时发现后续步骤中的错误:所有测试都在每个测试活动中运行,而在您要求的解决方案中则不是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接