Java 如果跳过测试(因为dependsOnGroups),则ITest.getTestName()返回null

Java 如果跳过测试(因为dependsOnGroups),则ITest.getTestName()返回null,java,testng,Java,Testng,我想做什么 我正在尝试生成一个自定义测试报告,其中显示一个自定义测试名称。我通过实现“ITest策略”来实现这一点,您可以覆盖getTestName()方法来提供自己的策略 在我的报告中,我有方法名(来自.getMethodName(),例如testIfStatusCodeIs200)和测试名(来自.getTestName()),我自定义了它,并返回例如测试端点:http://cakeAPI/api/cakes/cakeId) 代码的外观如何 public class BaseTest impl

我想做什么

我正在尝试生成一个自定义测试报告,其中显示一个自定义测试名称。我通过实现“ITest策略”来实现这一点,您可以覆盖
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()
for
test2
似乎返回
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。