pytest是一个非常成熟的全功能的Python测试框架,很多优秀源码如requests都在使用
安装
pip install pytest
编写规则
编写pytest测试样例非常简单,只需要按照下面的规则:
- 测试文件以test_开头(以_test结尾也可以)
- 测试类以Test开头,并且不能带有 init 方法
- 测试函数以test_开头
- 断言使用基本的assert即可
fixture的scope参数
scope参数有四种,分别是'function','module','class','session',默认为function。
- function:每个test都运行,默认是function的scope
- class:每个class的所有test只运行一次
- module:每个module的所有test只运行一次
- session:每个session只运行一次
setup和teardown操作
- setup,在测试函数或类之前执行,完成准备工作,例如数据库链接、测试数据、打开文件等
- teardown,在测试函数或类之后执行,完成收尾工作,例如断开数据库链接、回收内存资源等
- 备注:也可以通过在fixture函数中通过yield实现setup和teardown功能
一、函数级的(setup_function、teardown_function)只对函数用例生效,而且不在类中使用
二、类级的(setup_class、teardown_class)在类中使用,类执行之前运行一次,类执行之后运行一次
三、类中方法级的(setup_method、teardown_method)在每一个方法之前执行一次,在每一个方法之后执行一次
四、模块级的(setup_module、teardown_module)全局的,在模块执行前运行一遍,在模块执行后运行一遍
如何执行
- pytest # run all tests below current dir
- pytest test_mod.py # run tests in module file test_mod.py
- pytest somepath # run all tests below somepath like ./tests/
- pytest -k stringexpr # only run tests with names that match the
# the "string expression", e.g. "MyClass and not method"
# will select TestMyClass.test_something
# but not TestMyClass.test_method_simple - pytest test_mod.py::test_func # only run tests that match the "node ID",
# e.g "test_mod.py::test_func" will be selected
# only run test_func in test_mod.py
通过pytest.mark对test方法分类执行
通过@pytest.mark控制需要执行哪些feature的test,例如在执行test前增加修饰@pytest.mark.website
- 通过 -m "website" 执行有website标记的test方法
通过 -m "not website" 执行没有website标记的test方法
Console参数介绍
- -v 用于显示每个测试函数的执行结果
- -q 只显示整体测试结果
- -s 用于显示测试函数中print()函数输出
- -x, --exitfirst, exit instantly on first error or failed test
- -h 帮助
实时打印日志
pytest pytest_lean2.py -o log_cli=true -o log_cli_level=DEBUG
程序中使用logging.debug()即可以看到打印信息
测试报告
安装与样例
pip install pytest-cov # 计算pytest覆盖率,支持输出多种格式的测试报告
pytest --cov-report=html --cov=./ test_code_target_dir
.conftest
上面的案例都是写在同一个.py 文件内的。倘若有多个.py 文件需要调用 login() 方法,就必须把 login() 方法写在外面,这里引用了conftest.py 配置文件。test_xxx.py 测试文件中无需 import conftest,pytest 会自动搜索同级目录中的 conftest.py 文件。
conftest.py 与 测试文件 目录层级关系
# 新建conftest.py,和 test_sample.py 同级目录
import pytest
@pytest.fixture(scope='function')
def login():
print("登录")
# test_sample.py 代码如下
import pytest
def test_1():
print('测试用例1')
def test_2(login):
print('测试用例2')
if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])
pycharm配置,工具中选择
1.运行后生成测试报告(htmlReport)
安装pytest-html:
pip install -U pytest-html
运行模式:
pytest --html=report.html
模式1:直接运行test_se.py文件中的所有cases:
pytest test_se.py
模式2:运行test_se.py文件中的TestClassOne这个class下的两个cases:
pytest test_se.py::TestClassOne
模式3:运行test_se.py文件中的TestClassTwo这个class下的test_one:
pytest test_se.py::TestClassTwo::test_one
注意:定义class时,需要以T开头,不然pytest是不会去运行该class的。
3.多进程运行cases
当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。
安装pytest-xdist:
pip install -U pytest-xdist
运行模式:
pytest test_se.py -n NUM
其中NUM填写并发的进程数。
4.重试运行cases
在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。
安装pytest-rerunfailures:
pip install -U pytest-rerunfailures
运行模式:
pytest test_se.py --reruns NUM
NUM填写重试的次数。
参考
作者:呆呆冬
链接:https://www.jianshu.com/p/932a4d9f78f8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:呆呆冬
链接:https://www.jianshu.com/p/932a4d9f78f8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:呆呆冬
链接:https://www.jianshu.com/p/932a4d9f78f8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:红薯爱帅
链接:https://www.jianshu.com/p/a754e3d47671
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考文献
https://www.jianshu.com/p/a754e3d47671