在TestNG中控制测试订单的更简单方法是什么?

时间:2013-08-26 15:55:24

标签: java selenium testng

我已经看过几个类似的问题,但没有一个直接回答我的问题...... 我使用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

3 个答案:

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