python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装

简介: 在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)-测试命名规则
  • 对于单接口的测试校验,一个单接口的测试用例只包含一个接口请求,即将一个接口请求封装成一个测试函数或测试方法。
  • 对于场景(多接口) 的测试校验,一条场景测试用例需请求多个接口,因此需要将多个接口请求封装在同一个测试函数或方法中。
  • 一般封装一个接口的正向校验、异常校验封装成不同的方法,并封装在同一个测试类中。如定义一个登陆的测试类,正确用户名、密码请求封装成一个方法 (即一条测试用例),正确用户名、错误密码请求封装成另一个方法 (即另一条测试用例)。
  • 也可以将某个功能点或功能相关联的接口用例封装在同一个测试类中。比如个人中心涉及到的接口,可以封装在同一个测试类中


测试函数的封装


一般而言,一个测试函数对应一条用例。上面的代码编写成一条测试用例,示例如下:

微信图片_20220425204611.png

强调,pytest中测试函数命名必须以test开头,如test_get_home。

测试类/方法的封装

一个测试类相当于一个测试用例集,类中的每个方法对应一条测试用例。以登录接口为例,封装成测试类,示例如下:

微信图片_20220425204616.png

强调,pytest中测试类命名需要以Test开头,如TestLogin,且测试类中不能有init方法。测试类中测试方法必须以test开头,如test_login_normal。


示例代码


pytest中可以使用命令行或者使用代码方式即 pytest.main() 执行用例,具体可参考文章pytest(1)-简介

完整的示例代码如下:

# @time: 2022-03-24
# @author: 给你一页白纸
# 微信公众号:测试上分之路
import requests
import pytest
import json
def test_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 == 200
class TestLogin:
    '''
    登录接口校验
    '''
    url = "http://127.0.0.1:5000/login"
    headers = {"Content-Type": "application/json;charset=utf8"}
    def test_login_normal(self):
        '''正确用户名、正确密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "123456"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert json.loads(res.text)["token"]
    def test_login_error(self):
        '''正确用户名、错误密码登录'''
        data = {
            "username": "AndyLiu",
            "password": "111111"
        }
        res = requests.post(url=self.url, json=data, headers=self.headers)
        # 断言
        assert res.status_code == 200
        assert not json.loads(res.text)["token"]
if __name__ == '__main__':
    pytest.main()


总结


  • 测试函数、测试类/测试方法的封装,其实不管是什么单元测试框架,遵循的方式都一样。
  • 而在命名方式上各有自己的要求,比如pytest与unittest中测试命名方法有一定的区别。
  • 把一个有自己断言的函数或方法看成是一条测试用例,那么测试类其实就是一个含有一条或者多条测试用例的测试用例集,类中的每个方法对应一条测试用例。
  • 一个测试类中放置哪些测试方法,换句话说一个测试用例集中应该包含哪些测试用例,这个可以按照项目自身情况而定,也可按照测试人员自己的想法而定,主旨就是要清晰明了。
相关文章
|
6天前
|
Python
python方法,传参20220101 计算与当前时间差
python方法,传参20220101 计算与当前时间差
|
6天前
|
存储 Python
Python中类方法、实例方法与静态方法的区别
这三种方法的正确使用可以使代码更加清晰、组织良好并且易于理解,从而有效地支持软件开发的面向对象编程范式。
9 1
|
5天前
|
机器学习/深度学习 PyTorch TensorFlow
Python实现深度学习学习率指数衰减的方法与参数介绍
学习率指数衰减提供了一种高效的动态调整学习率的手段,帮助模型在不同训练阶段以不同的学习速度优化,有利于提升模型性能和训练效率。通过合理设置衰减策略中的参数,可以有效地控制学习率的衰减过程,实现更加精确的模型训练调优。
7 0
|
5天前
|
UED Python
Python requests库下载文件时展示进度条的实现方法
以上就是使用Python `requests`库下载文件时展示进度条的一种实现方法,它不仅简洁易懂,而且在实际应用中非常实用。
10 0
|
2月前
|
SQL JSON C语言
Python中字符串的三种定义方法
Python中字符串的三种定义方法
|
4月前
|
Python
python之字符串定义、切片、连接、重复、遍历、字符串方法
python之字符串定义、切片、连接、重复、遍历、字符串方法
python之字符串定义、切片、连接、重复、遍历、字符串方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
|
Python
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
面向对象和面向过程,是两种编程思想. 编程思想是指对待同一个问题,解决问题的套路方式.面向过程: 注重的过程,实现的细节.亲力亲为.面向对象: 关注的是结果, 偷懒.类和对象,是面向对象中非常重要的两个概念object 是所有的类基类,即最初始的类class 类名(object): 类中的代码PEP8代码规范:类定义的前后,需要两个空行 创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为2378044849840 8.类内部操作属性 sel
234 1
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
|
4天前
|
数据挖掘 索引 Python
Python数据挖掘编程基础3
字典在数学上是一个映射,类似列表但使用自定义键而非数字索引,键在整个字典中必须唯一。可以通过直接赋值、`dict`函数或`dict.fromkeys`创建字典,并通过键访问元素。集合是一种不重复且无序的数据结构,可通过花括号或`set`函数创建,支持并集、交集、差集和对称差集等运算。
14 9
下一篇
无影云桌面