TestNG中执行testing的顺序

如何自定义TestNG中testing的执行顺序?

例如:

public class Test1 { @Test public void test1() { System.out.println("test1"); } @Test public void test2() { System.out.println("test2"); } @Test public void test3() { System.out.println("test3"); } } 

在上面的套件中,testing的执行顺序是任意的。 对于一次执行,输出可能是:

 test1 test3 test2 

我如何按照他们写的顺序执行testing?

这将工作。

 @Test(priority=1) public void Test1() { } @Test(priority=2) public void Test2() { } @Test(priority=3) public void Test3() { } 

priority鼓励执行顺序,但不保证先前的优先级已经完成。 test3可以在test2完成之前启动。 如果需要保证,则声明一个依赖关系。

与声明依赖关系的解决scheme不同,即使一个testing失败,使用prioritytesting也将执行。 根据文档,这个依赖关系的问题可以用@Test(...alwaysRun = true...)来解决。

在TestNG中,您使用dependsOnMethods和/或dependsOnGroups:

 @Test(groups = "a") public void f1() {} @Test(groups = "a") public void f2() {} @Test(dependsOnGroups = "a") public void g() {} 

在这种情况下,g()只会在f1()和f2()完成并成功之后运行。

您将在文档中find大量示例: http : //testng.org/doc/documentation-main.html#test-groups

为了解决具体的问题:

 @Test public void Test1() { } @Test (dependsOnMethods={"Test1"}) public void Test2() { } @Test (dependsOnMethods={"Test2"}) public void Test3() { } 

如果我正确地理解你的问题,那么你想按照指定的顺序运行testing,可以使用TestNG IMethodInterceptor。 看看http://beust.com/weblog2/archives/000479.html如何利用它们。

如果你想运行一些预初始化,看看IHookable http://testng.org/javadoc/org/testng/IHookable.html和相关的线程http://groups.google.com/group/testng-users/browse_thread/螺纹/ 42596505990e8484 / 3923db2f127a9a9c?LNK = GST&q = IHookable#3923db2f127a9a9c

用这个:

 public class TestNG { @BeforeTest public void setUp() { /*--Initialize broowsers--*/ } @Test(priority=0) public void Login() { } @Test(priority=2) public void Logout() { } @AfterTest public void tearDown() { //--Close driver--// } } 

通常TestNG提供了多个注释,我们可以使用@BeforeSuite, @BeforeTest, @BeforeClass来初始化浏览器/设置。

我们可以分配优先级,如果你已经写在脚本中的testing用例的数量,并希望按指定的优先级执行,然后使用: @Test(priority=0)从0,1,2,3开始….

同时我们可以对testing用例进行分组并执行分组。 为此我们将使用@Test(Groups='Regression')

像closures浏览器一样,我们可以使用@AfterTest, @AfterSuite, @AfterClass注释。

 @Test(dependsOnMethods="someBloodyMethod") 

如果您不想在TestNG中使用@Test(priority = )选项,则可以使用javaassist库和TestNG的IMethodInterceptor根据testing类中定义的testing方法的顺序对testing区分优先级。 这是基于这里提供的解决scheme。

将此侦听器添加到您的testing类:

 package cs.jacob.listeners; import java.util.Arrays; import java.util.Comparator; import java.util.List; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; import org.testng.IMethodInstance; import org.testng.IMethodInterceptor; import org.testng.ITestContext; public class PriorityInterceptor implements IMethodInterceptor { public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) { Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() { private int getLineNo(IMethodInstance mi) { int result = 0; String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName(); String className = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName(); ClassPool pool = ClassPool.getDefault(); try { CtClass cc = pool.get(className); CtMethod ctMethod = cc.getDeclaredMethod(methodName); result = ctMethod.getMethodInfo().getLineNumber(0); } catch (NotFoundException e) { e.printStackTrace(); } return result; } public int compare(IMethodInstance m1, IMethodInstance m2) { return getLineNo(m1) - getLineNo(m2); } }; IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]); Arrays.sort(array, comparator); return Arrays.asList(array); } } 

这基本上找出了方法的行号,并按照他们行号的升序sorting,也就是他们在类中定义的顺序。

通过使用@Test的优先级参数,我们可以控制testing执行的顺序。

小猪支持user1927494的答案,如果你想在所有其他人之前运行一个单一的testing,你可以这样做:

 @Test() public void testOrderDoesntMatter_1() { } @Test(priority=-1) public void testToRunFirst() { } @Test() public void testOrderDoesntMatter_2() { } 

通过指定要在testNg.xml中执行的testing方法,我们可以按照所需的顺序执行testing用例

 <suite> <test name="selenium1"> <classes> <class name="com.test.SeleniumTest" > <methods><include name="methodB"></include> <include name="methodA"></include> </methods> </class> </classes> </test> </suite> 

类文件中方法的sorting是不可预知的,因此您需要使用依赖关系或者将方法明确地包含在XML中。

默认情况下,TestNG将按照它们在XML文件中find的顺序运行testing。 如果您希望此文件中列出的类和方法以不可预测的顺序运行,请将preserve-order属性设置为false

我面临同样的问题,可能的原因是由于testng的并行执行,解决scheme是添加优先级选项,或者在testng.xml中更新preserve-order =“true”。

 <test name="Firefox Test" preserve-order="true"> 

有一些按照给定的顺序执行testing的方法。 通常情况下,testing必须是可重复和独立的,以确保它只testing所需的function,而不依赖于testing之外的代码的副作用。

所以,要回答你的问题,你需要提供更多的信息,比如为什么以特定的顺序运行testing是很重要的。

如果您碰巧使用了诸如dependsOnMethods类的其他内容,则可能需要在testng.xml文件中定义整个@Teststream。 AFAIK,套件XML文件(testng.xml)中定义的顺序将覆盖所有其他订购策略。

像unit testing一样的testing? 做什么的? testing必须是独立的,否则….你不能单独运行一个testing。 如果他们是独立的,为什么甚至会干涉? 另外 – 如果在多个内核的multithreading中运行它们,什么是“订单”?