在TestNG xml配置文件中,关于<test>
的配置里面,有一个属性叫preserve-order
,是用来控制<test>
里面所有<classes>
的执行顺序的, 对classes里面的方法顺序无效,<test>
默认下的preserve-order
为true
,表示<test>
下所有<classes>
顺序执行:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Preserve order test runs"> <test name="Regression 1" preserve-order="true"> <classes> <class name="com.pack.preserve.ClassTwo"/> <class name="com.pack.preserve.ClassThree"/> <class name="com.pack.preserve.ClassOne"/> </classes> </test> </suite>
会依次执行ClassTwo
、ClassThree
、ClassOne
的测试方法。
【注意】 一个<class>
类里面可能存在多个测试方法(被@Test注解的方法),这些方法的执行顺序不受preserve-order
控制。默认测试方法的执行顺序是按照方法名的字典序升序排序执行的。
对于需要按照一定顺序执行测试方法的需求, 有以下几种做法:
(1) 使用priority
指定执行顺序(默认值为0),数值越小,越靠前执行 -- 但是: 我们不推荐使用这种方式来指定测试方法的执行顺序。因为当你中间需要修改执行顺序的时候,会相当麻烦。而且,多个<class>
的测试方法,如果指定了相同的priority
,那么会产生与预期不一样的执行顺序,TestNG会先跑所有相同priority
的测试方法,而不管你的测试方法是不是在同一个<class>
里面。
(2) 有目的地去定制方法名称,就可以让方法按照我们要求的顺序执行 -- 但是这种方式使得我们命名测试方法名称更加费劲,也不是最优的解决方案。
(3) 在xml里面使用<include>
指定需要执行的方法和顺序 - 荐使用这种方式来指定方法的执行顺序,因为这是最灵活并且最直观的。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Preserve order test runs"> <test name="Regression 1" preserve-order="true"> <classes> <class name="com.pack.preserve.ClassOne"> <methods> <include name="BTest" /> <include name="AMethod" /> </methods> </class> </classes> </test> </suite>
如上配置,ClassOne
会执行两个测试方法,先执行BTest
,然后执行AMethod
。