2

我已经看到发布了一些类似的问题,但没有一个可以直接回答我的问题......我正在使用 Selenium Webdriver 2.0 和 TestNg 和 Java,我正在寻找一种更好的方法来控制测试运行的顺序。我真正想要的只是测试用例按照它们在类中编写的顺序运行。它很直观。这简单。它的可维护性。我真的很惊讶它不是 testNg 的默认设置。(当编码器没有明确要求时,为什么要应用一些随机排序?)

无论如何,我知道我可以在我的 testng xml 中添加一个方法列表,但到目前为止我有 130 个测试(还有数百个!),这样的方法列表对于未来的维护来说太多了。例如,当我添加十个测试方法时,我必须记住将所有这些方法添加到我的 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>

但如果我不添加方法列表和“包含名称”列表的维护噩梦,它显然会被忽略......

所以目前我只是在 xml 文件中列出我的测试类(如上 - TestBVT,它有 20 个方法等),并使用测试本身的“取决于”注释来控制测试运行顺序。然而,这并不理想,因为我正在创建对每个方法的依赖项。我想删除它们不是真正必要的依赖项。当存在真正的依赖关系时,我只想使用“依赖于”。

我还搜索了从我的 @Test 注释方法自动创建 xml。但是发布的解决方案并不清楚如何实际实施。

任何关于如何让 testNg 从上到下按顺序运行我的测试类的任何反馈,没有任何随机排序或维护繁重的列表生成将是美妙的。提前致谢,

JR

4

3 回答 3

2

一种方法是以编程方式运行 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;
    }
}

我只知道 setPreserveOrder() 还没有真正尝试过。请让我知道这对你有没有用

于 2013-08-27T03:14:48.560 回答
1

您可以通过实现和注册 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 源代码中定义的顺序相同的顺序进行处理。

于 2014-03-26T12:16:00.723 回答
0

您可以使用优先级注释,它们不是 TestNG 的标准部分,但也是由框架的作者制作的。当然,现在您必须跟踪所有 130 个测试的优先级,而不是管理 1 个 xml 文件,但是您仍然可以使用优先级进行更精细的控制。此处描述了优先级注释:http: //beust.com/weblog/2008/03/29/test-method-priorities-in-testng/

于 2013-08-26T16:00:06.660 回答