如何自定义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");
}
}
在上面的套件中,测试的执行顺序是任意的。对于一次执行,输出可以是:
test1
test3
test2
如何按照编写顺序执行测试?
答案 0 :(得分:77)
这会奏效。
@Test(priority=1)
public void Test1() {
}
@Test(priority=2)
public void Test2() {
}
@Test(priority=3)
public void Test3() {
}
priority
鼓励执行顺序,但不保证先前的优先级已经完成。 test3
可以在test2
完成之前启动。如果需要保证,则声明依赖。
与声明依赖关系的解决方案不同,即使一个测试失败,也会执行使用priority
的测试。根据{{3}},可以使用@Test(...alwaysRun = true...)
解决此依赖关系问题。
答案 1 :(得分:58)
在TestNG中,您使用dependsOnMethods和/或dependsOnGroups:
@Test(groups = "a")
public void f1() {}
@Test(groups = "a")
public void f2() {}
@Test(dependsOnGroups = "a")
public void g() {}
在这种情况下,g()只会在f1()和f2()完成并成功后运行。
您会在文档中找到很多示例:http://testng.org/doc/documentation-main.html#test-groups
答案 2 :(得分:21)
解决有问题的具体情况:
@Test
public void Test1() {
}
@Test (dependsOnMethods={"Test1"})
public void Test2() {
}
@Test (dependsOnMethods={"Test2"})
public void Test3() {
}
答案 3 :(得分:6)
如果您不想在TestNG中使用@Test(priority = )
选项,则可以使用javaassist 库和TestNG的IMethodInterceptor
按照顺序排列测试的优先级。测试方法在测试类中定义。这基于提供的解决方案here。
将此侦听器添加到测试类:
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);
}
}
这基本上找出方法的行号,并按行号的升序排序,即在类中定义它们的顺序。
答案 4 :(得分:5)
使用此:
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
来初始化浏览器/设置。
如果您在脚本中编写了多个测试用例并希望按指定的优先级执行,我们可以分配优先级,然后使用: {0}从0,1,2,3开始......
同时我们可以对测试用例的数量进行分组并通过分组来执行。
为此,我们将使用@Test(priority=0)
最后关闭浏览器,我们可以使用@Test(Groups='Regression')
注释。
答案 5 :(得分:4)
如果我正确理解你的问题,你想以指定的顺序运行测试,可以使用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/thread/42596505990e8484/3923db2f127a9a9c?lnk=gst&q=IHookable#3923db2f127a9a9c
答案 6 :(得分:4)
@Test(dependsOnMethods="someBloodyMethod")
答案 7 :(得分:2)
通过指定要在testNg.xml中执行的测试方法,我们可以按所需顺序执行测试用例
<suite>
<test name="selenium1">
<classes>
<class name="com.test.SeleniumTest" >
<methods><include name="methodB"></include>
<include name="methodA"></include>
</methods>
</class>
</classes>
</test>
</suite>
&#13;
答案 8 :(得分:1)
通过使用@Test的优先级参数,我们可以控制测试执行的顺序。
答案 9 :(得分:1)
小猪退出用户1927494的回答, 如果您想在所有其他测试之前运行单个测试,则可以执行以下操作:
@Test()
public void testOrderDoesntMatter_1() {
}
@Test(priority=-1)
public void testToRunFirst() {
}
@Test()
public void testOrderDoesntMatter_2() {
}
答案 10 :(得分:1)
类文件中方法的顺序是不可预测的,因此您需要使用依赖项或在XML中显式包含您的方法。
默认情况下,TestNG将按照XML文件中的测试顺序运行测试。如果您希望此文件中列出的类和方法以不可预测的顺序运行,请将preserve-order属性设置为false
答案 11 :(得分:1)
我遇到了同样的问题,可能的原因是由于testng的并行执行,解决方案是添加优先级选项或者只是在testng.xml中更新preserve-order =“true”。
<test name="Firefox Test" preserve-order="true">
答案 12 :(得分:0)
带有重要解释的答案:
“ TestNG ”有两个参数,用于确定测试的执行顺序:
@Test(dependsOnGroups= "someGroup")
并且:
@Test(dependsOnMethods= "someMethod")
在这两种情况下,这些功能都将取决于方法或组,
但是区别:
在这种情况下:
@Test(dependsOnGroups= "someGroup")
该方法将依赖于整个组,因此不一定在执行依赖函数后立即也将执行此方法,但是该方法可能会在运行后期甚至在其他测试运行后发生。
重要的是要注意,如果此参数在同一组测试中有多个用途,这是解决问题的安全方法,因为整个测试集的相关方法将首先运行,然后再运行。只有依赖它们的方法。
但是,在这种情况下:
@Test(dependsOnMethods= "someMethod")
即使在同一组测试中多次使用此参数,在立即执行依赖方法之后,依赖方法仍将执行。
希望这很明显,对您有所帮助。
答案 13 :(得分:0)
使用:preserve-order =“true”enabled =“true” 这将以您编写的方式运行测试用例。
<suite name="Sanity" verbose="1" parallel="" thread-count="">
<test name="Automation" preserve-order="true" enabled="true">
<listeners>
<listener class-name="com.yourtest.testNgListner.RetryListener" />
</listeners>
<parameter name="BrowserName" value="chrome" />
<classes>
<class name="com.yourtest.Suites.InitilizeClass" />
<class name="com.yourtest.Suites.SurveyTestCases" />
<methods>
<include name="valid_Login" />
<include name="verifyManageSurveyPage" />
<include name="verifySurveyDesignerPage" />
<include name="cloneAndDeleteSurvey" />
<include name="createAndDelete_Responses" />
<include name="previewSurvey" />
<include name="verifySurveyLink" />
<include name="verifySurveyResponses" />
<include name="verifySurveyReports" />
</methods>
</classes>
</test>
</suite>
答案 14 :(得分:0)
如果您碰巧使用dependsOnMethods
之类的其他内容,您可能需要在testng.xml文件中定义整个@Test流。 AFAIK,套件XML文件(testng.xml)中定义的顺序将覆盖所有其他排序策略。
答案 15 :(得分:0)
有一些方法可以按给定的顺序执行测试。通常情况下,测试必须是可重复且独立的,以确保它只测试所需的功能,并且不依赖于正在测试的代码的副作用。
因此,要回答您的问题,您需要提供更多信息,例如为什么按特定顺序运行测试很重要。
答案 16 :(得分:-5)
单元测试等测试?做什么的?测试必须是独立的,否则......你不能单独进行测试。如果他们是独立的,为什么甚至会干涉?另外 - 如果您在多个核心的多个线程中运行它们,那么“订单”是什么?