0

我有一个包含大约 6 个类的测试套件,它们之间总共有 120 个测试。

我面临的问题是,当其他一些测试正在运行时,一些测试无法运行。例如,对于测试 a、b、c、d、e、f:

  • a 不能与 b 或 c 一起运行
  • b 不能与 a 或 c 一起运行
  • c 不能与 a 或 b 一起运行
  • d 不能与 f 一起运行
  • e 可以运行任何东西
  • f 不能与 d 一起运行

这是一个小例子,但希望它能说明这一点。我仍然想尽可能多地利用并行性,例如 ad 和 e 可以同时运行。我仍在使用 testNG 学习,但我尝试了以下方法:

将不能一起运行的测试分组到一个组中- 我找不到在“parallel =“groups”模式下运行 testNG 的方法,例如在一个组中运行所有测试的“parallel =“classes””在同一个线程中。将每个不能一起运行的测试放在一个类中将允许 'parallel="classes"' 工作,但这意味着测试不会像目前那样由测试功能安排。

将依赖关系放在测试周围- 我考虑让每个测试相互依赖(可能与组?),形成一个链,例如 a->b->c。这样做的问题是这些将始终按该顺序运行,这可能会隐藏问题。这里的另一个问题是测试维护成为一个问题,因为您必须确保链是单一的并且不会中断!

创建一个按组对列表进行排序的方法拦截器- 我对此并不完全确定,但我认为它不会阻止测试已经运行,而另一个不兼容的测试被选为“下一个运行”。

我见过TestNG & Selenium: 将测试分成“组”,在每个组内按顺序运行,似乎在尝试相同的目标,但出于不同的原因,因此达到的解决方案不合适,因为它不是依赖问题,但是一个隔离问题。

有什么可以帮助我的吗?

非常感谢,

菲尔

4

1 回答 1

1

您可以重构测试,以便您当前的类列表不再标记为测试。相反,引入新的测试代理类,其方法只是调用原始类中的测试过程。这样,维护功能区域中的代码就很简单了。或者,由于代理类基于它们使用的资源类型,您可以将它们放入套件中的单独测试中并使用parallel="tests".

实际上,您不必介绍那些代理类。您可以将您的测试指定为

<test name="boiler">
   <classes>
      <class name="org.example.A">
         <methods>
            <include name="a1"/>
            <include name="a2"/>
         </methods
      </class>
      ... <!-- list of methods that use the boiler -->
   </classes>
</test>
<test name="waterheater">
    <classes>
      <class name="org.example.B">
         <methods>
            <include name="b"/>
         </methods>
      </class>
       ... <!-- list of methods that use the waterheater -->
   </classes>
</test>

使用代理类的优点是列出测试可以在类级别而不是方法级别完成。你的旅费可能会改变。

<test name="boiler">
   <classes>
      <class name="org.example.BoilerProxy"/>
   </classes>
</test>
<test name="waterheater">
   <classes>
       <class name="org.example.WaterHeaterProxy"/>
   </classes>
</test>
...

这样做的问题是这些将始终按该顺序运行,这可能会隐藏问题。

TestNG 几乎总是每次都以完全相同的顺序运行一系列测试。我认为,如果您希望使用 TestNG 的工具在事情以不同的顺序运行时发现错误,那么这是您设计中的一个缺陷。没有捷径可以绘制出可能出现的序列组合并对其进行显式测试,或者至少是其中的一个可管理的子集。鉴于此,如第一段所述设置代理测试可能是您最好的选择,因为您可以根据需要重复和重新排序它们。

测试并行性、异步性和竞争条件很困难。除了好的设计,没有捷径可走。

我根据这个答案创建了一篇博客文章:http: //ancient-marinator.blogspot.com/2013/05/on-testing-scheduling-your-tests.html

于 2013-04-28T03:06:12.450 回答