Java 如果跳过测试(因为dependsOnGroups),则ITest.getTestName()返回null
我想做什么 我正在尝试生成一个自定义测试报告,其中显示一个自定义测试名称。我通过实现“ITest策略”来实现这一点,您可以覆盖Java 如果跳过测试(因为dependsOnGroups),则ITest.getTestName()返回null,java,testng,Java,Testng,我想做什么 我正在尝试生成一个自定义测试报告,其中显示一个自定义测试名称。我通过实现“ITest策略”来实现这一点,您可以覆盖getTestName()方法来提供自己的策略 在我的报告中,我有方法名(来自.getMethodName(),例如testIfStatusCodeIs200)和测试名(来自.getTestName()),我自定义了它,并返回例如测试端点:http://cakeAPI/api/cakes/cakeId) 代码的外观如何 public class BaseTest impl
getTestName()
方法来提供自己的策略
在我的报告中,我有方法名(来自.getMethodName()
,例如testIfStatusCodeIs200
)和测试名(来自.getTestName()
),我自定义了它,并返回例如测试端点:http://cakeAPI/api/cakes/cakeId
)
代码的外观如何
public class BaseTest implements ITest {
private String uri = null;
public BaseTest(String uri) {
this.uri = uri;
}
@Test (groups = { "myGroup" })
public void test1() {
// do something
}
@Test (dependsOnGroups = { "myGroup"})
public void test2() {
// do something
}
public String getTestName() {
return uri;
}
}
这是报表生成器逻辑。这是一个相当大的函数,其中大部分用于附加和写入HTML文件,因此我自愿删除一些我认为对问题不重要的部分:
public class CustomTestNGReporter implements IReporter {
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
try {
// Create test methods summary data.
String customTestMethodSummary = this.getTestMehodSummary(suites);
//... Append results to html
} catch (Exception ex) {
ex.printStackTrace();
}
}
/* Get test method summary info. */
private String getTestMehodSummary(List<ISuite> suites) {
try {
for (ISuite tempSuite : suites) {
Map<String, ISuiteResult> testResults = tempSuite.getResults();
for (ISuiteResult result : testResults.values()) {
ITestContext testObj = result.getTestContext();
/* Get failed test method related data. */
IResultMap testFailedResult = testObj.getFailedTests();
String failedTestMethodInfo = this.getTestMethodReport(testFailedResult);
/* Get skipped test method related data. */
IResultMap testSkippedResult = testObj.getSkippedTests();
String skippedTestMethodInfo = this.getTestMethodReport(testSkippedResult);
/* Get passed test method related data. */
IResultMap testPassedResult = testObj.getPassedTests();
String passedTestMethodInfo = this.getTestMethodReport(testPassedResult);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
/* Get failed, passed or skipped test methods report. */
private String getTestMethodReport(IResultMap testResultMap) {
Set<ITestResult> testResultSet = testResultMap.getAllResults();
for (ITestResult testResult : testResultSet) {
String testURI = testResult.getTestName();
System.out.println(testURI); // null for skipped tests
}
return null;
}
公共类CustomTestNGReporter实现IReporter{
公共void生成器报告(列表xmlSuites、列表suites、字符串输出目录){
试一试{
//创建测试方法摘要数据。
String customTestMethodSummary=this.GetTestMethodSummary(套件);
//…将结果附加到html
}捕获(例外情况除外){
例如printStackTrace();
}
}
/*获取测试方法摘要信息*/
私有字符串getTestMehodSummary(列表套件){
试一试{
适用于(ISuite临时套件:套件){
Map testResults=tempSuite.getResults();
for(ISuiteResult结果:testResults.values()){
ITestContext testObj=result.getTestContext();
/*获取失败的测试方法相关数据*/
IResultMap testFailedResult=testObj.getFailedTests();
String failedTestMethodInfo=this.getTestMethodReport(testFailedResult);
/*获取跳过的测试方法相关数据*/
IResultMap testSkippedResult=testObj.getSkippedTests();
String skippedTestMethodInfo=this.getTestMethodReport(testSkippedResult);
/*通过测试方法相关数据*/
IResultMap testPassedResult=testObj.getPassedTests();
String passedTestMethodInfo=this.getTestMethodReport(testPassedResult);
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
}
/*获取失败、通过或跳过的测试方法报告*/
私有字符串getTestMethodReport(IResultMap testResultMap){
设置testResultSet=testResultMap.getAllResults();
for(ITestResult testResult:testResultSet){
字符串testURI=testResult.getTestName();
System.out.println(testURI);//跳过的测试为null
}
返回null;
}
问题出在哪里
问题是如果test1()
失败,则跳过test2()
,在本例中getTestName()
fortest2
似乎返回null
例如,如果testIfStatusCodeIs200
的测试失败,那么我将跳过testIfResponseHas10Elements
。与testIfStatusCodeIs200
关联的测试名称将返回自定义测试名称,testIfResponseHas10Elements
的测试名称将返回null
是否有一种方法可以“强制”
getTestName()
进行评估,即使跳过了测试?如果使用最新发布的TestNG版本(6.14.3),您将不会看到任何空值。相反,您至少会得到实际的@test
注释的方法名
我已经提交了一个bug,以确保如果在测试类中有可用的ITest
实现,那么TestNG应该始终检索该实现,即使对于跳过的方法也是如此
您可以在此处跟踪问题:
该修复程序应在即将发布的TestNG版本中提供,即7.0.0
您可以将自己添加为上述问题的观察者来跟踪它。也许我只是个盲人,但我看不到
ITest
和ITestResult
之间的关系。您能提供更多信息吗?更新了报告代码,以便更清楚地了解ITestResult的来源。这有帮助吗?尽管如此,关系仍然是ITest和ITestResult之间的p对我来说也不清楚。我发现这是关于ITestResult.getTestName()
:“如果此结果的相关实例实现了ITest或使用@Test(testName=…),则返回其测试名称,否则返回null。”是否尝试了testResult.getMethod().getMethodName();
?是的,我确实使用了.getMethodName()
,以检索方法名称。但是,据我所知,.getMethodName()
不能被“覆盖”,因为它将使我返回实际的方法名称,并且我无法自定义它。在我的报告中,我有方法名称(来自.getMethodName()
,例如testIfStatusCodeIs200
)和测试名称(例如,http://cakeAPI/api/cakes/cakeId
)。测试名称是定制的,用于返回正在测试的端点url。