全网非常详细的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 相关文章推荐
python实现类似ftp传输文件的网络程序示例
Apr 08 Python
python字符类型的一些方法小结
May 16 Python
有趣的python小程序分享
Dec 05 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python面向对象之类的封装操作示例
Jun 08 Python
pandas 时间格式转换的实现
Jul 06 Python
Django密码存储策略分析
Jan 09 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
python实现简单的三子棋游戏
Apr 28 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
咖啡的种类和口感
2021/03/03 新手入门
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
js变换显示图片的实例
2013/04/16 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
Python内置函数的用法实例教程
2014/09/08 Python
python中base64加密解密方法实例分析
2015/05/16 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
标记环介质访问控制协议
2016/03/27 面试题
什么是反射
2012/03/17 面试题
求职信名称怎么写
2014/05/26 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
外科护士长工作总结
2015/08/12 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
车位出租协议书范本
2016/03/19 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript