Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在给定单个方法测试和可排序测试数据的情况下,如何命令TestNG工厂执行?_Java_Testng - Fatal编程技术网

Java 在给定单个方法测试和可排序测试数据的情况下,如何命令TestNG工厂执行?

Java 在给定单个方法测试和可排序测试数据的情况下,如何命令TestNG工厂执行?,java,testng,Java,Testng,首先,您应该知道我使用的是TestNGV6.8.8和JavaJDK6。我在不同版本的Linux和Mac OS 10.9.4上运行时遇到了这个问题。请转到代码清单 工厂级 testngxml 这既出乎意料,也不可取。很明显,这个测试很简单,但它是一个相当复杂的系统测试的代理,我必须获得正确的执行顺序 虽然这里没有列出,但我必须使用TestNG侦听器进行测试后结果处理,而且似乎我必须使用工厂,而不是独立的数据提供程序。(我已经注释掉了测试类声明中的侦听器注释。)我应该注意,侦听器工作时不会发生意外

首先,您应该知道我使用的是TestNGV6.8.8和JavaJDK6。我在不同版本的Linux和Mac OS 10.9.4上运行时遇到了这个问题。请转到代码清单

工厂级 testngxml 这既出乎意料,也不可取。很明显,这个测试很简单,但它是一个相当复杂的系统测试的代理,我必须获得正确的执行顺序

虽然这里没有列出,但我必须使用TestNG侦听器进行测试后结果处理,而且似乎我必须使用工厂,而不是独立的数据提供程序。(我已经注释掉了测试类声明中的侦听器注释。)我应该注意,侦听器工作时不会发生意外

因为只有一个方法,所以我不能使用优先级注释或方法依赖项。测试完全是数据驱动的。数据是可排序的,如果内存可用,当我使用测试类中的数据提供程序时,我得到了该顺序。但是我也需要监听器来装饰测试结果报告,这促使我使用工厂。我应该注意,无论我是否使用侦听器,执行问题都存在。如果您编译并运行这段代码,我希望您将看到以随机顺序列出的结果


提前感谢您对这个问题的考虑。

好的,我使用了它。我不欣赏方法拦截器的预处理能力。所以我创建了一个,我得到了我的有序测试。为了方便任何寻求解决方案的人,我将在这里列出我的代码更改

方法拦截器 奖励监听器将结果漂亮地打印到报告中 测试执行的结果 我假设您现在有了log4j,所以在类路径上有一个可用的log4j.xml,这里我们对测试结果进行了排序:

$ java org.testng.TestNG testng.xml
[TestNG] Running:
  /Users/rcourtright/Desktop/ersatz/testng.xml


0 [main] INFO ErsatzTest  - 0-Test

2 [main] INFO ErsatzTest  - 1-Test

3 [main] INFO ErsatzTest  - 2-Test

4 [main] INFO ErsatzTest  - 3-Test

5 [main] INFO ErsatzTest  - 4-Test

6 [main] INFO ErsatzTest  - 5-Test

7 [main] INFO ErsatzTest  - 6-Test

8 [main] INFO ErsatzTest  - 7-Test

9 [main] INFO ErsatzTest  - 8-Test

===============================================
ersatz-testing
Total tests run: 9, Failures: 0, Skips: 0
===============================================

最后,我没有意识到methodinterceptor的威力,也没有意识到它是在工厂做任何事情之后运行的。也就是说,工厂方法不控制顺序,但这可以通过使用拦截器来更改。

我将在我的项目中尝试您的解决方案,也许最后我可以在HTML报告中显示测试名称:我尝试过,它可以工作,但如果我在ErsatzTest中添加一个测试方法,则只能通过套件运行“justDoIt”,我还删除了//if(!iMethodInstance.getMethod().getMethodName().contains(“justDoIt”){//continue;//}if(!iMethodInstance.getMethod().getMethodName().equals(“justDoIt”){continue;}==========>if(!iMethodInstance.getMethod().getMethodName().equals(“justDoIt”)){tests.add(iMethodInstance);continue;}这样就行了
import org.testng.ITest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

/**
 * @author rcourtright
 *         Date: 8/5/14
 *         Time: 4:45 PM
 */
//@Listeners(ErsatzListener.class)
public class ErsatzTest implements ITest {

    private String order;

    public ErsatzTest(String order) {
        this.order = order;
    }

    @Test
    public void justDoIt() {
        System.out.println(order);
    }

