Java 关于 testng 的乱序问题求问

roc · 2019年07月16日 · 最后由 arrow 回复于 2019年07月17日 · 1898 次阅读

最近因为想把在运行测试类后跟着执行对本地报告压缩并发送邮件。
想了一下对本地报告的压缩与邮件发送方法不能写在测试类中(testng 的@after

于是准备在 testng.xml 里将两个类(测试类,测试后执行类)排序运行
结果发现我在 testng 中不管怎么编组,更改方法名(数字/字母),加 @ 标签
都不能实现在测试类中所有@Test方法按顺序执行 + 执行完测试类后执行 另一个 class

于是我试了一下,简单的写了一个例子
1.首先是我的测试类例子

public class testNGxmlTest {

    @BeforeClass
    public void before() {
        WebBase.textPrint("前置方法");
    }

    @AfterTest
    public void after() {
        WebBase.textPrint("后置方法");
    }

    @Test(priority=1, groups="1")
    public void test01() {
        WebBase.textPrint("测试1");
    }

    @Test(priority=2, groups="1")
    void test02() {
        WebBase.textPrint("测试2");
    }

    @Test(priority=3, groups="1")
    void test03() {
        WebBase.textPrint("测试3");
    }

    @Test(priority=4, groups="1")
    void test04() {
        WebBase.textPrint("测试4");
    }

    @Test(priority=5, groups="1")
    void test05() {
        WebBase.textPrint("测试5");
    }

    @Test(priority=6, groups="1")
    void test06() {
        WebBase.textPrint("测试6");
    }
}

这里面我已经对方法名和 @ 标签都进行了序号编组

2.接下来是第二个测试后执行类,这个没什么可以看的

public class AfterTest extends CompressZip{

    @Test(description = "执行报告压缩与邮件发送",priority=1,dependsOnGroups= {"1"})
    public static void afterTestAction() throws Exception {

        CompressZip.zipReport();
        WebBase.textPrint("=======压缩包制作完成=======");
        DeleteFile.showDir(FilePath);
        SendEmail.reprotMail();
        WebBase.textPrint("********邮件发送成功********");
        DeleteFile.deleteDir(FilePath);
        WebBase.textPrint("########压缩包删除成功########");
    }
}

3.接下来是我的 testng.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<suite name="test" parallel="true">
    <test name="EnmoTechAutoTest" preserver-order="true">
        <classes preserver-order="true">
            <class name="com.testProject.testNGxmlTest" />
                        <class name="com.method.AfterTest" />
        </classes>
        <testFailureIgnore>true</testFailureIgnore>
        <listeners>
            <!--监听 -->  /
            <listener class-name="org.uncommons.reportng.HTMLReporter" />
            <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
            <listener class-name="com.method.TestNgLinsence" />
        </listeners>
    </test> 
</suite> <

我已经添加了 坛子里大佬写的 监听类,就不贴了,直接用的
4.接下啦是我运行结果

上图是输出 log 信息
红框 log 信息是第一个测试类的输出
绿框 log 信息是第二个测试后执行类的输出

可以看到在第一个类还没有执行完的情况下就执行了第二个类
而且第一个类其中的方法经过各种排序 + 加标签 + 各种操作依然是打乱运行。

共收到 4 条回复 时间 点赞

parallel="true"了 class 必然会并行运行
至于一个 class 内部的 test,要么自己重新实现一下框架的接口来搞,要么就老实用 dependsOn

roc #2 · 2019年07月16日 Author
槽神 回复

目前有个问题就是 测试类中写了@before @after @test标签的类,而应该在第一个类所有方法执行完之后才会导出报告,此时才开始执行压缩报告与发送邮件的第二个类中的方法,但是如果第二个类中的方法如果也加上@test标签,那么运行时会被算在第一个类的@after执行前执行。我分 Group 后给第二个类的方法加上了 dependsonGroup 第一个类的 group 以及 dependonMetHod 第一个类的@after都不能正确执行

第二个类看起来就是一个公用的操作,写到 AfterTest 里面不就好了吗,也不用加@Test

你不应该用 AfterTest,应该用 ITestNGListener ,实现 onFinish 方法。

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