从0到1精通自动化测试,pytest自动化测试框架,配置文件pytest.ini(十三)

news2025/1/13 14:21:07

一、前言

pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行

二、ini配置文件

  1. pytest里面有些文件是非test文件
  2. pytest.ini pytest的主配置文件,可以改变pytest的默认行为
  3. conftest.py 测试用例的一些fixture配置
  4. _init_.py 识别该文件夹为python的package包
  5. tox.ini 与pytest.ini类似,用tox工具时候才有用
  6. setup.cfg 也是ini格式文件,影响setup.py的行为

ini文件基本格式

# 保存为pytest.ini文件

[pytest]

addopts = -rsxX
xfail_strict = ture

使用pytest —help指令可以查看pytest.ini的设置选项

—rsxX 表示pytest报告所有测试用例被跳过、预计失败、预计失败但实际被通过的原因

三、mark标记

如下案例,使用了2个标签:webtest和hello,使用mark标记功能对于以后分类测试非常有用处

# content of test_mark.py
import pytest

@pytest.mark.webtest
def test_send_http():
    print("mark web test")

def test_something_quick():
    pass

def test_another():
    pass

@pytest.mark.hello
class TestClass:
    def test_01(self):
        print("hello :")

    def test_02(self):
        print("hello world!")

if __name__ == "__main__":
    pytest.main(["-v", "test_mark.py", "-m=hello"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- D:\soft\python3.6\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.0', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'pytest': '3.6.3', 'py': '1.5.4', 'pluggy': '0.6.0'}, 'Plugins': {'metadata': '1.7.0', 'html': '1.19.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'D:\\soft\\jdk18\\jdk18v'}
rootdir: D:\MOMO, inifile:
plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collecting ... collected 5 items / 3 deselected

test_mark.py::TestClass::test_01 PASSED                                  [ 50%]
test_mark.py::TestClass::test_02 PASSED                                  [100%]

=================== 2 passed, 3 deselected in 0.11 seconds ====================

有时候标签多了,不容易记住,为了方便后续执行指令的时候能准确使用mark的标签,可以写入到pytest.ini文件

# pytest.ini
[pytest]

markers =
  webtest:  Run the webtest case
  hello: Run the hello case

标记好之后,可以使用pytest —markers查看到

$ pytest —markers
D:\MOMO>pytest --markers
@pytest.mark.webtest:  Run the webtest case

@pytest.mark.hello: Run the hello case

@pytest.mark.skip(reason=None): skip the given test function with an optional re
ason. Example: skip(reason="no way of currently testing this") skips the test.

@pytest.mark.skipif(condition): skip the given test function if eval(condition)
results in a True value.  Evaluation happens within the module global context. E
xample: skipif('sys.platform == "win32"') skips the test if we are on the win32
platform. see http://pytest.org/latest/skipping.html

@pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False):
 mark the test function as an expected failure if eval(condition) has a True val
ue. Optionally specify a reason for better reporting and run=False if you don't
even want to execute the test function. If only specific exception(s) are expect
ed, you can list them in raises, and if the test fails in other ways, it will be
 reported as a true failure. See http://pytest.org/latest/skipping.html

@pytest.mark.parametrize(argnames, argvalues): call a test function multiple tim
es passing in different arguments in turn. argvalues generally needs to be a lis
t of values if argnames specifies only one name or a list of tuples of values if
 argnames specifies multiple names. Example: @parametrize('arg1', [1,2]) would l
ead to two calls of the decorated test function, one with arg1=1 and another wit
h arg1=2.see http://pytest.org/latest/parametrize.html for more info and example
s.

@pytest.mark.usefixtures(fixturename1, fixturename2, ...): mark tests as needing
 all of the specified fixtures. see http://pytest.org/latest/fixture.html#usefix
tures

@pytest.mark.tryfirst: mark a hook implementation function such that the plugin
machinery will try to call it first/as early as possible.

@pytest.mark.trylast: mark a hook implementation function such that the plugin m
achinery will try to call it last/as late as possible.

最上面两个就是刚才写入到pytest.ini的配置了

四、禁用xpass

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

什么叫标记为@pytest.mark.xfail但实际通过,这个比较绕脑,看以下案例

# content of test_xpass.py
import pytest

def test_hello():
    print("hello world!")
    assert 1

@pytest.mark.xfail()
def test_momo1():
    a = "hello"
    b = "hello world"
    assert a == b

@pytest.mark.xfail()
def test_momo2():
    a = "hello"
    b = "hello world"
    assert a != b

if __name__ == "__main__":
    pytest.main(["-v", "test_xpass.py"])

测试结果

collecting ... collected 3 items

