TestNG中的测试执行顺序

Bad*_*dri 71 testing testng order-of-execution

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

例如:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的套件中,测试的执行顺序是任意的.对于一次执行,输出可以是:

test1
test3
test2
Run Code Online (Sandbox Code Playgroud)

如何按照编写顺序执行测试?

小智 82

这会奏效.

@Test(priority=1)
public void Test1() {

}

@Test(priority=2)
public void Test2() {

}

@Test(priority=3)
public void Test3() {

}
Run Code Online (Sandbox Code Playgroud)

priority鼓励执行订单,但不保证先前的优先级已完成.test3可以在test2完成之前开始.如果需要保证,则声明依赖项.

与声明依赖关系的解决方案不同,priority即使一个测试失败,也会执行使用的测试.@Test(...alwaysRun = true...)根据文档,可以解决依赖关系的这个问题.


Ced*_*ust 64

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

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

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

@Test(dependsOnGroups = "a")
public void g() {}
Run Code Online (Sandbox Code Playgroud)

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

您将在文档中找到许多示例:http: //testng.org/doc/documentation-main.html#test-groups

  • `dependsOnGroups` 非常有用,但在我看来,当两者结合在一起时,TestNG 忽略了 `priority`。 (2认同)

use*_*895 24

解决有问题的特定情况:

@Test
public void Test1() {

}

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

}

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

}
Run Code Online (Sandbox Code Playgroud)


Bha*_*ane 7

用这个:

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--//

        }

}
Run Code Online (Sandbox Code Playgroud)

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

如果您在脚本中编写了多个测试用例并希望按照指定的优先级执行,那么我们可以分配优先级,然后使用: @Test(priority=0)从0,1,2,3开始....

同时我们可以对测试用例的数量进行分组并通过分组来执行.为此,我们将使用@Test(Groups='Regression')

最后关闭浏览器我们可以使用@AfterTest, @AfterSuite, @AfterClass注释.


jac*_*bcs 6

如果您不想@Test(priority = )在TestNG中使用该选项,则可以使用javaassist库和TestNG IMethodInterceptor来根据测试类中定义测试方法的顺序确定测试的优先级.这基于此处提供的解决方案.

将此侦听器添加到测试类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这基本上找出方法的行号,并按行号的升序对它们进行排序,即它们在类中定义的顺序.


小智 5

@Test(dependsOnMethods="someBloodyMethod")
Run Code Online (Sandbox Code Playgroud)

  • 我可能会指出这不是特别有用的答案-建议您更详细地扩展您的答案! (3认同)

小智 -5

像单元测试这样的测试?做什么的?测试必须是独立的,否则......您无法单独运行测试。如果他们是独立的,为什么还要干涉呢?另外 - 如果您在多个内核上的多个线程中运行它们,那么“顺序”是什么?

  • 实际上很有可能混合依赖关系和并行性,请查看这篇文章以了解 TestNG 是如何做到这一点的:http://beust.com/weblog/2009/11/28/hard-core-multicore-with-testng/ (2认同)