pytest可以用来做系统测试 的自动化, 它的特点如下:
安装
直接执行如下命令即可安装 pytest:
python3 -m pip install pytest
一般还需要产生测试报表,所以要安装一个第三方插件 pytest-html ,使用如下命令安装:
python3 -m pip install pytest-html
使用
在pytest 框架中寻找测试项 的具体规则:
-
如果未指定命令行参数,则从 testpath(如果已配置)或当前目录开始收集,如果命令行参数, 指定了 目录、文件名 或 node id 的任何组合,则按参数来找 -
寻找过程会递归到目录中,除非它们匹配上 norecursedirs -
在这些目录中,搜索由其测试包名称导入的 test_*.py 或 *_test.py 文件
从这些文件中,收集如下测试项:
- test为前缀 的
函数 - Test为前缀的
类 里面的test为前缀的方法
常用参数:
如果我们希望 显示测试代码中print的内容,因为这些打印语句在调试代码时很有用,可以加上命令行参数 -s,如下
pytest -s
执行 pytest 时, 如果命令行没有指定目标目录 或者 文件, 它会自动搜索当前目录下所有符合条件的文件、类、函数。如果我们希望得到更详细的执行信息,包括每个测试类、测试函数的名字,可以加上参数 -v,这个参数可以和 -s 合并为 -sv,如下:
pytest -sv
为了防止 pytest 到其他目录中找测试用例项,执行测试时,我们可以在命令行加上目标目录 cases ,就是这样
pytest cases
要产生报告,在命令行加上 参数 --html=report.html --self-contained-html ,如下
pytest cases --html=report.html
初始化和清除模块:这样就会产生名为 report.html 的测试报告文件,可以在浏览器中打开。
- 模块级别的初始化、清除 在 整个模块所有用例 执行前后 分别
执行1次, 它主要是用来为该 模块 中 所有的测试用例做 公共的 初始化 和 清除 - 类级别的初始化、清除 在 整个模块所有用例 执行前后 分别
执行1次 ,它主要是用来为该 类 中的所有测试用例做 公共的 初始化 和 清除 - 方法别的初始化、清除 在 整个模块所有用例 执行前后 分别
执行1次,它主要是用来为该 方法 中的内容做 公共的 初始化 和 清除 目标级别的 初始化清除,就是针对整个目录执行的初始化、清除
如下定义 setup_module 和 teardown_module 全局函数:
def setup_module():
print('\n *** 初始化-模块 ***')
def teardown_module():
print('\n *** 清除-模块 ***')
pytest 可以灵活的挑选测试用例执行挑选测试用例执行:
指定一个模块
可以像这样只挑选一个模块执行:
pytest cases\登录\test_错误登录.py
指定目录
pytest cases
也可以指定多个目录
pytest cases1 cases2
指定模块里面的函数或者类
指定一个类
pytest cases\登录\test_错误登录.py::Test_错误密码
也可以指定类里面的方法
pytest cases\登录\test_错误登录.py::Test_错误密码::test_C001001
根据名字
可以使用 命令行参数 -k 后面加名字来挑选要执行的测试项
比如像这样后面跟测试函数名字的一部分:
pytest cases
也可以指定多个目录
pytest cases1 cases2
pytest -k C001001 -s
注意,-k 后面的名字
可以是测试函数的名字,可以是类的名字,可以是模块文件名,可以是目录的名字
是大小写敏感的
不一定要完整,只要能有部分匹配上就行
可以用 not 表示选择名字中不包含,比如
pytest -k "not C001001" -s
可以用 and 表示选择名字同时包含多个关键字,比如
pytest -k "错 and 密码2" -s
可以用 or 表示选择名字 包含指定关键字之一即可,比如
pytest -k "错 or 密码2" -s
根据标签
参考官方文档
可以这样给 某个方法加上标签 webtest
import pytest
class Test_错误密码2:
@pytest.mark.webtest
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
然后,可以这样运行指定标签的用例
pytest cases -m webtest -s
也可以这样给整个类加上标签
@pytest.mark.webtest
class Test_错误密码2:
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
可以这样定义一个全局变量 pytestmark 为 整个模块文件 设定标签
import pytest
pytestmark = pytest.mark.网页测试
如果你需要定义多个标签,可以定义一个列表
import pytest
pytestmark = [pytest.mark.网页测试, pytest.mark.登录测试]
|