接口自动化测试框架搭建【附详细搭建视频】

2023-09-14 15:27:05

如果遇到什么问题建议观看下面视频:

【敢称全站第一】B站最全的Python自动化测试深度学习教程!学完即就业,小白也能信手拈来!帮你少走99%的弯路~

一、原理及特点
  参数放在XML文件中进行管理

  用httpClient简单封装一个httpUtils工具类

  测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。

  测试报告这里用到第三方的包ReportNG 项目组织用Maven

二、准备
  使用工具:eclipse,maven

  用到的第三方jar包:dom4j、reportng、testng

  理解难点:httpUtils和xmlUtil工具类的封装;dom4j使用;CookieStore的应用

三、框架构思
1、项目结构

2、用例执行流程

 

3、接口调用流程

 

4、调度脚本流程

 

四、框架实现

1、输入参数

  1.1 参数放在XML文件中进行管理

  例:这里测试获取角色的接口输入参数为,page和rows,mapRole.xml内容如下 

 <?xml version="1.0" encoding="UTF-8"?>
 
  <map>
 
  <bean beanName="GetRole">
 
  <!--Locator lists -->
 
  <locator name="page" value="1"></locator>
 
  <locator name="rows" value="10"></locator>
 
  </bean>
 
  </map>
 
  1.2 封装一个xmlUtil工具类负责读取XML,使用第三方的jar包dom4j
 
  1.2.1 xmlUtil中readXMLDocument方法返回值为HashMap<String, String>
 
  public static HashMap<String, String>  readXMLDocument(String beanName,String xmlName){
 
  }
 
  参数xmlName(xml文件的名字); 参数beanName(xml文件中节点的名称);
 
  1.3 封装一个CookieUtil工具类,通过CookieStore储存cookie
 
  1.3.1 CookieUtil类中setCookieStore方法返回值为CookieStore
 
  public  CookieStore setCookieStore(HttpResponse httpResponse) {
 
  }
 
  1.4 用httpClient简单封装一个httpUtils工具类有get.post,put,delete方法
 
  1.4.1 httpUtils中post封装方法如下:
 
  public CloseableHttpResponse post(String url, Map<String, String> params,CloseableHttpClient httpclient,CookieStore cookieStore){
 
  }

2、返回参数

  2.1 创建一个接口返回对象ResponseBean,

  对象ResponseBean,包括status、statusCode、contentType、body、url、method、cookies

  2.2 在工具类中在创建一个ReponseUtil工具类

  ReponseUtil工具类负责将请求的返回数据CloseableHttpResponse 转换成ResponseBean

  public ResponseBean setResponseBean(CloseableHttpResponse httpResponse) {

  }

3、测试用例

  测试用例管理使用了testNg管理 ,使用了TestNG参数化测试,通过xml文件来执行case

  3.1 测试case脚本

public class GetRoleTest {

static CookieStore cookieStore ;

static CookieUtil cookieUtil=new CookieUtil() ;

CloseableHttpClient client;

HttpUtils httpUtils=HttpUtils.getInstance();

@Parameters({ "url", "objBean" ,"statusCode","xmlName"})

@BeforeSuite

/*

* 登录进入系统获取JSESSIONID放入到CookieStore中

* */

public  void TestLoginIn(String url ,String objBean, String statusCode,String xmlName) {

Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);

client = HttpClients.createDefault();

CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);

//cookieUtil.printResponse(httpResponse);

cookieStore=cookieUtil.setCookieStore(httpResponse);

}

@Parameters({ "url", "objBean" ,"statusCode","body","xmlName"})

@Test(priority = 2)

public  void TestGetRole(String url ,String objBean, String statusCode,String body,String xmlName) {

Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);

client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();

CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);

ResponseBean rb=new ReponseUtil().setResponseBean(httpResponse);

//        add Assert

Assert.assertEquals("OK", rb.getStatus());

Assert.assertEquals(statusCode, rb.getStatusCode());

Assert.assertEquals(true, rb.getBody().contains(body));

}

@AfterSuite

