【自动化测试实战】从 0 到 1 搭建 Dubbo 接口自动化测试

news/2025/2/16 3:24:21/

前言

1、Dubbo 接口自动化测试框架实现逻辑

2、框架具体功能

3、关键实践

3.1 下载 provider 的 jar 包,并代理声明 +zookeeper 设置

3.2 邮件发送功能

3.3 封装 Dubbo 接口信息类

3.4 利用 JMeter 调用 provider 服务,并断言,邮件报警

3.5 利用 Testng 注释,调用 Dubbo 接口类,进行测试

4、利用 Jenkins 自动化运行 Dubbo 测试项目

软件测试面试小程序


前言

由于公司 Dubbo 接口数量较多,且核心接口较多,故需要一套 Dubbo 接口自动化框架,来提高测试效率。

1、Dubbo 接口自动化测试框架实现逻辑

2、框架具体功能

框架需要
实现功能

功能说明当前版本是否已实现从 maven 库自动下载所需 jar 包为了更好的自动化,所有的 provider 的 jar 都从 maven 下载,避免手工导入已实现参数自定义匹配不同的 Dubbo 接口,不同的参数需求已实现断言功能一个接口是否调用成功,在于断言是否成功已实现邮件报警功能如果 Dubbo 接口调用 provider 失败,自动进行邮件报警已实现自动运行利用 jenkins 自动运行已实现

3、关键实践

由于目前阶段刚接触 java 及 Dubbo,本次实现为基本功能实现,数据隔离等没有做。

3.1 下载 provider 的 jar 包,并代理声明 +zookeeper 设置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:Dubbo="http://code.alibabatech.com/schema/Dubbo"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/Dubbohttp://code.alibabatech.com/schema/Dubbo/Dubbo.xsd"><Dubbo:application name="demo-consumer"/><Dubbo:registry address="zookeeper://1127.0.0.1:2181" /><Dubbo:reference id="IPromiseForOrderService" interface="com.test.api.IPromiseForOrderService" version="1.0" check="true"/>
</beans>

3.2 邮件发送功能

(1)邮件服务器配置在 mailConfig.properties


(2)获取 mailconfig 信息,并封装成类

public class MailConfig {private static final String PROPERTIES_DEFAULT = "mailConfig.properties";public static String host;public static Integer port;public static String userName;public static String passWord;public static String emailForm;public static String timeout;public static String personal;public static Properties properties;static{init();}/*** 初始化*/private static void init() {properties = new Properties();InputStream inputStream = null;try{inputStream = MailConfig.class.getClassLoader().getResourceAsStream(PROPERTIES_DEFAULT);properties.load(inputStream);inputStream.close();host = properties.getProperty("mailHost");port = Integer.parseInt(properties.getProperty("mailPort"));userName = properties.getProperty("mailUsername");passWord = properties.getProperty("mailPassword");emailForm = properties.getProperty("mailFrom");timeout = properties.getProperty("mailTimeout");personal = " 自动化测试 ";} catch(IOException e){e.printStackTrace();}}
}

(3)封装发送邮件功能

