pytest使用
1、pytest简介
pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:
- 简单灵活,容易上手,支持参数化。
- 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)。
- pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等。
- 测试用例的skip和xfail处理。
- 可以很好的和jenkins集成,CICD使用。
- report框架--allure也支持了pytest。
安装:
python3 -m pip install pytest
各种测试框架众多,测试业务集成框架的难度不一,排除框架已有便利不说,个人感觉关键在于下面几点:
- 业务相关核心代码的封装,提供统一的接口,使用例补充调用便捷,非web类测试业务尤甚。
- 清晰的调试过程信息输出,密切联系业务逻辑,进行关键性信息的埋点输出,并提供信息等级配置等。
- 测试用例的补充,断言的合理性。
2、如何使用
假定的我的目录结构为下图所示:
|- msc_py # 根目录
|- bvt_test # bvt自动化功能回归(pytest)
- isr_test.py # 听写测试
isr_test.py
部分代码如下:
@pytest.mark.aqc2vinfo
class TestAqc2vinfoClass(object):
def test_aqc2vinfo_equal_one(self):
print("\r\n")
res_kv = mac_test(
msc_params="sub=iat,ent=sms16k,aue=raw,prs=1,ars=1,auf=audio/L16;rate=16000,aqc=1,vinfo=1")
res_json_list = res_kv['result_json_list']
record_common_msg(res_kv)
assert "aqc" in res_json_list[0]
assert "vad" in res_json_list[0]
def test_vinfo_equal_one(self):
print("\r\n")
res_kv = mac_test(
msc_params="sub=iat,ent=sms16k,vad_speech_tail=3000,prs=1,ptt=0,rate=16000,rst=json,rse=utf8,aqc=1,vinfo=0")
res_json_list = res_kv['result_json_list']
record_common_msg(res_kv)
assert "aqc" in res_json_list[0]
assert "vad" not in res_json_list[0]
2.1 编写pytest测试样例
编写pytest测试样例非常简单,只需要按照下面的规则:
- 测试文件以test_开头(以_test结尾也可以)。
- 测试类以Test开头,并且不能带有
init
方法。 - 测试函数以test_开头。
- 断言使用基本的assert即可。
2.2 运行模式
运行时,直接切到测试用例目录执行pytest
即可,下面是一些参数介绍。
2.2.1 运行后生成测试报告(htmlReport)
生成html报告需要安装一个插件。
python3 -m pip install pytest-html
运行命令:
pytest --html=./report.html
2.2.2 运行指定的用例
如需要运行执行的用例时,有几种场景。
1、直接运行isr_test.py
下面所有用例。
pytest isr_test.py
输出如下:
(venv) F:\desktop\work\python\py36-32\batrec\bvt_test>pytest isr_test.py
================================================================================================ test session starts =================================================================================================
platform win32 -- Python 3.6.7, pytest-4.2.0, py-1.7.0, pluggy-0.8.1
rootdir: F:\desktop\work\python\py36-32\batrec\bvt_test, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-pytest-2.5.5
collected 80 items
isr_test.py
……
不需要这些版本等信息的话,可以加参数如下,quiet模式执行:
pytest -q isr_test.py
这里会全部用例挨个执行,一个点一个点的打出来表示成功。
对应的有打印详细信息:
pytest -v isr_test.py
2、直接运行isr_test.py
下TestAqc2vinfoClass
下的两个用例。
pytest isr_test.py::TestAqc2vinfoClass
这里可以看到类名上面有@pytest.mark.aqc2vinfo
这个装饰器,这个的作用是选择特定的用例执行。
only run tests matching given mark expression.example: -m 'mark1 and not mark2'.
pytest isr_test.py -v -s -m 'aqc2vinfo'
效果等同上面指定类名运行,但它可扩展运行更多的用例。
3、直接运行isr_test.py
下TestAqc2vinfoClass
下的test_aqc2vinfo_equal_one
方法用例。
pytest isr_test.py::TestAqc2vinfoClass::test_aqc2vinfo_equal_one
以上运行时,不利于调试,类似print、log等打屏信息没有输出,可加参数设置如下:
pytest --capture=no isr_test.py::TestAqc2vinfoClass::test_aqc2vinfo_equal_one
或短写形式:
pytest -s isr_test.py::TestAqc2vinfoClass::test_aqc2vinfo_equal_one
2.2.3 多进程运行用例
当用例过多时,运行所有的用例也会用时过长,如果想缩短用例运行时间,即要多进程来运行。
安装pytest-xdist
插件:
python3 -m pip install pytest-xdist
运行模式:
pytest -v -s isr_test.py -n NUM
NUM为想要并发的进程数目。
效果如下:
(venv) F:\desktop\work\python\py36-32\batrec\bvt_test>pytest -v -s -n 5 isr_test.py
================================================================================================ test session starts =================================================================================================
platform win32 -- Python 3.6.7, pytest-4.2.0, py-1.7.0, pluggy-0.8.1 -- f:\desktop\work\python\py36-32\venv\scripts\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.7', 'Platform': 'Windows-10-10.0.16299-SP0', 'Packages': {'pytest': '4.2.0', 'py': '1.7.0', 'pluggy': '0.8.1'}, 'Plugins': {'xdist': '1.26.1', 'metadata': '1.8.0', 'html': '1.20.0', 'forked
': '1.0.2', 'allure-pytest': '2.5.5'}, 'JAVA_HOME': 'E:\\software\\java\\jdk1.8'}
rootdir: F:\desktop\work\python\py36-32\batrec\bvt_test, inifile:
plugins: xdist-1.26.1, metadata-1.8.0, html-1.20.0, forked-1.0.2, allure-pytest-2.5.5
[gw0] win32 Python 3.6.7 cwd: F:\desktop\work\python\py36-32\batrec\bvt_test
[gw1] win32 Python 3.6.7 cwd: F:\desktop\work\python\py36-32\batrec\bvt_test
[gw2] win32 Python 3.6.7 cwd: F:\desktop\work\python\py36-32\batrec\bvt_test
[gw3] win32 Python 3.6.7 cwd: F:\desktop\work\python\py36-32\batrec\bvt_test
[gw4] win32 Python 3.6.7 cwd: F:\desktop\work\python\py36-32\batrec\bvt_test
[gw0] Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
[gw1] Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
[gw2] Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
[gw3] Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
[gw4] Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 12:45:02) [MSC v.1900 32 bit (Intel)]
gw0 [80] / gw1 [80] / gw2 [80] / gw3 [80] / gw4 [80]
scheduling tests via LoadScheduling
2.2.4 重试运行用例
在做接口测试时,有时会因为网络等问题,导致用例运行失败,这时可以通过重试运行用例来解决。
安装pytest-rerunfailures
插件:
python3 -m pip install pytest-rerunfailures
运行模式:
pytest -v -s isr_test.py -retuns NUM
NUM为想要重试的次数。
3、常用插件介绍
推荐已经使用过常用插件:
- pytest-html,生成html格式报告,本地调试推荐使用。(已集成)
- pytest-xdist,开启多个worker进程,同时执行多个测试用例,达到并发运行的效果,大大提升构建效率。(已集成)
- pytest-rerunfailures,自动重跑失败用例。
- pytest-cache,重跑上次失败的用例,持续集成中很实用,提高分析效率。
- pytest-sugar,改变了pytest的默认外观,增加了一个进度条,并立即显示失败的测试。(已集成)
- pytest-ordering,可指定一个测试套中的所有用例执行顺序。
- pytest-assume,多断言,第一个断言失败,第二个仍会执行。
- pytest-cov,单元测试过程中,指标:行覆盖率。
pytest插件及兼容性,这里可以看到更多的插件。
4、高阶使用
4.1 pytest相关
4.1.1 pytest原生
此节段暂不适用,保留待补充。
4.1.2 pytest插件
1、allsure使用
持续构建,集成CICD时,需要生成漂亮的allure报告,网上坑比较多,感谢pytest+allure配置使用。
这里以平台win为例,其它平台参见allsure官档。
a、安装PowerShell (win10自带有,其他系统自行安装)。
b、打开PowerShell,输入命令。
set-executionpolicy remotesigned -s cu
有提示的话输入[Y]。
再输入:
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
即scoop help
,出现选项帮助即安装成功。
c、安装allsure
.
scoop install allure
d、进入isr_test.py
文件的目录下,执行。
pytest --alluredir=reports
这里可能会报错,不行就把reports
换成绝对路径F:\desktop\work\python\py36-32\batrec\bvt_test\reports
。
pytest --alluredir=F:\desktop\work\python\py36-32\batrec\bvt_test\reports
然后当前目录中会多一个reports文件夹,里面是各种txt和json文件。
继续当前目录执行:
allure generate reports
存放用例的目录中会多一个allure-reports
文件夹,更新allure-reports
文件夹内容使用
allure generate reports --clean
最后复制allure-reports
目录下index路径,火狐打开,不要用其它浏览器,会有问题。
同样的allure也有一些用法,具体见上面的allure-pytest官档。
使用实例:
pytest -v -s -m aqc2vinfo --alluredir=F:\desktop\work\python\py36-32\batrec\bvt_test\reports isr_test.py
再allure生成在线报告,它会在默认的浏览器中打开:
allure serve reports
终极使用:
pytest -v -s -n 5 --alluredir=F:\desktop\work\python\py36-32\batrec\bvt_test\reports isr_test.py
4.2 奇技淫巧
这个命名,足以表明内心很兴奋的样子了,即python必不可少的ide编辑器pycharm
。它本身就不介绍了,下面是说它集成pytest。
打开设置:
File | Settings | Tools | Python Integrated Tools | default test runner | py.test
接下来就是很舒服的东西了,再次打开isr_test.py
代码,每个类,方法,它的左侧就有一个可执行的绿色三角按钮,点一下,就可以跑用例了,较与上面的pytest使用不遑多让,用例补充调试可谓很爽了。
5、其它
脚本运行期间如遇python抛错,脚本添加下面类似代码进行运行调试,找对应的维护人员。
test = TestAqc2vinfoClass()
test.test_aqc2vinfo_equal_one()
再运行:
python3 ist_test.py
网友评论