test_xpass.py::test_hello PASSED    [ 33%]
test_xpass.py::test_momo1 xfail     [ 66%]
test_xpass.py::test_momo2 XPASS     [100%]

=============== 1 passed, 1 xfailed, 1 xpassed in 0.27 seconds ================

test_momo1和test_momo2这2个用例一个是a == b一个是a != b,两个都标记失败了,我们希望两个用例不用执行全部显示xfail。实际上最后一个却显示xpass.为了让两个都显示xfail,那就加个配置
xfail_strict = true

# pytest.ini
[pytest]

markers =
  webtest:  Run the webtest case
  hello: Run the hello case

xfail_strict = true

再次运行,结果就变成

collecting ... collected 3 items

test_xpass.py::test_hello PASSED        [ 33%]
test_xpass.py::test_momo1 xfail         [ 66%]
test_xpass.py::test_momo2 FAILED        [100%]

================================== FAILURES ===================================
_________________________________ test_momo2 __________________________________
[XPASS(strict)] 
================ 1 failed, 1 passed, 1 xfailed in 0.05 seconds ================

这样标记为xpasx的就被强制性变成failed的结果

五、配置文件如何放

一般一个工程下方一个pytest.ini文件就可以了,放到顶层文件夹下

请添加图片描述

六、addopts

addopts参数可以更改默认命令行选项,这个当我们在cmd输入指令去执行用例的时候,会用到,比如我想测试完生成报告,指令比较长

$ pytest -v —rerun 1 —html=report.html —self-contained-html

 每次输入这么多,不太好记住,于是可以加到pytest.ini里

# pytest.ini
[pytest]

markers =
  webtest:  Run the webtest case
  hello: Run the hello case

xfail_strict = true

addopts = -v --rerun 1 --html=report.html --self-contained-html

这样我下次打开cmd,直接输入pytest,它就能默认带上这些参数了

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

【软件测试技术交流(资料分享)】:320231853(备注C)icon-default.png?t=N5K3http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=wvdQ7J4AdIhjWqHqp-aGkIYde-wLap1P&authKey=4Zvhap%2BH44eyRbqYp4nbq21NHkZHo8kyPWSvyY50ssokKTX0rEYT15ZCaKuJE0Zc&noverify=0&group_code=320231853生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot多环境启动

文章目录 多环境启动多环境启动基本格式多环境启动命令格式多环境启动的兼容性 多环境启动 多环境启动基本格式 我们在开发中和上线后的环境中, 有些配置文件的值是不相同的, 但是当项目上线后我们肯定是不能修改配置文件的, 于是我们需要针对不同的环境进行不同的配置 例如下…

【C语言之区分sizeof 和 strlen】

C语言之区分sizeof 和 strlen 详解C语言sizeof 和 strlen1、单目操作符1.1、详解sizeof单目操作符1.2、sizeof代码部分1.2.1、sizeof例程11.2.2、sizeof例程21.2.3、sizeof例程3 2、详解strlen函数2.1、strlen代码部分2.1.1、strlen例程1 3、区别strlen函数和sizeof操作符3.1、…

数据库—属性闭包

属性闭包 要理解属性闭包先理解以下概念 U属性集合,比如一个表A有这些属性**{a,b,c,d,e}**F函数依赖集 这个就是由已知的一些函数依赖组成的集合,比如: F {a->b,b->c,c->d,ab->e} //F函数依赖集R(U,F)表示一个关系模…

linux工程管理工具make

linux工程管理工具make 一、make 工具的功能二、makefile 文件三、makefile 的规则Makefile 介绍一、Makefile 的规则二、一个示例三、其他例子makefiletest.cprocess.cprocess.h截图 一、make 工具的功能 1、主要负责一个软件工程中多个源代码的自动编译工作 2、还能进行环境…

Spring boot装载模板代码工程实践问题之二

Spring boot装载模板代码工程实践问题解决方案 替代方案解决方案及解释 Spring boot装载模板代码工程中,后续有自定注解的要求,在本地运行无恙,打成jar启动后,自定义注解会无效。 替代方案 在测试compiler.getTask多种参数后&…

7.MMM

文章目录 MMM概念配置mysql配置文件主主复制主从服务器配置--只需要配置一个主服务器的安装mysql-MMM 测试故障测试客户端测试 MMM 概念 MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障切换和双…

git merge和git rebase的区别

本文来说下git merge和git rebase的区别 文章目录 分支合并解决冲突git rebase和git merge的区别本文小结 分支合并 git merge是用来合并两个分支的。比如:将 b 分支合并到当前分支。同样git rebase b,也是把 b 分支合并到当前分支。他们的 「原理」如下…

并发-操作系统底层工作的整体认识

冯诺依曼计算机模型 五大模块:输入、输出、计算器【cpu】、存储器【内存】、控制器 现在计算机硬件结构设计 CPU:控制、运算、数据

