文章目录
-
- Pytest简介
- Pytest安装指令
- Pytest编写规则
- 项目结构目录
- 执行测试方法
- 常见指令参数
- Pytest插件使用
-
- Pytest-ordering
- 参考链接
Pytest简介
Pytest是一个易用、强大、灵活的功能测试框架,并且兼容unittest和nose的测试用例。
- 易用: 用例编写简单, 断言方便
- 强大: 全能的mark, 强大的fixtures
- 灵活: 灵活的执行控制及丰富的插件
Pytest安装指令
pip install pytest
Pytest编写规则
- 测试文件以test_开头,或以_test结尾
- 测试类以Test开头,并且不能带有 init 方法
- 测试函数以test_开头
- 断言使用python自带的assert
项目结构目录
假设我的项目结构如下图所示,在项目目录下专门创建了一个test文件夹,里面存放的都是与测试相关的文件。
├── my_project
├── src
├── main.py
└── test
├── pytest.ini
├── test_1.py
└── test_2.py
其中,
pytest.ini
为pytest的配置文件,名称是固定的不能随便更改,假设配置文件如下,这里我只是简单配置了下标签mark,后面会使用到mark:
[pytest]
markers =
mo1: module 1
假设在
main.py
中实现了一个非常简单的方法:
import math
def func(x: int, y: int):
return math.pow(x, y)
然后在测试文件中调用该方法,进行测试(在这里去实现自己需要测试的方法),假设
test_1.py
为(判断结果是否正确,主要是使用assert语句):
import pytest
from main import func
@pytest.mark.mo1
def test_interface1():
assert func(1, 1) == 1
@pytest.mark.mo1
def test_interface2():
assert func(2, 1) == 2
def test_interface3():
assert func(2, 2) == 4
注意,其中有些函数上添加了
@pytest.mark.mo1
装饰器,
mo1
是我们在
ini
文件中提前声明了的,后面可以指定去执行哪些标签mark下的测试方法。
执行测试方法
在项目根目录打开系统终端
- 执行test文件夹下所有测试文件
pytest -v ./test/
- 执行指定测试文件
pytest -v ./test/test_1.py
- 执行指定测试文件指定方法
pytest -v ./test/test_1.py::test_interface1
- 执行指定标签mark下的测试方法(这里就测试之前标注的
标签下的方法)mo1
pytest -v -m 'mo1' ./test/
通过终端输出可以看到,一共有6个测试方法,但属于
mo1
标签的只有2项,并仅测试这两项方法。
常见指令参数
-
表示输出更加详细的测试信息-v
-
表示一旦遇到测试失败就立即退出(默认情况是会执行所有测试样例的,无论是否有测试失败的情况)-x
-
为安静模式,测试过程中不会输出测试环境以及测试进度等信息,只返回测试结果-q
-
打印测试函数中的-s
输出,默认是不打印的print
-
仅执行指令标签mark下的测试方法-m
更多指令参数可查看pytest的帮助文档:
pytest -h
对于常用的参数指令可以直接写在
pytest.ini
文件的
addopts
中,这样就不需要手动输入了。
[pytest]
addopts = -v
markers =
mo1: module 1
Pytest插件使用
Pytest-ordering
有时在测试代码中可能需要按照一定的顺序去执行测试代码,此时可以使用
pytest-ordering
包来控制执行的顺序。
- 安装
pytest-ordering
pip install pytest-ordering
- 在测试代码中加上装饰器
,其中order代表着执行顺序,数字越小执行优先级越高。@pytest.mark.run(order=1)
import pytest
from main import func
@pytest.mark.run(order=1)
def test_interface1():
print("test1")
assert func(1, 1) == 1
@pytest.mark.run(order=3)
def test_interface2():
print("test2")
assert func(2, 1) == 2
@pytest.mark.run(order=2)
def test_interface3():
print("test3")
assert func(2, 2) == 4
- 再次执行测试程序
pytest -vs ./test/test_1.py
通过终端的输出,可以发现执行的顺序是按照我们给定的
order
顺序来执行的。pytest -vs ./test/test_1.py
参考链接
Pytest - 使用介绍
Pytest基础使用教程
pytest文档18-配置文件pytest.ini
Pytest系列 - pytest-ordering用例的执行顺序