接口自动化测试框架搭建

一、原理及特点

  1. 参数放在XML文件中进行管理
  2. 用httpClient简单封装一个httpUtils工具类
  3. 测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。
  4. 测试报告这里用到第三方的包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是否可以尝试一下呢

Python接口自动化测试零基础入门到精通(2023最新版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-12-14 使用Qt画一条曲线(AI辅助)

点击 <C 语言编程核心突破> 快速C语言入门 使用Qt画一条曲线 前言一、Qchart简介二、代码总结 前言 要解决问题: 有一个函数, 生成一些点, 想画一条曲线. 想到的思路: 这个用Qchart比较简单. 其它的补充: 需要稍许配置 一、Qchart简介 QChart是Qt中的一个图表控件&a…

小白菜QQ云端机器人源码-去除解密授权

小白菜QQ云端机器人源码分享&#xff1a;解密授权学习版已去除 这款源码是专为群机器人爱好者设计的&#xff0c;它基于挂机宝机器人框架构建的网页站点。 用户可以通过网页登录QQ账号至挂机宝框架中&#xff0c;无需通过机器人实现登录。 而且&#xff0c;该源码解决了一个…

力扣 | 437. 路径总和 III

437. 路径总和 III mport java.util.ArrayList; import java.util.List;/*** int的取值范围&#xff1a;* -2^31 ~ 2^31-1* <p>* -2147483648 ~ 2147483647&#xff08;约等于10的9次方&#xff09;* <p>* long long的取值范围&#xff1a;* -2^63 ~ (2^63-1&…

HBase 详细图文介绍

目录 一、HBase 定义 二、HBase 数据模型 2.1 HBase 逻辑结构 2.2 HBase 物理存储结构 ​2.3 数据模型 2.3.1 Name Space 2.3.2 Table 2.3.3 Row 2.3.4 Column 2.3.5 Time Stamp 2.3.6 Cell 三、HBase 基本架构 架构角色 3.1 Master 3.2 Region Server 3.3 Zo…

弹性搜索引擎Elasticsearch:本地部署与远程访问指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装…

有教师资格证就可以当老师吗

我是一名在教育事业中摸爬滚打了多年的老鸟&#xff0c;最近看到很多人在讨论一个话题&#xff1a;有教师资格证就能当老师吗&#xff1f;今天我就来给大家科普一下。 我们得明白教师资格证是什么。教师资格证是国家教育部门为了规范教育行业&#xff0c;提高教育质量而设立的一…

详解—C++右值引用

目录 一、右值引用概念 二、 左值与右值 三、引用与右值引用比较 四、值的形式返回对象的缺陷 五、移动语义 六、右值引用引用左值 七、完美转发 八、右值引用作用 一、右值引用概念 C98中提出了引用的概念&#xff0c;引用即别名&#xff0c;引用变量与其引用实体公共…

多线程 (下) - 学习笔记

常见锁策略 乐观锁和悲观锁 悲观锁 总是假设最坏的情况, 每次去拿数据的时候都会认为会被别人修改, 因此会上锁, 防止数据在使用过程中被别的线程修改, 乐观锁 假设数据一般情况下不会产生并发冲突,因此在拿数据,操作数据的过程中不加锁, 而在数据进行提交更新的时候, 才会正…

react经验7:高亮关键字

预期效果&#xff1a; 实现原理 将需要高亮的关键词做成正则表达式 new RegExp((${word}), "gi")使用上述正则表达式切割目标字符串 origin.split(new RegExp((${word}), "gi"))切割结果会包含正则匹配到的词 过滤掉空字符&#xff0c;并对关键词包裹…

使用代理IP时的并发请求是什么意思?

很多做过数据采集的技术们应该都有所了解&#xff0c;在选择代理IP时会有一个并发请求的参数&#xff0c;这个参数是什么意思呢&#xff1f;可能有很多新手不是很了解&#xff0c;其实代理IP的并发请求就是指同时发送多个请求到目标服务器&#xff0c;以提高请求的效率和速度。…

LeetCode刷题--- 二叉树的所有路径

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 【 http://t.csdnimg.cn/yUl2I 】 【C】 【 http://t.csdnimg.cn/6AbpV 】 数据结构与算法 【 http://t.csdnimg.cn/hKh2l 】 前言&…

详解高精度数字模拟混合信号温度传感芯片的工作原理及应用

高精度温度传感芯片是利用物质各种物理性质随温度变化的规律把温度转换为电量的传感芯片。这些呈现规律性变化的物理性质主要有体。温度传感芯片是温度测量仪表的核心部分&#xff0c;品种繁多。按测量方式可分为接触式和非接触式两大类&#xff0c;按照传感器材料及电子元件特…

DES的DPA攻击过程

一般智能卡只使用DES算法对数据进行加密&#xff0c;不采取其他防御措施&#xff0c;所以安全性不高。本博文主要研究智能卡使用DES算法对数据进行加密的具体细节&#xff0c;并针对加密过程中的关键步骤给出DPA攻击的设计思路。 DES数据加密过程 智能卡对密码算法的要求是功…

rocketmq启动nohup mqbroker 显示Exit 253错误解决方案

执行nohup mqbroker -c /usr/local/rocketmq/rocketmq-all-4.9.1-bin-release/conf/2m-2s-sync/broker-b-s.properties启动broker节点 退出253 出现这种错误的原因可能是broker-b-s.properties文件的路劲你提前mkdir了 解决办法&#xff0c;把创建好的文件删除&#xff0c;等…

星座生肖运势配对+周公解梦流量主小程序源码系统 带完整的安装部署教程·

近年来&#xff0c;人们对于星座和生肖的配对以及周公解梦的需求越来越大。罗峰发现了一款集星座、生肖配对和周公解梦于一体的流量主小程序源码系统。该系统具有丰富的功能和易于部署的特点&#xff0c;旨在为广大用户提供更加便捷、高效的星座生肖配对和周公解梦服务。 以下…

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

16--常用类和基础API--06

1、包装类 1.1 包装类概述 Java提供了两个类型系统&#xff0c;基本类型与引用类型&#xff0c;使用基本类型在于效率&#xff0c;然而很多情况&#xff0c;会创建对象使用&#xff0c;因为对象可以做更多的功能&#xff0c;如果想要我们的基本类型像对象一样操作&#xff0c…

Vue组件封装知识总结

一、为什么要封装组件 首先&#xff0c;一个好问题&#xff0c;面试要考的&#xff01;为什么要封装组件呢&#xff1f; 提高代码的复用性&#xff1a;通过封装&#xff0c;可以将一段代码或一部分功能抽象为一个独立的组件&#xff0c;并在不同的项目或场景中重复使用。这样可…

【自定义View】android自定义渐变色圆弧+水波纹布局

本次用ko t lin 写了自定义渐变色圆弧水波纹布局。 备注&#xff1a;双水波纹的手写代码我放在文末了。但我自己写的运行起来有 亿点点难看。 所以效果图里用的 com.scwang.wave:MultiWaveHeader:1.0.0-andx 实现水波纹。--重要的是知道原理。。嘻嘻&#xff01;&#x1f618; …

天猫数据分析(天猫数据查询):11月茅台涨价依然稳居销冠,白酒市场销售现状分析

11月份&#xff0c;贵州茅台宣布涨价。2023年11月1日起茅台上调53%vol贵州茅台酒&#xff08;飞天、五星&#xff09;出厂价格&#xff0c;平均上调幅度约为20%。有媒体报道&#xff0c;随着茅台酒出厂价宣布上调后&#xff0c;市场销售价普遍上涨50元至100元不等。 如今&#…