是NUnit Selenium测试的不好选择吗?

时间:2011-04-17 13:15:27

标签: c# nunit mbunit gallio pnunit

在搜索NUnit +依赖方法+测试执行顺序时,我已经在SO上阅读了无数的答案。每一个答案都表明,迫使单位测试的任何顺序都是非常邪恶的。

我正在使用NUnit编写Selenium测试。 所以我试图使用单元测试框架编写集成测试!!!

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

由于我不想依赖于字母顺序的测试和真正的NUnit精神,所以决定在进行任何进一步测试之前创建一个帐户。虽然由于两个核心原因,我看起来不合适 -

  1. 不必要的代码重复/执行
  2. 如果应用程序帐户创建不起作用,我的所有测试仍会尝试一次又一次地创建帐户并失败
  3. 我倾向于认为NUnit可能不适合处理Selenium测试。 但如果不是Nunit那么我应该使用什么?

5 个答案:

答案 0 :(得分:2)

Selenium Core本身附带一个用Javascript编写的TestRunner,您可以直接从浏览器运行测试。

了解更多信息:

http://www.developerfusion.com/article/84484/light-up-your-development-with-selenium-tests/

除此之外,使用Nunit和用C#编写的测试更容易编写和维护。您在编写测试时是否正在使用SetUp和TearDown?这样就可以避免代码重复。

关于第二点,您可以拥有在第一次设置失败时设置的标记,并在下次跳过设置或设置本身跟踪它并在下次快速失败。如果在Nunit中安装失败,测试就不会运行。

答案 1 :(得分:2)

我一直用NUnit运行Selenium。这取决于你如何编写测试。为了避免代码重复,我创建了一个辅助函数库,它可以执行常见操作,例如登录或注销我的站点,其他测试用来访问他们需要测试的页面。 (我在宽松的意义上使用术语'库';我实际上并没有把它们分成他们自己的C#项目。)

你是对的,如果帐户创建功能被破坏,其他测试将失败。但就个人而言,我不认为这是一个问题,因为单元测试的目的是确保您的更改在项目的其他地方没有意外的影响。如果帐户创建破裂,显然会影响很多事情。如果我的登录帮助程序方法失败,同上:如果您无法登录,则无法访问该站点中的任何内容。实际上,整个网站都被打破了。

答案 2 :(得分:2)

如果您需要在每个测试中创建新帐户,那么我将采用的方法是将该代码移动到您的SetUp代码中。如果您的某些测试不需要登录,请将它们拆分为不同的文件。

应删除任何重复位,测试代码应与生产代码一样干净和健壮。使用不同的测试拆分文件有助于保持Single Responsibility的想法。

答案 3 :(得分:1)

您是否也看过PNunit?

请参阅此问题中的一个答案:

Has anyone found a way to run C# Selenium RC tests in parallel?

我仍然不能100%确定TestNG如何使用网格,假设您有一个3步注册过程,并将其分为3个测试。带网格的TestNG会帮助你吗?我想不会,或者它会检测到测试C需要在同一个线程上运行测试A和B吗?

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

答案 4 :(得分:1)

两种方法可能对您有所帮助,您描述的问题是AutomatedTester的答案:

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

的更多信息

另一种方法是准备专为您的测试用例量身定制的集成示例数据库。假设您有15个步骤的注册过程:创建学生记录并将其推送到第一步,然后将另一个学生推到第二步,依此类推。保存数据库并将其恢复为测试夹具设置。然后用另一名学生测试每一步。

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

当然,由于您必须存储的数据库副本,因此需要更多时间来运行和存储空间。如果您的系统负担不起,那么您可能希望查看第一个解决方案。

即使之前的步骤不稳定,它也为您提供了在后续步骤中发现错误的优势:所有测试都在每个测试活动中运行,而在您要求的解决方案中并非如此。