Java 在给定单个方法测试和可排序测试数据的情况下,如何命令TestNG工厂执行?
首先,您应该知道我使用的是TestNGV6.8.8和JavaJDK6。我在不同版本的Linux和Mac OS 10.9.4上运行时遇到了这个问题。请转到代码清单 工厂级 testngxml 这既出乎意料,也不可取。很明显,这个测试很简单,但它是一个相当复杂的系统测试的代理,我必须获得正确的执行顺序 虽然这里没有列出,但我必须使用TestNG侦听器进行测试后结果处理,而且似乎我必须使用工厂,而不是独立的数据提供程序。(我已经注释掉了测试类声明中的侦听器注释。)我应该注意,侦听器工作时不会发生意外 因为只有一个方法,所以我不能使用优先级注释或方法依赖项。测试完全是数据驱动的。数据是可排序的,如果内存可用,当我使用测试类中的数据提供程序时,我得到了该顺序。但是我也需要监听器来装饰测试结果报告,这促使我使用工厂。我应该注意,无论我是否使用侦听器,执行问题都存在。如果您编译并运行这段代码,我希望您将看到以随机顺序列出的结果Java 在给定单个方法测试和可排序测试数据的情况下,如何命令TestNG工厂执行?,java,testng,Java,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
===============================================