全网非常详细的pytest配置文件


Posted in Python onJuly 15, 2022

说到配置,大家可能想到的是不经常更改的内容,比如Django里的settings.py文件,或者我们做自动化的时候,把测试环境的域名和正式环境的域名放到一个配置文件里,所有的接口都从这个文件里读取。这样,如果有一天,我们的域名变了,我们只需要更改配置里的域名就可以了。pytest里也有几个配置文件。

  • pytest.ini:pytest的主配置文件,可以改变pytest的默认行为,有很多可配置的选项。
  • conftest.py:是本地的插件库,其中的hook函数和fixture将作用于该文件所在的目录以及所有子目录。
  • __init__.py:每个测试子目录都包含该文件时,那么在多个测试目录中可以出现同名测试文件。
  • tox.ini:它与pytest.ini类似,只不过是tox的配置文件,你可以把pytest的配置都写在tox.ini里,这样就不用同时使用tox.ini和pytest.ini两个文件

更改默认命令行选项

我们之前已经用过pytest命令行选项了,比如-v/--verbose可以输出详细信息,-l/--showlocals可以查看失败测试用例里堆栈中的局部变量。你也许经常要用到某些参数,又不想重复输入,这时可以使用pytest.ini文件里的addopts设置。

[pytest]
addopts = -rsxX -l --tb=short --strict

--rsxX表示pytest报告所有测试用例被跳过、预计失败、预计失败但实际通过的原因。-l表示pytest报告所有失败测试的堆栈中的局部变量。--tb=short表示简化堆栈回溯信息,只保留文件和行数。--strict选项表示禁止使用未在配置文件中注册的标记。

我们有个test_two.py文件,里面有如下代码

def inc(x):
    return x + 1

def test_answer():
    assert inc(3) == 55

def test_answer1():
    assert inc(4) == 5

我们没有添加如上命令执行一遍

全网非常详细的pytest配置文件

再去pytest.int里添加上上面的代码,在去执行一遍

全网非常详细的pytest配置文件

注册标记来防止拼写错误

在前面我们学过,自定义标记可以简化测试工作,让我们用指定的标记运行某个测试子集。但是,标记很容易拼错,比如把@pytest.mark.smoke拼成@pytest.mark.somke,默认情况下。这不会引起程序错误。pytest会以为这是你创建的另一个标记。为了避免拼写错误。可以在pytest.ini文件里注册标记

[pytest]
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

修改test.two.py

import pytest
def inc(x):
    return x + 1

@pytest.mark.smoke
def test_answer():
    assert inc(3) == 55

@pytest.mark.post
def test_answer1():
    assert inc(4) == 5

标记注册好后,可以通过pytest --markers来查看

全网非常详细的pytest配置文件

没有注册的标记不会出现在--markers列表里。如果使用了--strict选项,遇到拼写错误的标记或未注册的标记就会报错。

pytest.ini里写如下代码

[pytest]
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

全网非常详细的pytest配置文件

上面的代码我们在执行的时候,把smoke故意写错了,也没有报错,只是给我们一个警告,只需要我们在ini里注册下就不会有警告了

在去修改pytest.ini里的代码

[pytest]
addopts = -rsxX -l --tb=short --strict
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

全网非常详细的pytest配置文件

我们在ini里加上了addopts = -rsxX -l --tb=short --strict 这句代码之后,如果我们拼错了就会报错

全网非常详细的pytest配置文件

指定pytest的最低版本号

有些功能是随着pytest版本的更新而加入到里面的,如果我们不想用比较低的版本,可以在配置里指定最低的版本号。

minversion选项可以指定运行测试用例的pytest的最低版本。

[pytest]
minversion = 4.0

如果使用了老版本的pytest运行该测试,就会得到一个错误信息。

指定pytest忽略某些目录

pytest执行测试搜索时,会递归遍历所有子目录,包括某些你明知道没必要遍历的目录。遇到这种情况,你可以使用norecurse选项简化pytest的搜索工作。

norecurse的默认设置是 .* build dist CVS -darcs {arch}和 *.egg。因为有 .*,所以将虚拟环境命名为.venv是一个好注意,所有以.(点)开头的目录都不会被访问。如果不是以.(点)开头,那么需要把它加入norecursedirs里。比如我想忽略test_001目录

[pytest]
norecursedirs = .* venv test_001 *.egg dist build

先来看下目录结构

全网非常详细的pytest配置文件

test_one.py

import pytest
def test_case_01():
    assert 0 == 0

def test_case_02():
    assert 0 == 0

test_one.py

test_first

import pytest
def inc(x):
    return x + 1

@pytest.mark.smoke
def test_answer():
    assert inc(3) == 55

@pytest.mark.post
def test_answer1():
    assert inc(4) == 5

test_first

如果我们不指定norecursedirs就会执行djangotest目录下的所有文件

全网非常详细的pytest配置文件

指定norecursedirs

[pytest]
norecursedirs = .* venv test_001 *.egg dist build
addopts = -rsxX -l --tb=short --strict
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()
    smoek: run
    post: Run post

全网非常详细的pytest配置文件

也可以指定多个目录

[pytest]
norecursedirs = .* venv test_001 test_002 *.egg dist build

指定测试目录

norecuredirs告诉pytest哪些路径不用访问,而testpaths则指示pytest去哪里访问。testpaths是一系列相对于根目录的路径,用于限定测试用例的搜索范围。只有在pytest未指定文件目录参数或测试用例标识符时,该选项才有作用

