TestNG& Selenium:将测试分成“组”,在每组内部按顺序运行

时间:2011-10-31 16:23:19

标签: selenium integration-testing webdriver testng

我们使用TestNG和Selenium WebDriver来测试我们的Web应用程序。

现在我们的问题是我们经常有几个需要按特定顺序运行的测试,例如:

  • 登录到应用程序
  • 输入一些数据
  • 编辑数据
  • 检查它是否正确显示

现在很明显,这些测试需要以精确的顺​​序运行。

与此同时,我们还有许多其他测试完全独立于上述测试列表。

所以我们希望能够以某种方式将测试放入“组”(不一定是TestNG意义上的组),然后运行它们:

  • 一个“组”内的测试总是以相同的顺序一起运行
  • 但不同的测试“组”整体可以按任何顺序运行

第二点很重要,因为我们希望避免不同组中测试之间的依赖关系(因此可以独立使用和开发不同的测试“组”)。

有没有办法使用TestNG实现这一目标?

我们尝试的解决方案

  • 首先,我们只将属于一起的测试放在一个类中,并使用dependsOnMethods使它们以正确的顺序运行。这曾经在TestNG V5中工作,但在V6中,TestNG有时会交错来自不同类的测试(同时尊重dependsOnMethods强加的排序)。似乎没有办法告诉TestNG“始终从一个类一起运行测试”。
  • 我们考虑过写method interceptor。但是,这样做的缺点是从IDE内部运行测试变得更加困难(因为直接调用类上的测试不会使用拦截器)。此外,拦截器无法使用dependsOnMethods进行测试,因此我们必须停止使用它。我们可能需要创建自己的注释来指定排序,我们希望尽可能使用标准的TestNG功能。
  • TestNG docs建议使用preserve-order订购测试。这看起来很有希望,但只有在你单独列出每个测试方法时才有效,这似乎是多余的,难以维护。

有没有更好的方法来实现这一目标?

我也愿意接受有关如何处理相互构建的测试的任何其他建议,而不必在所有测试中强加总订单。

PS

alanning的回答指出,我们可以通过在每个测试中进行必要的设置来简单地保持所有测试的独立性。原则上这是一个好主意(有些测试会这样做),但有时我们需要测试一个完整的工作流程,每个步骤都取决于之前的所有步骤(如我的例子)。使用“独立”测试来实现这一点意味着反复运行相同的多步设置,这将使我们已经慢速测试的速度更慢。而不是三个测试:

  • 测试1:登录到应用程序
  • 测试2:输入一些数据
  • 测试3:编辑数据

我们会得到

  • 测试1:登录到应用程序
  • 测试2:登录应用程序,输入一些数据
  • 测试3:登录应用程序,输入一些数据,编辑数据 等

除了不必要地增加测试时间外,这也感觉不自然 - 应该可以将工作流建模为一系列测试。

如果没有其他办法,这可能就是我们要做的,但我们正在寻找更好的解决方案,而不需要重复相同的设置调用。

3 个答案:

答案 0 :(得分:4)

您正在混合“功能”和“测试”。将它们分开将解决您的问题。

例如,创建一个帮助程序类/方法,执行登录步骤,然后在Login测试中调用该类/方法以及需要用户登录的所有其他测试。

您的其他测试实际上并不需要依赖您的登录“测试”,只需要依赖登录类/方法。

如果后来的后端修改在登录过程中引入了一个错误,那么依赖于Login帮助程序类/方法的所有测试仍将按预期失败。

<强>更新

原来这已经有了一个名称,即Page Object模式。这是一个包含使用此模式的Java示例的页面:

http://code.google.com/p/selenium/wiki/PageObjects

答案 1 :(得分:1)

尝试依赖于组依赖于方法。在一个组中添加同一类中的所有方法。 例如

@Test(groups={"cls1","other"}) 
public void cls1test1(){
}
@Test(groups={"cls1","other"}, dependsOnMethods="cls1test1", alwaysrun=true) 
public void cls1test2(){
}

In class 2
@Test(groups={"cls2","other"}, dependsOnGroups="cls1", alwaysrun=true) 
public void cls2test1(){
}
@Test(groups={"cls2","other"}, dependsOnMethods="cls2test1", dependsOnGroups="cls1", alwaysrun=true) 
public void cls2test2(){
}

答案 2 :(得分:1)

如果您对第一种方法感到满意,可以采用一种简单的(虽然是hacky)解决方法:

  

首先,我们只将属于一起的测试放在一个类中,并使用dependsOnMethods使它们以正确的顺序运行。这曾经在TestNG V5中工作,但是在V6中,TestNG有时会交错来自不同类的测试(同时遵循dependsOnMethods强加的排序)。似乎没有办法告诉TestNG“总是从一个类一起运行测试”。

我们遇到了类似的问题:我们需要运行类测试,因为我们不能保证测试类不会相互干扰。

这就是我们所做的: 放一个

@Test( dependsOnGroups= { "dummyGroupToMakeTestNGTreatThisAsDependentClass" } )

所有测试继承自的抽象测试类或接口的注释。 这会将您的所有方法都放在“第一组”中(如in this paragraph所述的组,而不是TestNG组)。在组内部,排序是分类的。 感谢Cedric Beust,他提供了very quick answer for this

编辑: 组dummyGroupToMakeTestNGTreatThisAsDependentClass实际上必须存在,但您可以为此添加一个虚拟测试用例。