工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(三)

文章目录 机器人逆运动学△ 代数解求 θ 4 \theta_4 θ4​、 θ 5 \theta_5 θ5​、 θ 6 \theta_6 θ6​○ 求解 θ 4 \theta_4 θ4​○ 求解 θ 5 \theta_5 θ5​○ 求解 θ 6 \theta_6 θ6​ CSDN提示我字数太多,一篇发不下,只好拆分开x2。。。 关于…

shiro-all由1.3.2 升级到1.11.0后出现重定向次数过多的问题:ERR_TOO_MANY_REDIRECTS

最近漏洞升级, shiro-all由1.3.2 升级到1.11.0后, 导致系统登录首页打不开, 一直提示重定向次数过多: ERR_TOO_MANY_REDIRECTS: 经定位: 是shiroFilter配置中: loginUrl配置问题 以一下例子具体说明参数含义: 1,假设网站的网址是http://localhost…

基于STM32F407的智慧农业系统

文章目录 一、设备平台二、功能说明三、硬件系统设计实现与图表四、软件系统设计实现与流程图五、调试过程中出现的问题及相应解决办法六、程序设计1. 开始任务函数2. LED任务函数3. KEY任务函数4. UART任务函数5. OLED任务函数6. DHT11任务函数7. BEEP任务函数8. ADC任务函数9…

写一个简单的静态html页面demo,包含幻灯片

效果图&#xff1a; 代码如下&#xff0c;图片文件可自行更换&#xff1a; <!DOCTYPE html> <html> <head><title>公司网站</title><style>/* 样式定义 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}header {backgrou…

什么是Session

1、web中什么是会话 &#xff1f; 用户开一个浏览器&#xff0c;点击多个超链接&#xff0c;访问服务器多个web资源&#xff0c;然后关闭浏览器&#xff0c;整个过程称之为一个会话。 2、什么是Session &#xff1f; Session:在计算机中&#xff0c;尤其是在网络应用中&…

Linux学习之进程概念和ps命令

进程概念和启动关闭进程 进程就是运行中的程序 在C语言中进程只能只能从main()函数开始运行。 进程终止的方式有两种&#xff1a; 正常终止&#xff1a;从main()函数返回、调用exit()等方式 异常终止&#xff1a;调用abort、接收信号等。有可能 ps ps是“process status”的缩…

华为OD机试真题 Python 实现【光伏场地建设规划】【2023Q1 100分】

一、题目描述 祖国西北部有一片大片荒地&#xff0c;其中零星的分布着一些湖泊&#xff0c;保护区&#xff0c;矿区&#xff1b;整体上常年光照良好&#xff0c;但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站&#xff0c;生产清洁能源。对每平方公里的土…

React入门(B站李立超老师)

视频地址&#xff1a;https://www.bilibili.com/video/BV1bS4y1b7NV/ 课程第一部分代码&#xff1a; https://pan.baidu.com/s/16hEN7j4hLDpd7NoFiS8dHw?pwd4gxv 提取码: 4gxv 课程第二部分代码&#xff1a;https://pan.baidu.com/s/1mDkvLqYVz1QGTV1foz5mQg?pwd5zir 提取码&…

NCV2903DR2G 低偏移电压比较器

NCV2903DR2G安森美深力科是一款双独立精密电压比较器&#xff0c;能够进行单电源或分电源操作。这些设备被设计为允许在单电源操作的情况下实现共模范围到地电平。低至2.0 mV的输入偏移电压规格使该设备成为消费类汽车和工业电子中许多应用的绝佳选择。 特性&#xff1a; 1.宽…

从密码学了解如何确定物联网信息安全

一.物联网安全概述 1.信息安全的主要内容 2.密码学 编码学和分析学的关系&#xff1a;相互对立、相互依存、相互促进 3.密码学历史 1.第一阶段&#xff1a;几千年前到1949年&#xff0c;此时还没有形成一门科学&#xff0c;靠密码分析者的直觉和经验来进行 代表&#xff1a;C…

DAY35——贪心part4

1. class Solution {public boolean lemonadeChange(int[] bills) {int five 0;int ten 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {five;} else if (bills[i] 10) {five--;ten;} else if (bills[i] 20) {if (ten > 0) { //贪心 优先使用面值为10的…

8.2 PowerBI系列之DAX函数专题-进阶-实现切片器筛选之间的or逻辑

需求 两个切片器之间都被选中的情况下&#xff0c;实现符合切片器条件的并集的结果呈现&#xff0c;而非交集的结果呈现&#xff0c; 实现 or #1 var occupations values(customer[occupation]) --获取到当前切片器选中的值 var bands values(product[brand]) return s…