由于大多数公司都是使用Java作为后端开发语言,因此为了更好的与研发的框架对接、测试,掌握一套Java的自动化测试框架也逐渐成为测试人员的必修课。
同时随着现在微服务框架的流行,自动化测试框架除了支持传统的http接口之外,各系统微服务间的RPC接口的自动化测试需求也越来越旺盛。本篇文章主要介绍基于springboot的支持http接口+dubbo接口的TestNG自动化测试框架。
欢迎关注我的微信公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享全栈测试知识干货,你的支持就是作者更新最大的动力~
项目整体采用springboot框架,首先来看框架的整体结构图:
使用Json文件作为case的数据驱动,Json文件中包含了接口的基础信息、入参信息、期望结果信息:
TestDataJson文件:
{
"dataItem": [
{
"id": "createActivity-1",
"name": "创建活动",
"desc": "创建活动",
"isRun": "Y",
"url":"https://testxxxx.com/add",
"parameters": {
"name": "自动化测试活动"
},
"expectData": {
"code": "0000",
"result": "成功",
}
}
]
}
使用testNG框架作为测试用例调度框架,TestCase类:
public class serviceTest extends BaseCase {
//测试Json文件读取效果
@Test(dataProvider = "TaskServiceData" ,dataProviderClass = TaskServiceDataProvider.class)
public void testData(ParamOB paramOB) throws TaskRemoteException {
System.out.println(paramOB.toString());
Reporter.log("获取Json文件入参为:"+paramOB.toString());
}
}
BaseCase类:
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
@SpringBootTest
public class BaseCase extends AbstractTestNGSpringContextTests {
}
BaseCase类的作用:继承AbstractTestNGSpringContextTests, AbstractTestNGSpringContextTests这个类的作用:测试类只有继承了该类才拥有注入实例的能力。
同时BaseCase添加了@SpringBootTest注解,Spring将加载所有被管理的bean。不然测试类注入bean时会报空指针。
使用okhttp3工具包调用,OkHttpUtils类:
public String okHttpPost(HashMap requestBody, String url, String cookieValue){
// 设置接口调用超时时间为60秒
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(60,TimeUnit.SECONDS).build();
// 可以单独把formbody拿出来
FormBody.Builder formBuilder = new FormBody.Builder();
// 将传进来包含的参数键值对的map集合遍历出来
for (Object o : requestBody.keySet()) {
// 将参数添加到frombody中
formBuilder.add(o.toString(), String.valueOf(requestBody.get(o.toString())));
}
// 将frombody初始化到request对象中然后拿去请求
RequestBody body = formBuilder.build();
Request request = new Request.Builder()
.url(url)
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Cookie", cookieValue)
.build();
try {
Response response = client.newCall(request).execute();
String rescontent=response.body().string();
// log.info("-------调用接口:"+url+" 返回---------"+rescontent);
return rescontent;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public String okHttpGet(String url, String cookieValue){
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(60,TimeUnit.SECONDS).build();
Request request = new Request.Builder()
.url(url)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Cookie", cookieValue)
.build();
try {
Response response = client.newCall(request).execute();
String rescontent=response.body().string();
return rescontent;
} catch (IOException e) {
e.printStackTrace();
return null;
}
使用zookeeper+dubbo xml 配置方式调用dubbo接口,application-test.properties配置文件:
dubbo.registry.address=zookeeper://testzk1.xxxx.com:2181
dubbo.application.name=autotest
spring-dubbo-config.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
TestCase类调用dubbo接口:
public class DubboServiceTest extends BaseCase {
@Resource
private TaskDubboService taskDubboService;
@Test(dataProvider = "TaskServiceData" ,dataProviderClass = TaskServiceDataProvider.class,description = "测试dubbo接口")
public void testDubbo(ParamOB paramOB) throws TaskRemoteException {
// 1.获取Json数据中的用例ID、名称、入参、期望结果数据
String param = paramOB.getParams();
String expectData = paramOB.getExpectData();
// 2.转换为对应的参数对象信息
TaskContext taskContext = JSONObject.parseObject(param, TaskContext.class);
Reporter.log("---------接口入参为----------"+ JSONObject.toJSONString(taskContext));
// 3.测试环境正常调用接口
List result = testDubboService.process(taskContext);
String resultStr = JSONObject.toJSONString(result);
Reporter.log("---------testDubboService接口返回为-----------"+resultStr);
//去掉返回结果前后的中括号
String finalResult = StringUtils.strip(resultStr,"[]");
// 4. 转化格式然后调用check方法校验接口返回结果和Json文件中的期望结果数据是否匹配
Map expectDataMap = JSONObject.parseObject(expectData, Map.class);
CommonResultCheck.CommonJsonCheck(finalResult,expectDataMap);
}
}
使用ExtentReports报告框架输出测试报告,testng.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
src>main>java 用于存放一些封装公共方法类和基础类:
CommonResultCheck: 封装结果方法断言类
OkHttpUtil: 封装http请求方法类
DBUtil: 封装数据库操作方法类
AutotestdemoApplication: springboot启动类
src>main>resources 用于存放各类配置文件:
application-test.properties: 配置文件(zookeeper、数据库配置等)
spring-dubbo-config.xml:dubbo配置文件
src>test>java>cases 用于存放测试用例:
systemName文件夹:系统名称文件夹
dataProvider文件夹: 系统的测试数据获取类
testcase文件夹:系统的测试用例类
src>test>java>utils 用于存放公共方法类:
DataProviderUtils: 转换测试数据为DataProvider格式类
ExtendTestNGReporterListenerNew: 测试报告优化类
ParamOB:测试数据对象类
LoginUtil:封装登录方法类
ReadJsonUtil:封装读取Json文件数据方法类
src>test>resources 用于存放测试数据、离线报告样式文件等:
css文件夹: ExtendReport报告的css文件
js文件夹: ExtendReport报告的js文件
font文件夹:ExtendReport报告的字体文件
jsonData文件夹:存放各系统接口Json测试数据
testSuites文件夹: 存放testNG的xml文件用于批量运行
=================================
以上就是本次的全部内容,都看到这里了,如果对你有帮助,麻烦点个赞+收藏+关注,一键三连啦~
程序员杨叔:持续分享全栈测试知识干货。标签:自动化测试、性能测试、Java、Python、DevOps、CI/CD、小程序测试、测试工具、测试开发、测试框架/平台、测试管理…
页面更新:2024-05-06
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号