public class MailUtil {private static final String HOST = MailConfig.host;private static final Integer PORT = MailConfig.port;private static final String USERNAME = MailConfig.userName;private static final String PASSWORD = MailConfig.passWord;private static final String emailForm = MailConfig.emailForm;private static final String timeout = MailConfig.timeout;private static final String personal = MailConfig.personal;private static JavaMailSenderImpl mailSender = createMailSender();/*** 邮件发送器** @return 配置好的工具*/private static JavaMailSenderImpl createMailSender() {JavaMailSenderImpl sender = new JavaMailSenderImpl();sender.setHost(HOST);sender.setPort(PORT);sender.setUsername(USERNAME);sender.setPassword(PASSWORD);sender.setDefaultEncoding("Utf-8");Properties p = new Properties();p.setProperty("mail.smtp.timeout", timeout);p.setProperty("mail.smtp.auth", "false");sender.setJavaMailProperties(p);return sender;}/*** 发送邮件** @param to 接受人* @param subject 主题* @param html 发送内容* @throws MessagingException 异常* @throws UnsupportedEncodingException 异常*/public void sendMail(InternetAddress[] to, String subject, String html) throws MessagingException,UnsupportedEncodingException {MimeMessage mimeMessage = mailSender.createMimeMessage();// 设置 utf-8 或 GBK 编码,否则邮件会有乱码MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");messageHelper.setFrom(emailForm, personal);messageHelper.setTo(to);messageHelper.setSubject(subject);messageHelper.setText(html, false);mailSender.send(mimeMessage);}
}

3.3 封装 Dubbo 接口信息类

把 Dubbo 接口封装成一个类,方便信息 get 和 set

public class DubboInterfaceInfo {private String DubboInterfaceWiki;private String DubboInterfacePacketName;private String DubboInterfaceClassName;private RestRequest request;private String responseStatusSuccessful;private String responseMessageSuccessful;private String DubboInterfaceId;public DubboInterfaceInfo() {}public String getDubboInterfaceWiki() {return this.DubboInterfaceWiki;}public void setDubboInterfaceWiki(String DubboInterfaceWiki) {this.DubboInterfaceWiki = DubboInterfaceWiki;}public String getDubboInterfacePacketName() {return this.DubboInterfacePacketName;}public void setDubboInterfacePacketName(String DubboInterfacePacketName) {this.DubboInterfacePacketName = DubboInterfacePacketName;}public String getDubboInterfaceClassName() {return this.DubboInterfaceClassName;}public void setDubboInterfaceClassName(String DubboInterfaceClassName) {this.DubboInterfaceClassName = DubboInterfaceClassName;}public RestRequest getRestRequest() {return this.request;}public void setRestRequest(RestRequest request) {this.request = request;}public String getResponseStatusSuccessful() {return this.responseStatusSuccessful;}public void setResponseStatusSuccessful(String responseStatusSuccessful) {this.responseStatusSuccessful = responseStatusSuccessful;}public String getResponseMessageSuccessful() {return this.responseMessageSuccessful;}public void setResponseMessageSuccessful(String responseMessageSuccessful) {this.responseMessageSuccessful = responseMessageSuccessful;}public String getDubboInterfaceId() {return this.DubboInterfaceId;}public void setDubboInterfaceId(String DubboInterfaceId) {this.DubboInterfaceId = DubboInterfaceId;}
}

3.4 利用 JMeter 调用 provider 服务,并断言,邮件报警

利用 Jmeter 调用 provider 服务,并断言,邮件报警,这些功能封装成 Dubbo 接口测试类,代码如下:

public class IPromiseForOrderServiceTest extends AbstractJavaSamplerClient {/*** CONTEXT* 读取 Dubbo-config.xml 中的内容*/private static final ApplicationContext CONTEXT = new ClassPathXmlApplicationContext("Dubbo-config.xml");public DubboInterfaceInfo DubboInterfaceInfo = new DubboInterfaceInfo();public String responseSuccess;public String responseFail;public FreeStockForOrderParam request;/*** IPromiseForOrderService* 此处需要实例化 Dubbo 接口 IPromiseForOrderService,像定义变量一样实例化*/private static IPromiseForOrderService IPromiseForOrderService;/*** IPromiseForOrderService* 以下方法用于 输入 Dubbo 接口信息*/public void DubboInterfaceInfoInitialization () {DubboInterfaceInfo.setDubboInterfaceWiki("......");DubboInterfaceInfo.setDubboInterfacePacketName("......");DubboInterfaceInfo.setDubboInterfaceClassName("......");DubboInterfaceInfo.setDubboInterfaceId("......");DubboInterfaceInfo.setResponseStatusSuccessful("0");DubboInterfaceInfo.setResponseMessageSuccessful("success");String orderNo = "orderNo";String operater="";String channel="";String operateId="operateId";String version= PromiseVersion.V_1_0_0.getVersion();request = new FreeStockForOrderParam();if (orderNo != null || orderNo.length() > 0) {request.setOrderNo(orderNo);}if (operater != null || operater.length() > 0) {request.setOperater(operater);}if (channel != null || channel.length() > 0) {request.setChannel(channel);}if (operateId != null || operateId.length() > 0) {request.setOperateId(operateId);}if (version != null || version.length() > 0) {request.setVersion(version);}RestRequest<FreeStockForOrderParam> req = new RestRequest<FreeStockForOrderParam>();req.setRequest(request);DubboInterfaceInfo.setRestRequest(req);}@Overridepublic void setupTest(JavaSamplerContext arg0){IPromiseForOrderService=(IPromiseForOrderService)CONTEXT.getBean("......");}@Overridepublic SampleResult runTest(JavaSamplerContext javaSamplerContext) {SampleResult sr = new SampleResult();try {sr.sampleStart();RestResponse responseData = IPromiseForOrderService.freeSaleStock(DubboInterfaceInfo.getRestRequest());
// 自定义 Dubbo 调用成功和失败的邮件正文内容responseSuccess ="Dubbo 接口: "+ DubboInterfaceInfo.getDubboInterfaceId() + " 请求成功\r\n"+ "WIKI 地址: " + DubboInterfaceInfo.getDubboInterfaceWiki() + "\r\n"+ "PacketName: " + DubboInterfaceInfo.getDubboInterfacePacketName() + "\r\n"+ "ClassName: " + DubboInterfaceInfo.getDubboInterfaceClassName() + "\r\n";responseFail ="Dubbo 接口: " + DubboInterfaceInfo.getDubboInterfaceId() + " 请求失败\r\n"+ "WIKI 地址: " + DubboInterfaceInfo.getDubboInterfaceWiki() + "\r\n"+ "PacketName: " + DubboInterfaceInfo.getDubboInterfacePacketName() + "\r\n"+ "ClassName" + DubboInterfaceInfo.getDubboInterfaceClassName() + "\r\n"+ " 请求参数为:Channel: " + request.getChannel() +" / operater: " + request.getOperater() +" / OperateId: " + request.getOperateId() +" / OrderNo: " + request.getOrderNo() +" / Version: " + request.getVersion()+ "\r\n"+ " 返回结果为:"+ "ResponseStatus: " + responseData.getStatus()+ " / ResponseMessage: " + responseData.getMessage()+ " / ResponseResult: " + responseData.getResult();/*** 邮件定义及发送*/InternetAddress[] address = new InternetAddress[2];try {address[0] = new InternetAddress("lalllalala@qq.com");address[1] = new InternetAddress("3456789@qq.com");} catch (AddressException e) {// TODO Auto-generated catch blocke.printStackTrace();}MailUtil mailUtil = new MailUtil();if ((DubboInterfaceInfo.getResponseStatusSuccessful().equals(responseData.getStatus())) && (DubboInterfaceInfo.getResponseMessageSuccessful().equals(responseData.getMessage()))) {sr.setSuccessful(true);sr.setResponseData("responseData: " + responseData, "utf-8");System.out.println(responseSuccess);mailUtil.sendMail(address,"Dubbo 接口:" + DubboInterfaceInfo.getDubboInterfaceId() + " 请求成功 ",responseSuccess.toString());} else {sr.setSuccessful(false);System.out.println(responseFail);mailUtil.sendMail(address,"Dubbo 接口:" + DubboInterfaceInfo.getDubboInterfaceId() + " 请求失败 ",responseFail.toString());}sr.sampleEnd();} catch (Exception e) {e.printStackTrace();}return sr;}}

3.5 利用 Testng 注释,调用 Dubbo 接口类,进行测试

public class TestngTest {@Test()public void testDubboInterface() {JavaSamplerContext arg0 = new JavaSamplerContext(new Arguments());Dubbo 接口测试类 TestForIPromiseForOrderService = new Dubbo 接口测试类 ();TestForIPromiseForOrderService.DubboInterfaceInfoInitialization();TestForIPromiseForOrderService.setupTest(arg0);SampleResult sr = TestForIPromiseForOrderService.runTest(arg0);}
}

4、利用 Jenkins 自动化运行 Dubbo 测试项目

至此,大功告成,你可以完成 Dubbo 接口自动化测试了。另,接下来可以加入关联、测试数据分离等功能,让框架变得更加易用。

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

加入我的软件测试交流群:110685036免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

获取方式 :


http://www.ppmy.cn/news/189866.html

相关文章

【Unity3D】高斯模糊特效

1 高斯模糊原理 边缘检测特效中使用了卷积运算进行了边缘检测&#xff0c;本文实现的高斯模糊特效同样使用了卷积运算&#xff0c;关于卷积核和卷积运算的概念&#xff0c;读者可以参考边缘检测特效。 本文完整资源见→Unity3D高斯模糊特效。 我们将用于模糊处理的卷积核称为模…

scrcpy: 在电脑上使用Android手机

文章目录 1. 目的2. 配置2.0 配置思路2.1 安装 scrcpy 2.02.2 添加 udev 规则2.3 手机设置权限2.4 开启 scrcpy 1. 目的 打算在电脑上使用手机上的 App&#xff0c;如京东读书&#xff0c;或QQ。不用电脑版对应软件的原因是&#xff0c;电脑上需要重新登录&#xff0c;有些软件…

代码随想录算法训练营第三天 | 203.移除链表元素,707.设计链表,206.反转链表

203. 移除链表元素 正确运行的代码如下&#xff1a; truct ListNode* removeElements(struct ListNode* head, int val){while (head && head->val val){head head->next;}struct ListNode * cur head;while (cur && cur->next){// printf("…

dhcp服务器自动分配地址思科,思科服务器配置dhcp服务器方法

因为现在生活中网络的流行以及广泛的使用&#xff0c;但企业和学校都会配备思科服务器&#xff0c;因为在配备了服务器之后&#xff0c;可以让不论在什么地方的电脑&#xff0c;只要连接上局域网之后&#xff0c;就可以通过自动获取Ip地址的方式获取Ip地址网关&#xff0c;这样…

思科FTP服务器基本配置

思科FTP服务器基本配置 参赛话题&#xff1a;学习笔记https://activity.csdn.net/creatActivity?id10213 ​ 目录 一、准备TFTP服务器 二、备份IOS 三、从TFTP升级IOS 四、备份配置文件到TFTP服务器 五、从TFTP下载配置文件 一、准备TFTP服务器 Router# ping tftp_addres…

思科服务器dns配置文件,思科完成dns服务器配置

思科完成dns服务器配置 内容精选 换一换 云速建站支持以下三种情况的域名解析:您在华为云购买域名,使用华为云解析服务。您在第三方购买域名,使用华为云解析服务。您可以通过云速建站域名配置助手或者手动操作完成域名的解析和绑定,推荐使用云速建站域名配置助手,由云速建…

cisco在服务器编辑首页信息,cisco设置

cisco路由向来以难配置而绝不天下。那么cisco怎么设置vlan ip?秋天网 Qiutian.ZqNF.Com小编整理了相关资料&#xff0c;给大家介绍。有需要学习的同学可参考参考。 cisco设置vlan ip步骤 1.注意事项 1.1.交换机启动需要大约4-5分钟; 1.2.网线插入交换机接口从黄变为绿需要大约…

cisco服务器设置步骤_设置您自己的邮件服务器的10个步骤

cisco服务器设置步骤 A simple guide to setup your own mail server using MailCow, DigitalOcean and Docker 使用MailCow,DigitalOcean和Docker设置自己的邮件服务器的简单指南 Setting a mail server is easy and hard at the same time. What an irony! Let’s begin wi…