基于pytest的接口测试框架详解,一定有你想知道的

news2025/1/20 10:09:57

目录

 

需求一:一套用例可以测试多套环境

需求二: 可以被jenkins调度执行

需求三  拥有测试报告

需求四:接口中某些字段值在每次请求中不重复

需求五: 可以多接口关联测试

需求六 构造的表数据可以和接口字段数据关联

需求七 pytest用例和实际用例数据要分离,方便维护

需求八 针对多样的响应内容,具备多样的断言方式


最近要开展接口测试,起初打算使用公司已有的Fitnesse测试工具来进行接口测试。过程中发现,

构造接口字段数据、测试数据都比较困难,接口参数多的时候,用例量就会很多,关键执行速度还慢。所以放弃了。

找了一些其它工具,都不太能解决数据构造困难的问题。找不到工具,就直接使用代码来实现。考虑到代码量,结合网上的一些推荐,决定使用python+pytest来编写接口自动化用例。

决定了语言和框架,接下来要考虑一下实现需求。

1.一套用例可以测试多套环境

2.可以被jenkins调度执行

3.拥有测试报告

4.接口中某些字段值在每次请求中不重复

5.可以多接口关联测试

6.构造的表数据可以和接口字段数据关联

7.pytest用例和实际用例数据要分离,方便维护

8.针对多样的响应内容,具备多样的断言方式。

需求一:一套用例可以测试多套环境

公司的测试环境不止一套,希望在使用接口自动化用例时,可以随意的切换被测环境。

为了满足这个需求,首先要完成接口地址等信息的独立配置,而且是要按照一套环境的维度去管理信息。

 我的做法如上图,首先我给每套环境设置了一个别名,比如上图中的lion环境,然后设计了一个服务去持久化变量值信息(变量名称所有环境保存一致)。

接着将环境名称和变量名称,组合起来,保存到redis中(如上图),供后续接口自动化用例读取并使用。

pytest自动化测试框架:3天学会Pytest自动化测试框架,哭着都要给我看完_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1oX4y1Z7yw/?spm_id_from=333.999.0.0

环境信息搞定之后,接下来的任务就是,设计一种方法让接口自动化用例使用环境信息。

这里采用的方法是,在执行时,指定环境别名。

pytest的用例有多种执行方式,这里使用pytest.main()来启动,通过将pytest.main()写入一个py文件中,如下面代码。

memberCenter.py


1 if __name__ == "__main__":
2     if (len(sys.argv) == 2):
3         _, env = sys.argv
4     else:
5         env = 'lion'
6     BaseUtil.initTest(env)
7     pytest.main(['--alluredir=./allure-results', '--maxfail=5','-s','-rA', 'testcase/membercenter/'])

 启动时,接受一个参数env,并将env作为属性添加到Context中,供用例使用。

BaseUtil.py
from context import Context as ct
def initTest(env):
 ct.env = env 

调用命令:

 这里就指定了测试环境的别名为lion。

有了环境别名,再加上统一的变量名称,就可以使用下面的方式,去redis获取对应的变量值了。

 以上就实现了多环境测试的需求。后续只要维护好环境别名、变量名称和变量值就可以了。


需求二: 可以被jenkins调度执行

这个比较简单,通过参数化构建就可以。

 不过为了不影响Jenkins所在服务器,我使用了docker去执行用例

下面是Dockerfile的配置

 下面是jenkins中的Execute shell

1 echo "清除历史报告记录"
 2 cd ${WORKSPACE}
 3 cd allure-report && rm -rf *
 4 cd ${WORKSPACE}
 5 cd allure-results && rm -rf *
 6 
 7 echo "开始执行命令"
 8 cd ${WORKSPACE}
 9 
10 function del_ci {
11   echo "$1"
12   docker stop chbifacetest
13   docker rm chbifacetest
14   docker rmi hbifacetest:1.1
15 }
16 
17 docker inspect --format '{{.State.Running}}' chbifacetest && del_ci "删除容器和镜像"
18 
19 
20 docker build -t hbifacetest:1.1 .
21 docker run  -v ${WORKSPACE}/allure-results:/usr/local/hbifacetest/allure-results -v ${WORKSPACE}/allure-report:/usr/local/hbifacetest/allure-report --name chbifacetest hbifacetest:1.1 ${pymainfile} ${testEnv}
22 echo "执行结束"

