其他测试框架 TestNG 报告定制最简单的原理

simonpatrick · 2015年10月16日 · 最后由 Unmurphy 回复于 2016年07月27日 · 2428 次阅读

看到有人发个帖子,关于如果定制 TESTNG 报告的,我自己实现过一个自定义的简单报告,所以也就顺便谈谈。

如果需要定制 TestNG 的测试报告,可以先想一下首先需要什么的数据,其实最简单的数据就是测试用例成功失败的数据,
那么实际上 TestNG 提供了 ITestListener 的接口可以让你获取这些测试数据.
同时 IReporter 接口可以让用户在调用最后自己生成测试报告.

所以其实只要用一个类实现 ITestListener,IReporter 就可以了.

ITestListener,IReporter 实现

一下是我一个最简单的实现, 实际上 TestNG 开放出来的这些监听器,主要是让你可以获取 TestNG 测试容器中运行测试的数据,上下文.
关于代码里面的 ITestResult, xmlSuites,suites 可以自行查找

public class TestNGSimpleReport implements ITestListener, IReporter {
    private List<String> testPassed = Lists.newArrayList();
    private List<String> testFailed = Lists.newArrayList();
    private List<String> testSkipped = Lists.newArrayList();

    @Override
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites,
                               String outputDirectory) {
        System.out.println("Passed Case: " + testPassed.size());
        System.out.println("testFailed Case: " + testFailed.size());
        System.out.println("testSkipped Case: " + testSkipped.size());

        for (String passed : testPassed) {
            System.out.println("passed case:" + passed);
        }
        for (String passed : testFailed) {
            System.out.println("failed case:" + passed);
        }

        for (String passed : testSkipped) {
            System.out.println("skipped case:" + passed);
        }

    }

    @Override
    public void onTestStart(ITestResult result) {

    }

    @Override
    public void onTestSuccess(ITestResult result) {
        testPassed.add(result.getMethod().getMethodName());
    }

    @Override
    public void onTestFailure(ITestResult result) {
        testFailed.add(result.getMethod().getMethodName());
    }

    @Override
    public void onTestSkipped(ITestResult result) {
        testSkipped.add(result.getMethod().getMethodName());
    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }

    @Override
    public void onStart(ITestContext context) {

    }

    @Override
    public void onFinish(ITestContext context) {

    }
}

编写 TestNG 的测试

public class TestNGTest {

    @Test
    public void test_pass(){
        System.out.println("passed_case");
    }

    @Test
    public void test_failed(){
        Assert.assertTrue(false);
    }

    @Test
    public void test_pass_2(){
        System.out.println("passed_case_2");
    }
}

将监听器放入 Testng.xml 文件

<suite name="SimpleReport">
    <listeners>
        <listener class-name="com.hedwig.testng.TestNGSimpleReport"/>
    </listeners>
    <test verbose="1" name="simple test" >
        <classes>
            <class name="com.hedwig.testng.TestNGTest"/>
        </classes>
    </test>

</suite> 

运行 Testng.xml 文件,查看结果

结果如下,是不是很简单? 如果想做的 cool 一点,可以将这些数据写到一个 html 模版,写入文件就可以了

===============================================
SimpleReport
Total tests run: 3, Failures: 1, Skips: 0
===============================================

Passed Case: 2
testFailed Case: 1
testSkipped Case: 0
passed case:test_pass
passed case:test_pass_2
failed case:test_failed
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

我有一个疑问:
比如说我在一个@test下面 需要套 二层循环 ,我如何监听第二层循环里面每一次执行的状态是 pass 还 error?

不是太明白你说的二层嵌套指的是什么?你是说你在类级别上面注解了@Test,然后在方法级别再注解@Test吗?或者你说的是 Assert 的状态?

我想问下,Testng 是针对 java 的,c# 中 有和 Testng 类似的测试框架吗?支持并行测试

#3 楼 @kim_wu 不知道 Nunit 这个测试框架是否满足你的要求

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册