如果我们只想执行test_001下的测试用例,则可以把test_001放到testpaths里

[pytest]
testpaths = test_001

全网非常详细的pytest配置文件

那如果我既指定了testpaths和norecursedirs ,而且两个是一样的,结果会怎样

[pytest]
testpaths = test_001
norecursedirs = .* venv test_001  *.egg dist build

全网非常详细的pytest配置文件

从运行结果可以看出,如果两个都指定,且冲突的话,是按照指定的testpaths执行的,是不是因为testpaths在上面的原因导致的?我们换一下顺序

[pytest]
norecursedirs = .* venv test_001  *.egg dist build
testpaths = test_001

全网非常详细的pytest配置文件

从上面两次的运行结果可以看出,如果既指定了testpaths和norecursedirs ,而且两个是一样的,则是按照testpaths执行的

更改测试搜索的规则

pytest根据一定的规则搜索并运行测试,标准的测试搜索规则如下。

  • 从一个或多个目录开始查找。你可以在命令行指定文件名或目录名。如果未指定,则使用当前目录
  • 在该目录和所有子目录下递归查找测试模块
  • 测试模块是指文件名为test_*.py或*_test.py的文件
  • 在测试模块中查找以test_开头的函数名。
  • 查找名字以Test开头的类,其中,首先筛选掉包含__init__函数的类,在查找类中以Test_开头的类方法

以上是标准的测试搜索规则,你也可以更改它们

python_classes

通常pytest的测试搜索规则是寻找以Test*开头的测试类,而且这个类不能有__init__()函数。但是,如果把测试类命名为<something>Test或<something>Suite怎么办?python_classes就可以解决这个问题。

[pytest]
python_classes = *Test Test* *Suite

这个设置允许我们像下面这样给类取名

class DeleteSuite():
    def test_delete_1(self):
        pass
    def test_delete_2(self):
        pass

我们修改test_001目录下的test_onne.py文件

class DeleteSuite():
    def test_delete_1(self):
        assert True

    def test_delete_2(self):
        assert False

先不添加python_classes执行一下

全网非常详细的pytest配置文件

然后我们添加上python_classes执行一下

[pytest]
python_classes = *Test Test* *Suite

全网非常详细的pytest配置文件

python_files

像pytest_classes一样,python_files可以更改默认的测试搜索规则,而不是仅查找以test_*开头的文件和以*_test结尾的文件

假设你的测试文件统一命名为check_<something>.py。你不必重命名所有的测试文件,只要在pytest.ini文件里增加一行配置即可

[pytest]
python_files = test_* *_test check_*

我们将test_one.py改为check_one.py在执行

[pytest]
python_files = test_* *_test check_*
python_classes = *Test Test* *Suite

全网非常详细的pytest配置文件

python_functions

python_functions与之前的两个设置类似,它只是用来测试函数和方法的命名。more规则以test_*开头。如果想添加check_*,则只需要添加一行配置

[pytest]
python_functions = test_* check_*

修改test_one.py下的代码

class DeleteSuite():
    def check_delete_1(self):
        assert True

    def check_delete_2(self):
        assert False
[pytest]
python_functions = test_* check_*
python_files = test_* *_test check_*
python_classes = *Test Test* *Suite
addopts = -rsxX -l -v --tb=short --strict

全网非常详细的pytest配置文件

禁用XPATH

设置xfail_strict = true将会使那些被标记为@pytest.mark.xfail但实际通过的测试用例也被报告为失败

[pytest]
xfail_strict = true

很难理解是吧!!!喝杯茶,我给你给个栗子吃

test_one.py代码如下,可以看到,我们有两个测试用例,都是标记的预期失败,但其中一个是会成功,一个是失败的,我们不加xfail_strict = true来执行一下

import pytest

@pytest.mark.xfail()
def test_answer():
    assert 5 == 5

@pytest.mark.xfail()
def test_answer1():
    assert 5 != 5

全网非常详细的pytest配置文件

可以看到有一个通过了,有一个失败了,但是我们如果想把标记为预期失败的,不管结果是成功还是失败都标记为失败,则要在配置里加xfail_strict = true

[pytest]
xfail_strict = true

全网非常详细的pytest配置文件

这样两个用例就都是失败的

到此这篇关于全网非常详细的pytest配置文件的文章就介绍到这了,更多相关pytest配置文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Python 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
python入门教程之识别验证码
Mar 04 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
dataframe设置两个条件取值的实例
Apr 12 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
pytorch构建多模型实例
Jan 15 Python
tensorflow 限制显存大小的实现
Feb 03 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
Python如何加载模型并查看网络
Jul 15 #Python
Python绘制散点图之可视化神器pyecharts
Jul 07 #Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 #Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 #Python
Django数据库(SQlite)基本入门使用教程
Jul 07 #Python
Python可视化神器pyecharts之绘制地理图表练习
Django中celery的使用项目实例
You might like
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
PHP实现的日历功能示例
2018/09/01 PHP
表单JS弹出填写提示效果代码
2011/04/16 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
python组合无重复三位数的实例
2018/11/13 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
python retrying模块的使用方法详解
2019/09/25 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
高中生毕业学习总结的自我评价
2013/11/14 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
生产部经理岗位职责
2013/12/16 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
送给客户微信问候语!
2019/07/04 职场文书
php双向队列实例讲解
2021/11/17 PHP
Python matplotlib多个子图绘制整合
2022/04/13 Python