python+pytest接口自动化-测试函数测试类/测试方法的封装
Posted 一个处女座的测试
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python+pytest接口自动化-测试函数测试类/测试方法的封装相关的知识,希望对你有一定的参考价值。
前言
在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行。
例如单个接口的请求代码如下:
import requests
headers =
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=h_url, headers=headers)
假设我们需要将上面这段代码编写成测试框架能执行的测试用例,仅仅只是这样写代码显然是不够的,还需要进行如下补充:
需要将代码封装成单元测试框架 (pytest或unittest) 能识别的测试函数或测试类,否则将不会被识别执行。
需要加上断言,即结果与期望之间的对比,单元测试框架才能判定该用例执行结果是否通过,结果==期望则说明通过,否则失败。
python中函数以及类的封装这里不做过多说明,pytest断言大家可以参考文章pytest(5)-断言,而这篇文章的目的是让大家明白在接口自动化测试中一般怎样封装测试代码。
测试用例封装的一般规则
测试用例的封装有两种,测试函数和测试类,封装的一般规则如下:
一个测试函数对应一条测试用例。
测试类中可定义多个测试方法,一个测试方法对应一条测试用例,测试类可以看作是一个测试用例集。
pytest中测试函数或测试方法的命名必须以test开头,测试类名必须以Test开头。具体命名规则可以参考我之前的文章pytest(3)-测试命名规则。
对于单接口的测试校验,一个单接口的测试用例只包含一个接口请求,即将一个接口请求封装成一个测试函数或测试方法。
对于场景(多接口) 的测试校验,一条场景测试用例需请求多个接口,因此需要将多个接口请求封装在同一个测试函数或方法中。
一般封装一个接口的正向校验、异常校验封装成不同的方法,并封装在同一个测试类中。如定义一个登陆的测试类,正确用户名、密码请求封装成一个方法 (即一条测试用例),正确用户名、错误密码请求封装成另一个方法 (即另一条测试用例)。
也可以将某个功能点或功能相关联的接口用例封装在同一个测试类中。比如个人中心涉及到的接口,可以封装在同一个测试类中
测试函数的封装
一般而言,一个测试函数对应一条用例。上面的代码编写成一条测试用例,示例如下:
强调,pytest中测试函数命名必须以test开头,如test_get_home。
测试类/方法的封装
一个测试类相当于一个测试用例集,类中的每个方法对应一条测试用例。以登录接口为例,封装成测试类,示例如下:
强调,pytest中测试类命名需要以Test开头,如TestLogin,且测试类中不能有init方法。测试类中测试方法必须以test开头,如test_login_normal。
示例代码
pytest中可以使用命令行或者使用代码方式即 pytest.main() 执行用例,具体可参考文章pytest(1)-简介。
完整的示例代码如下:
# @time: 2022-03-24# @author: 给你一页白纸# 微信公众号:测试上分之路import requests
import pytest
import json
deftest_get_home():
'''
请求首页接口
:return:
'''
headers =
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
url = "https://www.cnblogs.com/lfr0123/"
res = requests.get(url=url, headers=headers)
# 断言,判断返回结果的code是否等于200,当然实际接口测试中一般返回结果中还会有别的字段需要断言assert res.status_code == 200classTestLogin:
'''
登录接口校验
'''
url = "http://127.0.0.1:5000/login"
headers = "Content-Type": "application/json;charset=utf8"
deftest_login_normal(self):
'''正确用户名、正确密码登录'''
data =
"username": "AndyLiu",
"password": "123456"
res = requests.post(url=self.url, json=data, headers=self.headers)
# 断言assert res.status_code == 200assert json.loads(res.text)["token"]
deftest_login_error(self):
'''正确用户名、错误密码登录'''
data =
"username": "AndyLiu",
"password": "111111"
res = requests.post(url=self.url, json=data, headers=self.headers)
# 断言assert res.status_code == 200assertnot json.loads(res.text)["token"]
if __name__ == '__main__':
pytest.main()
总结
测试函数、测试类/测试方法的封装,其实不管是什么单元测试框架,遵循的方式都一样。
而在命名方式上各有自己的要求,比如pytest与unittest中测试命名方法有一定的区别。
把一个有自己断言的函数或方法看成是一条测试用例,那么测试类其实就是一个含有一条或者多条测试用例的测试用例集,类中的每个方法对应一条测试用例。
一个测试类中放置哪些测试方法,换句话说一个测试用例集中应该包含哪些测试用例,这个可以按照项目自身情况而定,也可按照测试人员自己的想法而定,主旨就是要清晰明了。
实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
电商项目实战
web测试项目
web+App+h5+小程序 测试项目
接口自动化测试实战项目
Linux实战项目
面试资料
我们进阶学习自动化测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
以上资料,对于想要测试进阶的朋友们来说应该会很有帮助,需要的小伙伴可以后台私信找我免费领取。
总结
我见过很多leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了好几年,更夸张的是7、8年工作内容的重复性比较高,没有什么技术含量的工作。
凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!!
以上是关于python+pytest接口自动化-测试函数测试类/测试方法的封装的主要内容,如果未能解决你的问题,请参考以下文章
Python接口自动化测试之pytest与unittest区别
Python接口自动化测试之pytest与unittest区别
python数据驱动+接口自动化测试pytest+allure+yaml+jenkins+git(gitlab/gitee)下的接口自动化测试实战