TestNG OnConfiguration失败:然后如何注册所有测试并设置为失败?

TestNG OnConfiguration失败:然后如何注册所有测试并设置为失败?,testng,Testng,我正在讨论testng以及我们的测试系统如何报告失败。简单地说,如果我在before类中遇到问题,我想注册所有测试并将其标记为失败 我试着用我们的系统把它整合在一起,但我希望有一个内部的方法来做到这一点。我有以下测试: @BeforeClass void beforeClass() { log.debug("Before class") AssertUtils.assertIs(false, true) } @Test void testA() { log.debug("I'm a

我正在讨论testng以及我们的测试系统如何报告失败。简单地说,如果我在before类中遇到问题,我想注册所有测试并将其标记为失败

我试着用我们的系统把它整合在一起,但我希望有一个内部的方法来做到这一点。我有以下测试:

@BeforeClass
void beforeClass()
{
  log.debug("Before class")
  AssertUtils.assertIs(false, true)
}

@Test
void testA()
{
  log.debug("I'm a test :-) ")
}
现在,当我们在before类中遇到异常时,将跳过测试。我们跳过了OnConfiguration Failure并注意到这一点。遗憾的是,testA从未注册过,所以我有0个通过,0个跳过,0个失败。由于0次失败,我们的测试系统将此套件标记为通过

有趣的是,如果调用testContext.getSkippedTests(),我可以看到跳过的方法,但这并不是冒泡出来的。我实际上想把那个测试标记为实际失败


我正在使用testng 6.14.3(尝试了7.0.0-beta7,但我认为这需要在某个地方进行代码更改)和intelliJ 2019.1.3。感谢您的建议:-)

我使用的是最新发布的TestNG版本(
7.0.0-beta7

下面是一个TestNG侦听器,演示了如何执行此操作:

import java.util.HashMap;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
导入java.util.stream.collector;
导入org.testng.IReporter;
导入org.testng.IResultMap;
导入org.testng.ISuite;
导入org.testng.ITestContext;
导入org.testng.ITestListener;
导入org.testng.ITestNGMethod;
导入org.testng.ITestResult;
导入org.testng.xml.XmlSuite;
公共类SkipDetector实现ITestListener、IReporter{
私有最终映射失败=新HashMap();
private final Map skips=new HashMap();
映射getFailures(){
返回失败;
}
映射getSkips(){
返回跳过;
}
@凌驾
公共void onFinish(ITestContext上下文){
IResultMap skippedTestMap=context.getSkippedTests();
Set toBeMarkedAsFailed=新HashSet();
对于(ITestResult结果:skippedTestMap.getAllResults()){
List skipCause=result.getSkipCausedBy();
if(skipCause.isEmpty()){
继续;
}
配置失败导致的布尔值=
skipCause.stream().anyMatch(iTestNGMethod->!iTestNGMethod.isTest());
如果(由ConfigFailure引起){
toBeMarkedAsFailed.add(结果);
}
}
IResultMap failedTestMap=context.getFailedTests();
toBeMarkedAsFailed.forEach(
iTestResult->failedTestMap.addResult(iTestResult,iTestResult.getMethod());
toBeMarkedAsFailed.forEach(跳过TestMap::removeResult);
}
@凌驾
公共无效生成报告(
列表XML套件、列表套件、字符串输出目录){
溪流套房酒店
.flatMap(iSuite->iSuite.getResults().values().stream())
.collect(收集器.toList())
弗雷奇先生(
结果->{
字符串suiteName=result.getTestContext().getSuite().getName();
字符串testName=result.getTestContext().getName();
ITestContext ctx=result.getTestContext();
计算(失败,suiteName,testName,ctx.getFailedTests().size());
计算(跳过,suiteName,testName,ctx.getSkippedTests().size());
});
}
私有静态无效计算(
映射outerMap、字符串suiteName、字符串testName、int值){
Map innerMap=outerMap.computeIfAbsent(suiteName,s->new HashMap());
putIfAbsent(testName,value);
outerMap.put(suiteName,innerMap);
}
}
下面是一个使用上述侦听器的演示测试类

import java.lang.reflect.Method;
导入org.testng.annotations.BeforeMethod;
导入org.testng.annotations.Test;
公共类SampleTestClass{
@预处理法
方法之前的公共无效(方法){
Test=method.getAnnotation(Test.class);
if(test.description().equalsIgnoreCase(“failme”)){
抛出新的RuntimeException(“模拟配置失败”);
}
}
@测试(description=“failMe”)
public void test1(){}
@试验
公共无效测试2(){
抛出新的RuntimeException(“模拟失败”);
}
@测试(dependsOnMethods=“test2”)
public void test3(){}
}
下面是一个测试运行程序,它使用上述演示类和侦听器并断言期望值(将由于配置失败而跳过的测试标记为失败测试)

import java.util.Map;
导入org.assertj.core.api.Assertions;
导入org.testng.testng;
导入org.testng.annotations.Test;
导入org.testng.xml.XmlSuite.FailurePolicy;
公共类LocalTestRunner{
@试验
公共void testMethod(){
TestNG TestNG=新的TestNG();
setTestClass(新类[]{SampleTestClass.Class});
SkipDetector检测器=新SkipDetector();
testng.addListener(检测器);
testng.setVerbose(2);
testng.setConfigFailurePolicy(FailurePolicy.CONTINUE);
testng.run();
for(映射每小时:detector.getSkips().values()){
assertThat(eachOuter.values()).containsExactly(0);
}
for(映射每小时:detector.getFailures().values()){
//我们有3个,因为test3()有2个被跳过的原因。
//其上游方法即test2()失败
//它的beforeMethod配置从未运行过,因此可以认为是失败的
//TestNG只是找到了第一个原因,在本例中是配置失败
//因此,它的状态也会变为失败,即使它已被跳过。
assertThat(eachOuter.values()).containsExactly(3);
}
}
}