最近因为想把在运行测试类后跟着执行对本地报告压缩并发送邮件。
想了一下对本地报告的压缩与邮件发送方法不能写在测试类中(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 信息是第二个测试后执行类的输出
可以看到在第一个类还没有执行完的情况下就执行了第二个类
而且第一个类其中的方法经过各种排序 + 加标签 + 各种操作依然是打乱运行。