使用TestNG框架搭建自动化测试框架
前言
开发过程中,每次发布前,对于变更内容我们能做到新功能的验证,但是如果项目体量较大时,我们可能无法评估到发布变更内容对之前代码的影响。如果让测试同学全量回归所需时间较长,那么如何简化这部分内容,一键做到验证本次变更对项目的影响。一方面是自动化测试用例,另一方面就是一个合适的测试框架了。
一、TestNG框架是如何执行的?
二、设计这个功能我们需要考虑的问题
1.如何去读取资源文件
public static List<XmlSuite> getAllXmlSuites() throws IOException {
String path = "resource文件夹中配置文件的相对路径";
List<XmlSuite> suites = new ArrayList();
//获取配置文件的输入流
InputStream resourceAsStream = TestNgTest.class.getClassLoader().getResourceAsStream(path);
//解析配置文件中的内容
suites.addAll(new Parser(resourceAsStream).parse());
return suites;
}
2.执行
代码如下(示例):
TestNG testNG = new TestNG();
//填充获取到的用例信息
testNG.setXmlSuites(suites);
testNG.run();
3.优化点
- (文件级别过滤)可以配置多个不同的资源文件,例如不同环境,不同租户,不同模块等。通过枚举维护资源文件的地址,根据匹配到的枚举获取到配置的资源文件列表。从文件级别去筛选。
- (方法级别过滤)当我们获取到所有的xmlSuite对象后,可以通过获取Test对象,Test对象中又包含了类对象信息,类对象信息中包含了方法信息,最终可以根据传入的方法名称取匹配执行哪些具体的自动化用例。
- 资源文件的整体结构如下
<suite name="My suite" parallel="tests" thread-count="1">
<!--为某个类传参数,指定方法可用此参数-->
<test name="sop">
<classes>
<class name="com.demo.test">
<parameter name="name" value="123"/>
<method>
<include name="test"/>
</method>>
</class>>
</classes>
</test>
</suite>
4.具体对应到Test类中,写法如下,可以获取到配置的name的值
@Parameters({"name"})
public void test(String name) {
System.out.println(123);
}
4.TestNG切面
TestNG的切面和JAVA中的切面使用稍微有些不同,他是直接定义一个类继承IHookable接口,重写run方法。执行每一个XmlSuite中的方法时,都会先进入到这个切面中,我们可以在切面中记录方法执行的信息,方法执行的时间,以及方法执行异常捕获等。通过调用IHookCallBack.runTestMethod()方法可以继续执行用例。
总结
通过以上内容,我们可以通过一个接口来执行某个模块,某个环境所有配置的自动化用例,并可以通过开发前端页面来展示用例的执行情况,用例执行耗时,失败用例的错误信息,重跑所有的失败用例等功能。