全网非常详细的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下自己编写web框架的一些要点
Apr 29 Python
Python中的ceil()方法使用教程
May 14 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
快速了解Python中的装饰器
Jan 11 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
浅谈对python中if、elif、else的误解
Aug 20 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
一个程序下载的管理程序(三)
2006/10/09 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
ionic2.0双击返回键退出应用
2019/09/17 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python先序遍历二叉树问题
2017/11/10 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python3实现逐字输出的方法
2019/01/23 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
零件设计自荐信范文
2013/11/27 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
原材料检验岗位职责
2014/03/15 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
志愿服务心得体会
2016/01/15 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers