最近复习pytest框架,正好写一下系列文章,文章全程干货,希望能帮助到你,如有错误的地方,欢迎大家指正。
1、pytest简介
Pytest 是一个成熟的全功能 Python 测试框架,它支持单元测试、集成测试以及功能测试。Pytest 的设计目标是简单、易于理解和使用,并且能够支持广泛的测试需求。
以下是 Pytest 的主要特点:
1、易于上手和使用:Pytest 提供了简单的语法和易于使用的 API,使得编写和组织测试用例变得非常容易。
2、强大的断言功能:Pytest 提供了丰富的断言功能,可以方便地对测试结果进行验证,确保代码的正确性。
3、插件支持:Pytest 支持插件,可以方便地扩展其功能。例如,可以通过插件来添加额外的测试报告、日志记录等功能。
4、参数化测试:Pytest 支持参数化测试,可以在同一个测试用例中使用不同的输入数据集进行测试,提高测试覆盖率。
5、异步测试支持:Pytest 可以方便地支持异步测试,使得测试复杂的异步代码变得非常容易。
6、集成能力:Pytest 可以方便地集成其他测试工具和库,如 Doctest、Ned Batchelder’s coverage、Gcov等。
7、灵活的钩子支持:Pytest 支持钩子(hook)机制,可以在测试执行过程中的关键点进行自定义操作,实现更灵活的测试控制。
8、丰富的文档和社区支持:Pytest 有丰富的文档和活跃的社区,可以方便地获取帮助和支持。
官方网址:
http://pytest.org/
GitHub网址:
https://github.com/pytest-dev/pytest
2、快速入门
在命令行输入:
pip install pytest
如果使用官方的源下载慢时,请使用国内的源,以下列列举几个,选一个使用。
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云:https://mirrors.aliyun.com/pypi/simple/
豆瓣:https://pypi.douban.com/simple/
中科大:https://pypi.mirrors.ustc.edu.cn/simple/
# 临时使用源
eg:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pytest
如果要设置每次都使用对应的源下载包时,需要如下配置:
# https://mirrors.aliyun.com/pypi/simple/ 可以更换你需要的源地址,后面下载就使用该源下载
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 执行下面命令验证是否更换成功,如果更换成功则返回刚才设置的源地址
pip config get global.index-url
查看当前pytest版本命令:
pytest --version
3、快速入门
3.1、快速入门
创建test_login.py文件,文件中使用函数和类分别写了登录和失败的测试用例,当们执行时,发现一共执行了4条用例,全部成功。
我使用pytest.main([“-s”, “-q”, “test_login.py”])方式在文件中执行用例,也可以在命令行中执行,切换到文件所在目录下输入pytest执行。
# -*- coding: utf-8 -*-
# @Time : 2023/11/21 14:55
# @Author : 梗小旭
# @File : test_login.py
import pytest
def test_login_success():
print("登录成功。。。")
def test_login_fail():
print("登录失败。。。。")
class TestLogin:
def test_login_class_success(self):
print("类-登录成功。。。")
def test_login_class_fail(self):
print("类-登录失败。。。")
if __name__ == '__main__':
pytest.main(["-s", "-q", "test_login.py"])
执行结果如下:
总结:
1、通过上述执行用例,我们发现创建的文件、方法级别用例,类、类中的方法都是以test_开头,那是因为在执行pytest时,会查找当前目录下以test_.py开头的文件,py文件中查找以test_*开头的类和方法并执行。
2、如果只想执行某个py文件,在命令行中输入:
pytest test_login.py
3、执行命令时,可以加-q、-s参数来实现对应的功能,每个参数的含义我会单独写一篇文章来介绍,-q是使用该命令后,将显示简单的结果。-s是使用该命令后,将显示测试函数中print()函数输出。
3.2、pytest用例设计规则
设计用例必须按照如下规则写,否则pytest找不到你的用例
①、用例的py文件必须以test_.py或者_test.py格式
②、函数用例用test_开头
③、类用Test开头,类方法用test_开头, 最重要一点,拿你的小本本记下来,用类写用例,类里面不能用__init__方法
④、所有的包Package必须要有__init__文件
下面解释下,为什么类用例不能有__init__方法:
在 pytest 中,类的构造函数(init 方法)不会被自动调用。这是因为 pytest 默认使用 fixture 功能来初始化测试用例,而不是使用类的构造函数。
Fixture 是 pytest 中用于初始化测试用例的一种机制,它可以用于设置测试用例的预置条件和准备工作。在 pytest 中,每个测试用例都是一个独立的函数,因此不需要使用类的构造函数来初始化测试用例的状态。
如果你需要在 pytest 中使用类的构造函数,可以通过在类中定义一个 init 方法来实现。但是需要注意的是,pytest 不会自动调用这个构造函数,你需要手动实例化这个类并传入相应的参数,否则就会收集不到用例。
示例:
class TestLogin:
def __init__(self):
print("我是构造函数。。。")
def test_login_class_success(self):
print("类-登录成功。。。")
def test_login_class_fail(self):
print("类-登录失败。。。")
if __name__ == '__main__':
pytest.main(["-s", "-q", "test_login.py"])
3.3、pytest执行用例规则
①、命令行执行:
# 目录下执行所有的用例
pytest
或者
py.test
# 执行单独一个pytest模块
pytest 文件名.py
# 运行某个模块里面的某个类
pytest 文件名.py::类名
# 运行某个模块里面某个类里面的方法
pytest 文件名.py::类名::方法名
# -v打印运行日志信息(详细)
pytest -v 文件名.py
# -q打印运行日志信息(简略)
pytest -q 文件名.py
# -s控制台输出结果
pytest -v -s 文件名.py
# s是带控制台输出结果,也是输出详细运行日志
# -m标记表达式
pytest -m login
将运行用 @pytest.mark.login 装饰器修饰的所有测试
3.2.9、-x用例运行失败则立即停止执行
pytest -x 文件名.py
3.2.10、-k运行包含关键字的用例
pytest -v -k "one" 文件名.py
执行测试用例名称包含 one 的所有用例
3.2.11、-k运行排除关键字的用例
pytest -v -k "not one" 文件名.py
执行测试用例名称不包含 one 的所有用例
3.2.12、-k运行匹配多个关键字的用例
pytest -v -k "one or two" 文件名.py
执行测试用例名称包含 one 或 two 的所有用例
3.2.13、--maxfail=num错误个数达到指定数量停止测试
pytest 文件名.py --maxfail=1
用例运行时允许的最大失败次数,超过则立即停止。
②、代码中运行:
# 使用pytest.main执行命令,命令参数写在list中,"test_login.py"为当前py文件的名称
pytest.main(["-s", "-q", "test_login.py"])