    @Override
    public String getTestName() {
        return order;
    }
}
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="ersatz-testing" verbose="1" >
    <test name="ersatz-test-factory" preserve-order="true">
        <classes>
            <class name="ErsatzFactory"/>
        </classes>
    </test>
</suite>
ersatz-test-executor:
   [testng] 5-Test
   [testng] 2-Test
   [testng] 7-Test
   [testng] 6-Test
   [testng] 4-Test
   [testng] 8-Test
   [testng] 1-Test
   [testng] 0-Test
   [testng] 3-Test
   [testng]
   [testng] ===============================================
   [testng] ersatz-testing
   [testng] Total tests run: 9, Failures: 0, Skips: 0
   [testng] ===============================================
   [testng]
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author rcourtright
 *         Date: 8/11/14
 *         Time: 2:37 PM
 */
public class ErsatzMethodInterceptor implements IMethodInterceptor {

    @Override
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
        Map<String,IMethodInstance> orders = new TreeMap<String,IMethodInstance>();
        for (IMethodInstance iMethodInstance : methods) {
            if (!iMethodInstance.getMethod().getMethodName().equals("justDoIt")) {
                continue;
            }
            Object obj = iMethodInstance.getInstance();
            if (!(obj instanceof ErsatzTest)) {
                continue;
            }
            ErsatzTest ersatzTest = (ErsatzTest)obj;
            String order = ersatzTest.getOrder();
            orders.put(order,iMethodInstance);
        }
        List<IMethodInstance> tests = new ArrayList<IMethodInstance>(orders.size());
        for (String order : orders.keySet()) {
            IMethodInstance test = orders.get(order);
            tests.add(test);
        }
        return tests;
    }
}
    import org.apache.log4j.Logger;
import org.testng.ITest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

/**
 * @author rcourtright
 *         Date: 8/5/14
 *         Time: 4:45 PM
 */
@Listeners(
    {
        ErsatzMethodInterceptor.class,
        ErsatzListener.class
    }
)
public class ErsatzTest implements ITest {
    private Logger logger = Logger.getLogger(ErsatzTest.class);

    private String order;

    public ErsatzTest(String order) {
        this.order = order;
    }

    public String getOrder() {
        return order;
    }

    @Test
    public void justDoIt() {
        logger.info(order);
    }

    @Override
    public String getTestName() {
        return order;
    }
}
    import org.apache.log4j.Logger;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import org.testng.internal.BaseTestMethod;
import org.testng.internal.TestResult;

import java.lang.reflect.Field;

/**
 * @author rcourtright
 *         Date: 7/29/14
 *         Time: 12:03 PM
 */
public class ErsatzListener extends TestListenerAdapter {

    private Logger logger = Logger.getLogger(ErsatzListener.class);

    private void setTestNameInXml(ITestResult tr) {
        try {
            Field mMethod = TestResult.class.getDeclaredField("m_method");
            mMethod.setAccessible(true);
            mMethod.set(tr, tr.getMethod().clone());
            Field mMethodName = BaseTestMethod.class.getDeclaredField("m_methodName");
            mMethodName.setAccessible(true);
            mMethodName.set(tr.getMethod(), tr.getTestName());
        } catch (IllegalAccessException ex) {
            logger.error(ex.getLocalizedMessage(), ex);
        } catch (NoSuchFieldException ex) {
            logger.error(ex.getLocalizedMessage(), ex);
        }
    }

    @Override
    public void onTestSuccess(ITestResult tr) {
        setTestNameInXml(tr);
        super.onTestSuccess(tr);
    }

    @Override
    public void onTestFailure(ITestResult tr) {
        setTestNameInXml(tr);
        super.onTestFailure(tr);
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
        setTestNameInXml(tr);
        super.onTestSkipped(tr);
    }

}
$ java org.testng.TestNG testng.xml
[TestNG] Running:
  /Users/rcourtright/Desktop/ersatz/testng.xml


0 [main] INFO ErsatzTest  - 0-Test

2 [main] INFO ErsatzTest  - 1-Test

3 [main] INFO ErsatzTest  - 2-Test

4 [main] INFO ErsatzTest  - 3-Test

5 [main] INFO ErsatzTest  - 4-Test

6 [main] INFO ErsatzTest  - 5-Test

7 [main] INFO ErsatzTest  - 6-Test

8 [main] INFO ErsatzTest  - 7-Test

9 [main] INFO ErsatzTest  - 8-Test

===============================================
ersatz-testing
Total tests run: 9, Failures: 0, Skips: 0
===============================================