需求三  拥有测试报告

测试报告使用的是Allure,主要是美观且配置简单,(参考:https://docs.qameta.io/allure/#_pytest)

 step1:配置报告路径

添加一个参数--alluredir=./allure-results

 step2:编写用例时,添加注释

 step3:在jenkins中安装插件

 step4:在job中配置报告路径

step5:在另一个job中添加执行计划

step6:查看报告

需求四:接口中某些字段值在每次请求中不重复


这里通过python的一个库factory-boy来实现该需求。

大概的原理就是将每个接口当做一个对象来处理,通过factory-boy给每个字段添加值,可以是固定值,也可以是随机值。然后将对象转成dict,并发送请求。(复杂对象转dict比较麻烦,参考:https://www.cnblogs.com/moonpool/p/11454902.html)

pytest自动化测试框架:3天学会Pytest自动化测试框架,哭着都要给我看完_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1oX4y1Z7yw/?spm_id_from=333.999.0.0

如下图中的红框部分字段,每次请求都将是不同的值。

需求五: 可以多接口关联测试

针对这个需求,实现的主要思路是,可以在一条Pytest用例中,拿到所有接口的请求和响应参数。

这里利用了pytest中fixture,将每个接口的http请求方法封装成fixture,后续传递给pytest用例使用。同理实现了 加载用例数据的Fixture

 1 #接口Fixture
 2 @pytest.fixture(scope="function")
 3 def member_borrower_addBorrower_http_json():
 4     def _member_borrower_addBorrower_http_json(dict={"key": "value"}):
 5         r = ht.post_json(url=member_borrower_addBorrower_url, json=dict,headers=headers_json)
 6         return r
 7 
 8     return _member_borrower_addBorrower_http_json
 9 
10 @pytest.fixture(scope="function")
11 def member_borrower_updateBorrower_http_json():
12     def _member_borrower_updateBorrower_http_json(dict={"key": "value"}):
13         r = ht.post_json(url=member_borrower_updateBorrower_url, json=dict,headers=headers_json)
14         return r
15 
16     return _member_borrower_updateBorrower_http_json
17 
18 #加载用例数据的Fixture
19 @pytest.fixture(scope="function",params=addBorrower)
20 def test_member_borrower_addBorrower(request):
21     dict=request.param
22     return dict
23 
24 @pytest.fixture(scope="function",params=updateBorrower)
25 def test_member_borrower_updateBorrower(request):
26     dict=request.param
27     return dict

下面是用例数据,可以看到request中传递的是一个函数,函数执行后,可以拿到两个请求的请求参数。

 下面的是pytest用例,可以看到用例中可以同时维护两个请求接口的请求参数和响应内容

这里例子比较简单,更新请求中,需要使用到添加响应中的data字段值。

需求六 构造的表数据可以和接口字段数据关联

有时候没有办法,通过其它接口的调用得到的信息,来为当前测试接口做数据入参。可偏偏需要在数据库中存在数据,才可以调用当前测试接口。

可以利用Factory-boy和sqlalchemy来实现这个需求。利用Factory-boy生成随机数据,利用sqlalchemy将数据入库。

例如下面pytest用例的红框部分,就是在插入数据,并使用数据中black_index,作为当前测试接口的请求入参

 下面是CreateMBL函数的实现

 下面是Factory-boy生成数据的代码  

1 import factory
 2 import factory.fuzzy
 3 from sqlalchemy import Column,String,BIGINT,INT,VARCHAR,DECIMAL, Unicode, create_engine
 4 from sqlalchemy.ext.declarative import declarative_base
 5 from sqlalchemy.orm import scoped_session, sessionmaker
 6 from .dbsession import FintechDBSession
 7 from baseutil.pr import Provider
 8 
 9 Base = declarative_base()
10 
11 class member_black_list(Base):
12     # 表的名字:
13     __tablename__ = 'member_black_list'
14 
15     # 表的结构:
16     black_index=Column(BIGINT(), primary_key=True)
17     black_type=Column(INT())
18     real_name=Column(VARCHAR(120))
19     card_id=Column(VARCHAR(40))
20     phone=Column(VARCHAR(40))
21     remark=Column(VARCHAR(1024))
22     oper_id=Column(VARCHAR(40))
23     oper_name=Column(VARCHAR(255))
24     create_time = Column(VARCHAR(14))
25     update_time=Column(VARCHAR(14))
26     status=Column(INT())
27     reason=Column(VARCHAR(512))
28     examine_status=Column(INT())
29     effective_start_date=Column(VARCHAR(8))
30     effective_end_date=Column(VARCHAR(8))
31     black_source=Column(INT())
32     version=Column(INT())
33 
34 factory.Faker.add_provider(Provider)
35 
36 class member_black_list_factory(factory.alchemy.SQLAlchemyModelFactory):
37     class Meta:
38         model = member_black_list
39         sqlalchemy_session = FintechDBSession
40 
41     black_index = factory.Faker("randomInt")
42     black_type = 1
43     real_name = factory.Faker("name", locale="zh_CN")
44     card_id = factory.Faker("idNumber")
45     phone = factory.fuzzy.FuzzyText("1333", 6, "1", "1234567890")
46     remark = "自动化接口测试"
47     oper_id = "100000003508"
48     oper_name = "test1234"
49     create_time = factory.Faker("currentTimeByFormat")
50     update_time = factory.Faker("currentTimeByFormat")
51     status = 1
52     reason = "自动化接口测试"
53     examine_status = 1
54     effective_start_date = factory.Faker("datebyday", days=0, ft="%Y-%m-%d")
55     effective_end_date = factory.Faker("datebyday", days=1, ft="%Y-%m-%d")
56     black_source = 0
57     version = 0

需求七 pytest用例和实际用例数据要分离,方便维护

在需求五中依据可以看出, pytest用例和实际用例数据是分离。

大部分接口自动化做法是使用excel去维护用例,但是当接口或响应字段比较多的时候,编写用例比较麻烦。如果出现接口字段变更,修改用例也变得比较麻烦。

首先pytest用例和实际用例分离是必须的,接下来就是怎么维护用例的问题。

下面就是我的实际用例数据,可以看到request中通过不同的参数,可以生成不同的请求数据。至于怎么执行用例,


需求八 针对多样的响应内容,具备多样的断言方式

 

起初在用例的response中,只存放了一个dict,如下图,但是有时候响应内容(json格式)是多样的,需要断言的字段不一定都在json的顶层结构中,可能还会出现嵌套dict以及list的情况。

 下面是我的实现。主要的思想就是根据不同的断言需求,传递给不同的断言方法。

用例中调用下面的函数,可以生成一批断言集合。

当断言需求类型是dict的时候,会调用下面的函数。

 用例response编写,指定不同的断言需求

pytest 用例使用,如红框部分,结合上面的用例的断言需求,在用例执行时,实时传入实际响应内容。再遍历执行断言函数集合。就完成了多样的断言需求。

pytest自动化测试框架:3天学会Pytest自动化测试框架,哭着都要给我看完_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1oX4y1Z7yw/?spm_id_from=333.999.0.0

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java内部类和异常类1

文章目录 一、Java内部类二、Java匿名类总结 一、Java内部类 成员变量和方法,实际上,类还有一种成员:内部类。在一个类中定义另一个类,我们把这样的类称作内部类,包含内部类的类称作内部类的外嵌类。 内部类和外嵌类…

编辑距离00

题目链接 爬楼梯 题目描述 注意点 word1 和 word2 由小写英文字母组成返回将 word1 转换成 word2 所使用的最少操作数 解答思路 本题本质上的操作只有三种:在单词 A 中插入一个字符;在单词 B 中插入一个字符;修改单词 A 的一个字符&…

OpenGL之元素缓冲对象

文章目录 EBO(元素缓冲对象)创建元素缓冲对象创建两个相邻不同颜色的三角形 EBO(元素缓冲对象) 素缓冲对象(Element Buffer Object,EBO),也叫索引缓冲对象(Index Buffer Object,IBO)。要解释元素缓冲对象的工作方式最好还是举个例子&#xf…

【Python redis】零基础也能轻松掌握的学习路线与参考资料

Python redis是一种非常流行的缓存数据库,对于Python Web应用程序开发非常有用,能快速地处理大量的数据请求。Python redis的学习路线需要对Python语言有深刻的理解,并了解使用redis的API。在掌握了Python redis的基本知识后,就可…

这个 希尔排序详解过程 我能吹一辈子!!!

文章目录 希尔排序概念希尔排序算法思路希尔排序实现 希尔排序概念 希尔排序(Shellsort)也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔(Donald Shell)于1959…

关系数据库设计理论

关系数据库设计理论 目录 关系数据库设计理论是什么函数依赖完全函数依赖(Full Functional Dependency)部分函数依赖(Partial Functional Dependency)传递函数依赖(Transitive Functional Dependency) 异常插入异常(Insertion Anomaly)更新异常(Update Anomaly)删除异常(Deleti…

Mit6.006-problemSession04

4-1 序列旋转 下面是一个序列AVL树T。执行操作T.delete_at(8),该操作期间,每次旋转操作执行完后,画出该树。 4-2 Fick Nury Fick Nury领导n名超级英雄组成了精英团队——复仇者联盟。他听说:超人Sanos正在一个遥远星球上制造麻烦…

【JVM】7. 方法区

文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进 7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM 7.4. 方法区的内部结构7.4.1. 方法区&…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问)

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问) 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

【数据结构】顺序表---C语言版(数据结构开篇小菜,全网最详细!小白看一遍就学会!!!)

文章目录 🍔一、前言🍟1. 什么是数据结构 🍔二、顺序表的概念----线性表🍟1. 什么是线性表🍟2. 顺序表与数组的区别 🍔三、顺序表详解💧 静态顺序表💧 动态顺序表🍎创建动…

C语言_VS系列编译器写C语言或C++代码产生的一些错误与警告的解决方法(VS2010/VS2019)

本次来分享在用VS系列编译(VS2010/VS2019)写C语言或C代码时会遇到的一些警告和错误,提供博主的一些解决方法,若有更好的解决方法,大家也可以在评论区发表自己的意见噢,话不多说,开始上菜: 此博主在CSDN发布…

【面试题】Redis缓存设计

文章目录 Redis缓存出现的问题🙎‍♂️面试官:什么是缓存雪崩?🙎‍♂️面试官:怎样解决缓存雪崩?🙎‍♂️面试官:什么是缓存击穿?🙎‍♂️面试官:…

Nacos集群和持久化配置

1.Nacos集群 1.1.架构说明 官方文档 集群部署架构图 因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面 http://ip1:port/openAPI直连ip模式,机器挂则需要修改ip才可以使用 http://VIP:port/openAPI挂载VIP模式,直…

【TOOLS: Linux与windows及linux与linux之间文件传输常用方法及命令】

文章目录 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法1.1.2 SCP 文件传输方法1.1.3 FTP 文件传输方法 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法 1)设置 virtualbox 中的共享文件夹,用户可以在windows某个盘下创建自己的共享文件…

chatgpt赋能Python-python_6_66_666

Python 666666:学习Python的不同层次 Python是一种高级编程语言,被广泛用于机器学习、人工智能、web开发等领域。它简单易学,具有良好的可读性和可扩展性,因此受到众多程序员的喜爱。 在学习Python的过程中,我们可以…

python面向对象知识点

因为我之前学过Java,所以下文中的python面向对象知识点会和Java面向对象知识点比较记忆; python类的定义 python类的定义个其函数的定义格式相同,为此先复习函数定义格式: def add(num1, num2){return num1 num2 } 类定义格式…

自动构建之Makefile

链接: 自动构建之CMake Makefile Makefile是用于自动化构建软件项目的工具,Makefile的优点是简单、直接,可以直接使用make工具进行构建。但是,Makefile通常需要手动编写和维护,可能会导致跨平台和跨编译器的兼容性问题。 Makef…

【SVN内网穿透】远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

.Net Core 数据校验框架使用

为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求&…

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线(不想显示也可以不画)4. 报警模块5. 代码修改5.1 主代码5.2 细节修改(可忽略) 6. 实验效果 本篇博文工程源码下载 链接1:https://github.com/up-up-…