我已经看过几个类似的问题,但没有一个直接回答我的问题...... 我使用Selenium Webdriver 2.0和TestNg以及Java,我正在寻找一种更好的方法来控制运行测试的顺序。 我真正想要的只是测试用例按照他们在课程中编写的顺序运行。 这很直观。这很简单。它的可维护性。而且我真的很惊讶它不是testNg的默认值。 (为什么在编码器未明确要求时应用一些随机排序?)
无论如何,我知道我可以在我的testng xml中添加一个方法列表,但到目前为止我已经进行了130次测试(还有几百次测试!),这样的方法列表对于将来的维护来说太过分了。 EG当我添加十种测试方法时,我必须记住将所有这些方法添加到我的xml文件中。如果我错过添加一个怎么办?我永远不会注意到它从未运行过......
所以这个解决方案将成为维护的噩梦:
<test name="BVTQA01">
<classes>
<class name="TestPackage.BVT">
<methods>
<include name="testLogin"></include>
<include name="testAddToCart"></include>
...
<include name="test999 etc"></include>
</methods>
</class>
</classes>
</test>
我也尝试过保存顺序:
<test name="BVTQA01" preserve-order="true">
<classes>
<class name="TestPackage.TestBVT" />
</classes>
</test>
但是,如果我不添加方法列表以及包含姓名&#39;的维护噩梦,那么它显然会被忽略。列表...
所以目前我只是在xml文件中列出我的测试类(如上所述 - 具有20种方法的TestBVT等),并且用&#39;控制测试运行顺序取决于&#39;关于测试本身的注释。 然而,这并不理想,因为我在每个方法上创建依赖项。我想删除它们不是真正必要的依赖项。 我只想使用&#39;取决于&#39;当有真正的依赖时。
我还从@Test带注释的方法中自动搜索创建xml。但是发布的解决方案并不清楚如何实际实施。
关于如何让testNg从上到下运行我的测试类的任何反馈,按顺序编写,没有任何随机排序或维护繁重的列表生成将是很好的。 提前谢谢,
JR
答案 0 :(得分:1)
一种方法是以编程方式运行TestNG。
package com.shn.test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import org.xml.sax.SAXException;
import com.shn.demos.RunDemo;
public class RunSuite{
public static void main(String[] args) {
TestNG testNG = new TestNG();
List<XmlSuite> suites = new ArrayList<XmlSuite>();
//pass the name of Suite, Name of the groups to be executed & name of test
suites.add(createSuite("SuiteDemo", "groupName1", "testName"));
testNG.setSuiteThreadPoolSize(1);
testNG.setXmlSuites(suites);
testNG.run();
}
public static XmlSuite createSuite(String suiteName, String groupName, String testName) {
XmlSuite suite = new XmlSuite();
suite.setName(suiteName);
suite.setParallel(XmlSuite.PARALLEL_NONE);
LinkedHashMap<String, String> suiteParams = new LinkedHashMap<String, String>();
//Put in the parameters out here which are required @ suite level
suiteParams.put("SuiteKey1", "SuiteValue1");
suiteParams.put("SuiteKey2", "SuiteValue2");
suite.setParameters(suiteParams);
XmlTest test = new XmlTest(suite);
test.setName(testName);
test.addIncludedGroup(groupName);
//Put in the parametes out here wich are required @ test level
test.addParameter("testKey1", "testValue1");
test.addParameter("testKey2", "testValue2");
List<XmlClass> clazzes = new ArrayList<XmlClass>();
//This is your class under test
XmlClass clazz = new XmlClass(Foo.class);
clazzes.add(clazz);
test.setClasses(clazzes);
List<XmlTest> tests = new ArrayList<XmlTest>();
tests.add(test);
suite.setTests(tests);
return suite;
}
}
我只知道设置Preserve Order()并没有真正尝试过。 如果它对您有用,请告诉我
答案 1 :(得分:1)
您可以通过实现和注册IAnnotationTransformer自动为每个测试方法生成优先级注释,IAnnotationTransformer使用javassist读取方法行号并将其指定为TestNG测试优先级。
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import javassist.*
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
public class AssignTestPriorityTransformer implements IAnnotationTransformer
{
static ClassPool s_ClassPool = ClassPool.getDefault();
@Override
public void transform(ITestAnnotation p_annotation, Class p_testClass, Constructor p_testConstructor, Method p_testMethod)
{
p_annotation.setPriority(getMethodLineNumber(p_testMethod));
}
private int getMethodLineNumber(Method p_testMethod)
{
try
{
CtClass cc = s_ClassPool.get(p_testMethod.getDeclaringClass().getCanonicalName());
CtMethod methodX = cc.getDeclaredMethod(p_testMethod.getName());
return methodX.getMethodInfo().getLineNumber(0);
}
catch(Exception e)
{
throw new RuntimeException("Getting of line number of method "+p_testMethod+" failed", e);
}
}
}
并在XML文件中注册该侦听器
<suite name="Suite" parallel="false">
<listeners>
<listener class-name="AssignTestPriorityTransformer" />
</listeners>
<test name="All tests">
<classes>
<class name="tests.YourTests"/>
</classes>
</test>
</suite>
AssignTestPriorityTransformer将确保由@Test注释标记的方法将按照与测试类的java源代码中定义的顺序相同的顺序进行处理。
答案 2 :(得分:0)
您可以使用优先级注释,它们不是TestNG的标准部分,但也是由框架的作者制作的。当然,现在不是管理1个xml文件,而是必须跟踪所有130个测试的优先级,但是你可以使用优先级进行更精细的控制。优先注释在此处描述:http://beust.com/weblog/2008/03/29/test-method-priorities-in-testng/