Pytest测试框架基本使用方法详解
作者:-零 发布时间:2022-06-23 20:49:04
pytest介绍
pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:
1、简单灵活,容易上手,文档丰富;
2、支持参数化,可以细粒度地控制要测试的测试用例;
3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
4、pytest具有很多第三方插件,并且可以自定义扩展
如pytest-selenium(集成selenium)、
pytest-html(完美html测试报告生成)、
pytest-rerunfailures(失败case重复执行)、
pytest-xdist(多CPU分发)、
pytest--ordering(控制测试运行的顺序)
5、测试用例的skip和xfail处理;
6、可以很好的和CI工具结合,例如jenkins
编写规则:
测试文件以test_开头(以_test结尾也可以)
测试类以Test开头,并且不能带有 init 方法
测试函数以test_开头
断言使用基本的assert即可
快速示例
test_pyexample.py
import pytest
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
def test_three(self):
a = "hello"
b = "hello world"
assert a in b
通过命令行运行:
1、cd 到代码所在的目录,执行命令:py.test test_pyexample.py
2、安装pytest-sugar插件可以看到进度条
Pycharm配置运行:
1.file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test
import pytest
class TestClass:
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
def test_three(self):
a = "hello"
b = "hello world"
assert a in b
if __name__ == "__main__":
pytest.main('-q test_class.py')
Console常用参数介绍:
-v 用于显示每个测试函数的执行结果
-q 只显示整体测试结果
-s 用于显示测试函数中print()函数输出
-x, --exitfirst, exit instantly on first error or failed test
-m 只运行带有装饰器配置的测试用例
-h 帮助
py.test # run all tests below current dir
py.test test_mod.py # run tests in module file test_mod.py
py.test somepath # run all tests below somepath like ./tests/
py.test -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
py.test 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参数化
使用装饰器:@pytest.mark.parametrize()
单个参数:
import pytest
import random
@pytest.mark.parametrize('x',[(1),(2),(6)])
def test_add(x):
print(x)
assert x==random.randrange(1,7)
多个参数:
import pytest
@pytest.mark.parametrize('x,y',[
(1+2,3),
(2-0,1),
(6*2,12),
(10*2,3),
("test","test"),
])
def test_add(x,y): #必须与上面保持一致,只能用x,y不能用其他字母
assert x==y
控制测试运行顺序
安装pytest-ordering
pip install pytest-ordering
借助于装饰器@pytest.mark.run(order=1)控制测试运行的顺序
import pytest
import time
value=0
@pytest.mark.run(order=2) #后执行order=2
def test_add2():
print("I am 2")
time.sleep(2)
assert value==10
@pytest.mark.run(order=1) #先执行order=1
def test_add():
print("I am add")
global value
value=10
assert value==10
运行后生成测试报告(htmlReport)
安装pytest-html:
pip install -U pytest-html
如何使用:
py.test test_pyexample.py --html=report.html
更详细的测试报告
安装 pytest-cov:
pip install pytest-cov
如何使用
py.test --cov-report=html --cov=./ test_code_target_dir
Console参数介绍
--cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
--cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
--cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
--no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
--cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败
多进程运行
安装pytest-xdist:
pip install -U pytest-xdist
如何使用:
py.test test_pyexample.py -n NUM
其中NUM填写并发的进程数。
重新运行失败的用例
安装pytest- rerunfailures:
import random
def add(x,y):
return x+y
def test_add():
random_value=random.randint(2,7)
print('random_value:'+str(random_value))
assert add(1,3)==random_value
如何使用:
命令:pytest --reruns 重试次数
比如:pytest --reruns 3表示:运行失败的用例可以重新运行3次
命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)
比如:pytest --reruns 3 --reruns-delay 5表示:(译:瑞软四、地类)运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟
另外也可以通过装饰器的方式配置:
@pytest.mark.flaky(reruns=3, reruns_delay=5)
来源:https://www.cnblogs.com/-wenli/p/13953634.html
猜你喜欢
- 程序设计中会经常碰到一种情况,就是事先无法得知用户会需要哪些数据,必须根据用户选择后再从服务器重新提取数据后反馈给用户。比如一简单的情况,用
- 本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下加密virginia加密是一种多表替换加密方法,通过这种方
- 自相关图是一个平面二维坐标悬垂线图。横坐标表示延迟阶数,纵坐标表示自相关系数偏自相关图跟自相关图类似, 横坐标表示延迟阶数,纵坐标表示偏自相
- 前言Vuex 和 Pinia 是用于管理 Vue.js 应用程序状态的标准 Vue.js 库。让我们比较一下他们的代码、语言、功能和社区支持
- @StartIndex为当前页起始序号,@EndIndex为当前页结束记录序号,可以直接作为参数输入,也可以通过输入PageSize和Pag
- 小程序模板消息即将被废弃掉,于是有了新接口wx.requestSubscribeMessage订阅消息文档步骤:1、获取用户openid 、
- 1、自动化代码中,用到了哪些设计模式?单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式2、什么是断言( Assert) ?断
- PHP7.0正式版也出来了,今天编译安装了一下,写下安装步骤,我是在centos6.6 环境中编译的,下面是详细的安装步骤环境依赖yum i
- terminal(命令行)作为本地IDE普遍拥有的功能,对项目的git操作以及文件操作有着非常强大的支持。对于WebIDE,在没有web伪终
- 通信信息包是发送至MySQL服务器的单个SQL语句,或发送至客户端的单一行。在MySQL 5.1服务器和客户端之间最大能发送的可能信息包为1
- 1.max取最大值函数max() 方法返回给定参数的最大值,参数可以为序列。lis = [1,2,3,-4]print(max(lis))
- 一、程序导出word文档的方法将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob、Apache PO
- 一、ROC与AUC很多学习器是为了测试样本产生的一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值
- 插入排序插入排序,英文名(insertion sort)是一种简单且有效的比较排序算法。思想: 在每次迭代过程中算法随机地从输入序
- 本文对于先前系列文章中实现的C/Python代码统计工具(CPLineCounter),通过C扩展接口重写核心算法加以优化,并与网上常见的统
- 最近在学爬虫时发现许多网站都有自己的反爬虫机制,这让我们没法直接对想要的数据进行爬取,于是了解这种反爬虫机制就会帮助我们找到解决方法。常见的
- 常用方法浅拷贝copya = {"ilpy1": {"company": "aaa&quo
- 终于构建出了第一个神经网络,Keras真的很方便。之前不知道Keras这么方便,在构建神经网络的过程中绕了很多弯路,最开始学的TensorF
- 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项可以是不同的类型,可以是字符串,可以是数字类型,甚至
- 具体方法:1使用panda read_excel 方法加载excel2使用concat将DataFrame列表进行拼接3然后使用pd.Exc