全网非常详细的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妙用之编码的转换详解
Apr 21 Python
Python 12306抢火车票脚本
Feb 07 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
Python对excel文档的操作方法详解
Dec 10 Python
pandas中的series数据类型详解
Jul 06 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python装饰器代替set get方法实例
Dec 19 Python
django从后台返回html代码的实例
Mar 11 Python
python属于软件吗
Jun 18 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Python ellipsis 的用法详解
Nov 20 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 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
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
js倒计时小程序
2013/11/05 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python多进程原理与用法分析
2018/08/21 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
Python 处理文件的几种方式
2019/08/23 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Python阶乘求和的代码详解
2020/02/14 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
最经典的商业地产项目广告词
2014/03/13 职场文书
抽奖活动主持词
2014/03/31 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
同学毕业留言寄语
2015/02/27 职场文书
行政经理岗位职责
2015/04/15 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
Python OpenCV之常用滤波器使用详解
2022/04/07 Python