public void closeClient(){

try {

// 关闭流并释放资源

client.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

【注】 因为API接口测试时每次都要校验Cookie,所有我们每次都先执行登录操作去获取Cookie

3.2 xml文件的编写

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="TestGetRole" parallel="classes" thread-count="5">

<parameter name="url" value="/sys/login" />

<parameter name="objBean" value="loginIn" />

<parameter name="status" value="OK" />

<parameter name="statusCode" value="200" />

<parameter name="xmlName" value="mapRole" />

<test name="TestGetRole" preserve-order="true">

<parameter name="url" value="/json/getRoleInfo" />

<parameter name="objBean" value="GetRole" />

<parameter name="status" value="OK" />

<parameter name="statusCode" value="200" />

<parameter name="body" value="roleName" />

<classes>

<class name="com.lc.testScript.GetRoleTest">

<methods>

<include name="TestGetRole" />

<!--<include name="TestGetRole2" />-->

</methods>

</class>

</classes>

</test>

</suite>

 右键->run as ->TestNG Suite,这个场景的的测试用例就可以运行了

4、测试报告和项目组织

  测试报告这里用到第三方的包ReportNG 项目组织用Maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

..........................................

..........................................

..........................................

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<xmlFileName1>TestGetRole.xml</xmlFileName>

.................这里写testNG对应的XML名称----------------------

<xmlFileName10>TestGetUser.xml</xmlFileName>

</properties>

<dependencies>

..........................

</dependencies>

<build>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.19</version>

<configuration>

<suiteXmlFiles>

<suiteXmlFile>src/test/java/testSuites/${xmlFileName}</suiteXmlFile>

.................略............

..............这里的和properties中的xmlFileName想对应............

<suiteXmlFile>src/test/java/testSuites/${xmlFileName10}</suiteXmlFile>

</suiteXmlFiles>

</configuration>

</plugin>

<!-- 添加插件,添加ReportNg的监听器,修改最后的TestNg的报告 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.5</version>

<configuration>

<properties>

<property>

<name>usedefaultlisteners</name>

<value>false</value>

</property>

<property>

<name>listener</name>

<value>org.uncommons.reportng.HTMLReporter</value>

</property>

</properties>

<workingDirectory>target/</workingDirectory>

</configuration>

</plugin>

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.5.1</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

</plugins>

</build>

</project>

【注】因为是maven的项目所以要将testSuite的xml文件放在maven的test目录下,这样右键pom.xml文件maven test,所有的测试用例就开始执行了

测试报告

 框架目前存在的不足

  1、数据库数据校验这一块的功能还没有完善,计划用MyBatis

  2、参数使用了xml文件配置虽然灵活但有些繁琐,目前还没想到好的解决方案,testlink是否可以尝试一下呢

最后允许我对你们说一段话:

如果你也在往自动化测试开发方向发展

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势

我的自动化测试之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,所以,我和朋友特意花了一段时间整理编写了以上的《自动化测试工程师进阶路线》,也整理了不少【网盘资源】,需要的朋友可以扫描下方小卡片获取网盘链接。希望会给你带来帮助和方向。

更多推荐

四川玖璨电子商务有限公司培训可靠吗?

四川玖璨电子商务有限公司是一家在抖音平台上进行培训的电商公司。如今,随着抖音带货的火热,越来越多的人加入到这个行业中。然而,对于消费者来说,选择一个可靠的抖音培训公司并不容易。在这个领域中,四川玖璨电子商务有限公司是一个备受瞩目的公司。公司致力于为消费者提供高品质的商品和良好的服务。他们在抖音上拥有大量的粉丝,并且他们

【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径

目录1、最小生成树1.1概念1.2普利姆算法(Prim)1.3克鲁斯卡尔算法(Kruskal)2、最短路径2.1迪杰斯特拉算法(Dijkstra)2.2弗洛伊德算法(Floyd)2.3BFS算法,Dijkstra算法,Floyd算法的对比3、有向无环图描述表达式3.1有向无环图定义及特点3.2描述表达式4、拓扑排序4.

【Opencv入门到项目实战】(四):图像梯度计算|Sobel算子|Scharr算子|Laplacian算子

文章目录0.引言1.Sobel算子2.Scharr算子3.Laplacian算子0.引言在图像处理中,梯度是指图像中像素灰度变化的速率或幅度,我们先来看下面这张图假设我们想要计算出A点的梯度,我们可以发现A点位于边缘点,A点左边为黑色,右边为白色,而计算图像的梯度可以提取出图像中的边缘信息,我们常用的方法是使用Sobe

ESP8266 WiFi物联网智能插座—硬件功能

目录1、控制器板2、采集器板2.1、电源设计2.2、控制器设计2.3、电量采集电路设计2.4、按键和LED指示灯设计ESP8266WiFi物联网智能插座的硬件功能主要包括两部分:控制器板和采集器板。焊接成品效果如下图所示:1、控制器板控制器板是ESP8266最小系统,PCB设计效果如下图所示:控制器选用ESP-12S作

阻止用邮件不停注册wordpress账户的方法

您可以使用多种不同的策略来阻止垃圾邮件注册。以下是一些策略供您参考:第1个最好用1.完全禁用WordPress注册:如果您不需要在您的WordPress网站上公开注册,最好完全禁用注册,而不是试图打击垃圾邮件注册。要完全禁用WordPress上的用户注册,请转到设置→常规并确保未选中任何人都可以注册框1。2将验证码添加

设计模式:外观模式

目录组件代码实例源码中应用优缺点总结外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端能够更简单地使用子系统的功能。外观模式的核心思想是将复杂的子系统封装在一个外观类中,客户端只需要与外观类进行交互,而不需要直接与子系统的各个组件进行交互。外观类充

力扣2596

题目来源示例1:输入:grid=[[0,11,16,5,20],[17,4,19,10,15],[12,1,8,21,6],[3,18,23,14,9],[24,13,2,7,22]]输出:true解释:grid如上图所示,可以证明这是一个有效的巡视方案。示例2:输入:grid=[[0,3,6],[5,8,1],[2,

计算机网络 第四章:网络层

一.网络层概述1.1分组转发和路由选择网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实现各自的物理层和数据链路层即可,但是,如果需要将这些异构型网络互连起来,形成一个更大的互联网,

配置OSPFv3基本功能 华为笔记

1.1实验介绍1.1.1关于本实验OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2(OSPF版本2)是支持IPv4的路由协议,为了让OSPF协议支持IPv6,技术人员开发了OSPFv3(OSPF版本3)。无论是OSPFv2还是OSPFv3,OSPF协议的基本运行原理是没有区别的,然而,由于IPv4和IPv6

【华为云云耀云服务器L实例评测】- 云原生实践,快捷部署人才招聘平台容器化技术方案!

🤵‍♂️个人主页:@AI_magician📡主页地址:作者简介:CSDN内容合伙人,全栈领域优质创作者。👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)摘要:感谢华为云提供的测

线性矩阵不等式(LMI)在控制理论中的应用

目录(一)Matlab中的LMI处理工具包(二)为什么LMI成为控制理论领域重要工具?(三)LMI在与Lyapunov不等式的关系(1)线性矩阵不等式(2)线性矩阵不等式系统(3)舒尔(Schur)补(四)LMI中常见引理引理2(广义KYP引理[4])推论1(广义KYP引理推论[4])引理3(射影定理[1])引理4(J

热文推荐