pytest单元测试框架
什么是单元测试框架
单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试
单元测试框架主要做什么
测试发现:从多个文件里面去找到我们测试用例
测试执行:按照一定的顺序和规则去执行,并生成结果
测试判断:通过断言判断预期结果和实际结果的差异
测试报告:统计测试进度,耗时,通过率,生成测试报告
单元测试框架和自动化测试框架的关系
自动化测试框架:
提高测试效率,降低维护成本
减少人工干预,提高测试的准确性,增加代码的重用性
核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试
单元测试框架只是自动化测试框架的组成部分之一
需要安装的插件
pytest
pytest-html # 生成html格式的自动化测试报告
pytest-xdist # 测试用例分布式执行,多CPU分发
pytest-ordering # 用于改变测试用例多执行顺序
pytest-rerunfailures # 用例失败后重跑
allure-pytest # 用于生成美观的测试报告
默认的测试用例规则
- 模块名必须以
test_
开头或者以_test
结尾 - 测试类必须以
Test
开头,并且不能有init方法 - 测试方法必须以
test
开头
基础应用
运行方式
主函数模式
通过程序入口:if __name__ == '__main__':
下来执行(1) 运行所有:
pytest.main()
(2) 指定模块运行:pytest.main(['文件名'])
,如果不指定文件名,它会自动(3) 寻找当前文件夹下所有符合条件的文件并执行。指定文件夹执行:
pytest.main(['路径/文件夹名'])
(4) 通过nodeid去执行:
解释一下nodeid,nodeid由模块名,分隔符,类名,方法名,函数名组成, 通过
::
来分割类、方法、函数pytest.main(['-vs', './文件夹名/文件名::类名::方法名'])
,如果是函数测试的话,那直接文件名后用::
分割,写上函数即可。命令行模式
在当前目录下,执行pytest
或者python -m pytest
至于,为什么可能会执行
python -m pytest
呢,是因为有可能你执行pytest会找不到,这是因为通过pip安装pytest不会使其成为系统命令,而是会将其安装到python。-m命令将pytest作为其自己的命令运行,然后任何后续脚本都将作为参数。通过读取pytest.ini配置文件运行
参数详解
-s
: 表示输出调试信息,包括print打印出的信息,如果使用主函数模式,他的传参方式是一个数组,看起来像是这样
pytest.main(['-s'])
如果是命令行模式,就直接pytest -s
即可
-v
:输出用例的类名和方法名,可以和-s
一起用
-n
:支持多线程或者分布式运行测试用例,前提是安装了pytest-xdist
,用法,在命令行-n 2
代表启用两个线程,这个线程数可以根据需要来自己定义,在入口函数中使用的话,就直接-n=线程数
即可
--reruns
:代表失败后重跑,前提是安装了pytest-rerunfailures
,用法,在命令行--reruns 2
即可,后面的数字代表,如果失败了再跑几次,如果超过这个数它还是报错,那就说明这个东西它已经没救了。可以放弃治疗,在入口中,使用方法和-n
一致。
-x
:只要有一个用例错误,测试停止
--maxfail 2
:失败两个用例,才会停止
-k 'XXX'
:根据测试用例的部分字符串指定测试用例,比如你的函数名带QQ的,那么,-k 'QQ'
,只有带QQ的才会被执行,不带的则会直接跳过
执行顺序
pytest默认是从上到下执行,这个和
unittest
的执行方式不同,unittest
的顺序是由ascll
码来决定顺序
标记更改执行顺序
标记更改,手动的去标记某些方法或者函数的执行顺序,这个是需要使用到装饰器,@pytest.mark.run(order=1)
的
order,代表的是第几个执行,例如:order=1,则是第一个执行
前提是,你安装了
pytest-ordering
配置文件执行
无论是命令行模式还是入口函数模式,真正使用起来并不多,而最多的是使用配置文件,就像我们使用docker,是可以一个个的使用dockerfile来写,但是没人会这么做吧,还是一个docker-componse解决。pytest的配置文件名,是
pytest.ini
,一般来说,放在文件的根目录,这个没有什么可说的,但是需要 注意 的是,他的编码,必须是ANSI
,可以使用notpad++来更改,或者更直接点,我们通过python代码来手动更改
import os
import codecs
# oldfile:UTF8文件的路径
# newfile:要保存的ANSI文件的路径
def convertUTF8ToANSI(oldfile, newfile):
#打开UTF8文本文件
f = codecs.open(oldfile, 'r', 'utf8')
utfstr = f.read()
f.close()
# 把UTF8字符串转码成ANSI字符串
outansestr = utfstr.encode('mbcs')
# 使用二进制格式保存转码后的文本
f = open(newfile, 'wb')
f.write(outansestr)
f.close()
# 头部格式,不可更改
[pytest]
# 命令行参数,用空格分割
addopts = -vs
# 测试用例文件夹路径,可自己配置
testpaths = ./test_profile
# 配置测试搜索的模块文件名称,我们之前说过,文件名、类名、方法名都必须是固定格式,但是,这里我们变了,我们可以通过这里来设置自己定义的
python_files = test*.py
# 配置测试搜索的测试类名
python_classes = Test*
# 配置测试搜索的测试方法名
python_functions = test
- Post link: https://www.godhearing.cn/pytest/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.