Pytest 使用及调用方法

使用python -m pytest调用pytest

2.0版本新增
你可以在命令行中通过Python编译器来调用Pytest执行测试:

python -m pytest [...]

通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]

可能出现的执行退出code

执行pytest可能会出现6中不同的退出code:

使用内置断点方法

Python 3.7引入了内置breakpoint()函数。 Pytest支持以下几种使用breakpoint()的方式:

分析测试用例执行时间

显示执行最慢的10条测试用例如:

  • 退出code 0: 收集并成功通过所有测试用例
  • 退出code 1: 收集并运行了测试,部分测试用例执行失败
  • 退出code 2: 测试执行被用户中断
  • 退出code 3: 执行测试中发生内部错误
  • 退出code 4: pytest命令行使用错误
  • 退出code 5: 没有收集到测试用例
  • 获取版本路径、命令行选项及环境变量相关帮助
     pytest --version # 显示pytest导入位置 pytest --fixtures # 显示可用的内置方法参数 pytest -h --help # 显示命令行及配置文件选项帮助信息
  • 第1(N)次失败后停止测试

    在第1(N)次用例失败后停止测试执行:

    pytest -x # 第1次失败后停止 pytest --maxfail=2 # 2次失败后停止
  • 指定及选择测试用例

    Pytest支持多种从命令行运行和选择测试用例的方法。
    运行模块内所有用例

  • pytest test_mod.py

  • 运行目录内所有用例

  • pytest testing/

  • 按关键字表达式运行用例

  • pytest -k "MyClass and not method"

  • 这将运行包含与指定表达式匹配的名称的测试用例,其中可以包括文件名、类名和函数名作为变量,并且支持Python运算符(and和or)操作。上面的示例将运行TestMyClass.test_something但不运行TestMyClass.test_method_simple。

    按节点id运行测试
    每次执行收集到的测试用例集合都会被分配一个唯一的nodeid,其中包含模块文件名,后跟说明符,如类名、函数名及参数,由:: 字符分隔。
    执行模块中某条指定的测试用例如:

  • pytest test_mod.py::test_func

  • 通过标记(Mark)表达式运行测试

  • pytest -m slow

  • 这将会执行所有带@pytest.mark.slow装饰器的用例。

  • 从包中运行测试

  • pytest --pyargs pkg.testing

  • 这将会导入pkg.testing并使用其文件系统位置来查找和运行测试。

    修改Python原生追溯(traceback)信息

    修改回追溯信息示例如:

  • pytest --showlocals # 在追溯信息中显示局部变量 pytest -l # 显示局部变量 (简写) pytest --tb=auto # (默认) 第1和最后1条使用详细追溯信息,其他使用简短追溯信息 pytest --tb=long # 详尽,信息丰富的追溯信息格式 pytest --tb=short # 简短的追溯信息格式 pytest --tb=line # 每个失败信息一行 pytest --tb=native # Python标准库格式 pytest --tb=no # 不使用追溯信息

  • 详尽的测试结果摘要

    2.9版本新增
    -r标志可用于在测试会话结束时显示测试结果摘要,从而可以在拥有大量用例的测试套件中轻松获得所有失败、跳过、标记失败(xfails)等测试结果的清晰描述。
    例如:

  • $ pytest -ra =========================== test session starts ============================ platform linux -- Python 3.x.y,pytest-3.x.y,py-1.x.y,pluggy-0.x.y rootdir: $REGENDOC_TMPDIR,inifile: collected 0 items ======================= no tests ran in 0.12 seconds =======================

  • -r选项接受后面的多个字符,上面使用的a表示“除了执行通过(Pass)以外所有的结果”。
    以下是可以使用的可用字符的完整列表:

    -f - 失败的用例
    -E - 出错的用例
    -s - 跳过的用例
    -x - 标记失败的用例
    -X - 标记成功的用例
    -p - 成功用例
    -P - 成功用例并输出信息
    -a - 所有pP状态以外的用例

    可以使用多个字符,例如,只查看失败和跳过的用例,你可以执行:

  • $ pytest -rfs =========================== test session starts ============================ platform linux -- Python 3.x.y,pytest-3.x.y,py-1.x.y,pluggy-0.x.y rootdir: $REGENDOC_TMPDIR,inifile: collected 0 items ======================= no tests ran in 0.12 seconds =======================

  • 执行失败时进入PDB(Python调试器)

    Python附带一个名为PDB的内置Python调试器。 pytest允许通过命令行选项进入PDB提示符:

  • pytest --pdb

  • 这将在每次测试开始时调用Python调试器。

    设置断点#

    要在代码中设置断点,需要在代码中使用Python原生import pdb; pdb.set_trace()进行调用,Pytest会自动禁用显示print输出, 并捕获该用例输出结果:

  • 其他测试中的输出捕获不受影响。
  • 任何先前的测试输出已经被捕获并将被处理。
  • 在同一测试中生成的任何后续输出都不会被捕获,而是直接发送到sys.stdout。注意:即使是退出交互式PDB跟踪会话并继续常规测试后发生的测试输出,这也适用。
  • PYTHONBREAKPOINT设置为默认值,调用breakpoint()时,pytest将使用其内部PDB跟踪交互界面(PDB trace UI)而不是Python自带的pdb
  • 测试完成后,默认会重置为Python自带的PDB跟踪交互界面。
  • 在pytest后使用--pdb参数,在失败的测试/未处理异常中,pytest内部PDB跟踪交互界面与breakpoint()同时使用。
  • --pdbcls参数可指定要使用的调试器类。
  • 分析测试用例执行时间

    显示执行最慢的10条测试用例如:

  • pytest --durations=10

  • 默认情况下,Pytest不会显示<0.01s的测试时间, 除非在命令行上传递-vv

    创建JUnit XML格式的测试报告

    要创建可由Jenkins或其他持续集成软件读取的XML测试报告,可以使用:

  • pytest --junitxml=path

  • 运行结束后,在指定路径path下创建一个XML报告文件
    3.1版本新增

  • 可以通过修改配置中junit_suite_name字段的名称来更改XML报告中root test suite的名称。

  • [pytest] junit_suite_name = my_suite

  • record_property(添加新属性)
    版本2.8新增
    版本3.5更改: 在所有报告生成器(reporter)中用户属性record_xml_property项已改为record_property,record_xml_property现已弃用。
    可以使用record_property项来在XML报告中增加更多的日志信息:

  • def test_function(record_property): record_property("example_key",1) assert True

  • 在生成的testcase标签是会添加一个额外的属性example_key="1"

  • <testcase classname="test_function" file="test_function.py" line="0" name="test_function" time="0.0009"> <properties> <property name="example_key" value="1" /> </properties> </testcase>

    或者,你可以将此函数集成在自定义标记装饰器中:

  • # conftest.py文件内容 def pytest_collection_modifyitems(session,config,items): for item in items: for marker in item.iter_markers(name="test_id"): test_id = marker.args[0] item.user_properties.append(("test_id",test_id))

    在你的测试用例中使用:

 

# test_function.py文件内容 import pytest @pytest.mark.test_id(1501) def test_function(): assert True

这将导致:

<testcase classname="test_function" file="test_function.py" line="0" name="test_function" time="0.0009"> <properties> <property name="test_id" value="1501" /> </properties> </testcase>

警告:
record_property是一个实验性函数,将来可能会发生变化。
另外,这将破坏一些XML结构验证,与某些持续集成软件一起使用时,可能会导致一些问题。

record_xml_attribute(修改xml节点属性)
3.4版本新增
可以使用record_xml_attribute fixture向testcase`标签中添加其他xml属性。也可以用来覆盖原有属性值:

def test_function(record_xml_attribute): record_xml_attribute("assertions","REQ-1234") record_xml_attribute("classname","custom_classname") print("hello world") assert True

与record_property不同, 它不会在节点下添加子元素,而是在生成的testcase标签内添加一个属性assertions ="REQ-1234",并使用classname = custom_classname覆盖默认的classname属性:

<testcase classname="custom_classname" file="test_function.py" line="0" name="test_function" time="0.003" assertions="REQ-1234"> <system-out> hello world </system-out> </testcase>

警告:
record_xml_attribute也是一个实验性函数,其界面可能会被更强大,更通用的未来版本所取代。但是,将保留函数本身。

通过使用record_xml_property可以为在使用持续集成工具解析xml报告时提供帮助。 但是,一些解析器对允许的元素和属性非常严格。 许多工具使用xsd模式(如下例所示)来验证传入的xml。 确保使用解析器允许的属性名称。

以下是Jenkins用于验证xml报告的结构:

<xs:element name="testcase"> <xs:complexType> <xs:sequence> <xs:element ref="skipped" minOccurs="0" maxOccurs="1"/> <xs:element ref="error" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="failure" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="system-out" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="system-err" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="assertions" type="xs:string" use="optional"/> <xs:attribute name="time" type="xs:string" use="optional"/> <xs:attribute name="classname" type="xs:string" use="optional"/> <xs:attribute name="status" type="xs:string" use="optional"/> </xs:complexType> </xs:element>

LogXML: add_global_property
3.0版本新增
如果要在testsuite级别添加属性节点,该节点可能包含与所有测试用例相关的属性,则可以使用LogXML.add_global_properties

import pytest @pytest.fixture(scope="session") def log_global_env_facts(f): if pytest.config.pluginmanager.hasplugin("junitxml"): my_junit = getattr(pytest.config,"_xml",None) my_junit.add_global_property("ARCH","PPC") my_junit.add_global_property("STORAGE_TYPE","CEPH") @pytest.mark.usefixtures(log_global_env_facts.__name__) def start_and_prepare_env(): pass class TestMe(object): def test_foo(self): assert True

这会在生成的xml中的testsuite节点下的属性节中添加:

<testsuite errors="0" failures="0" name="pytest" skips="0" tests="1" time="0.006"> <properties> <property name="ARCH" value="PPC"/> <property name="STORAGE_TYPE" value="CEPH"/> </properties> <testcase classname="test_me.TestMe" file="test_me.py" line="16" name="test_foo" time="0.000243663787842"/> </testsuite>

警告:
这依然是一个实验性的函数,其界面也可能会被更强大,更通用的未来版本所取代, 但也将保留该函数。

创建结果日志格式文件

3.0版本之后不推荐使用,计划在4.0版本中删除。

对于仍然需要类似函数的用户来说,可以使用提供测试数据流的pytest-tap插件。

如有任何疑虑,可以[建立一个问题(open an issue)。

pytest --resultlog=path

执行后,在path路径中会创建一个纯文本结果日志文件,这些文件可以用于:例如,在PyPy-test网页显示多个修订版的测试结果。

将测试报告发送到在线pastebin服务

为每条测试失败用例建立一个日志URL链接:

pytest --pastebin=failed
这会将测试运行信息提交到一个提供粘贴服务的远程服务器上,并为每条测试失败用例提供一个URL。 你可以像平常一样查看搜集结果,或者使用-x参数,来只显示某个特定的测试失败结果。

为整个测试执行日志建立一个URL链接:

pytest --pastebin=all
目前只实现了粘贴到http://bpaste.net网站的服务。

  • 禁用插件
  • 可以通过-p选项与前缀no:一起使用,来在运行时禁用加载特定插件。

    例如:要禁用加载从文本文件执行doctest测试的doctest插件,可以通过以下方式运行Pytest:

    pytest -p no:doctest

在Python代码调用pytest

版本2.0新增
你可以在Python代码中直接调用pytest:

Copy

pytest.main()
这就和你从命令行调用“pytest”一样。但它不会引发SystemExit,而是返回exitcode。 你可以传入选项和参数。

Copy

pytest.main(['-x','mytestdir'])
你可以为pytest.main指定其他插件:

Copy

# myinvoke.py文件内容 import pytest class MyPlugin(object): def pytest_sessionfinish(self): print("*** test run reporting finishing") pytest.main(["-qq"],plugins=[MyPlugin()])
运行它将显示已添加MyPlugin并调用其中的hook方法:

Copy

$ python myinvoke.py . [100%] *** test run reporting finishing

注意:

调用pytest.main()将会导入所有测试用例及其导入的其他模块。由于python导入系统的缓存机制,从同一进程后续调用pytest.main()不会反映调用之间对这些文件的更改。 因此,不建议从同一进程(例如,为了新运行测试)多次调用pytest.main()。

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python (十八) 正则表达式

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

vue中的this.$nextTick().then()

MENU 示例一示例二sortsplicepushrandomfloorMathwhile演示 示例一 let reorganize function (arr){let rest [];while (arr.length > 0) {let random Math.floor(Math.random() * arr.length);// 把获取到的值放到新定义的数组中rest.push(arr[random]);// 这句代码的作…

通过证书透明度发现更多相关资产

通过证书透明度发现更多相关资产 1.证书透明度概述2.搜索实战3.为什么证书透明度技术是可行的4.DigiCert 和其他 CA5.缺陷缓解措施 1.证书透明度概述 许多现代网站都采用自动颁发和续订 TLS 证书&#xff0c;在设置 TLS 证书部署的方式上存在缺陷。它允许任何人发现同一服务器…

面试必会-JAVA基础篇-01

文章目录 1. Final 有什么用&#xff1f;2. 什么是重载&#xff08;Overload&#xff09;和重写&#xff08;Override&#xff09; ?3. 重载的方法能否根据返回类型进行区分&#xff1f;4. 和 equals 的区别是什么5. 什么是反射机制&#xff1f;6. 反射机制优缺点7. 在你进行…

免费百度SEO优化工具,百度SEO优化排名工具

百度SEO关键词工具 让我们聚焦在百度SEO关键词工具上。对于任何想要在百度搜索引擎中脱颖而出的网站管理员而言&#xff0c;深入了解用户搜索习惯和关键词的选择是至关重要的。 百度SEO关键词工具不仅提供了免费的服务&#xff0c;而且功能强大。通过输入相关领域的关键词&…

STM32串口接收不定长数据(空闲中断+DMA)

玩转 STM32 单片机&#xff0c;肯定离不开串口。串口使用一个称为串行通信协议的协议来管理数据传输&#xff0c;该协议在数据传输期间控制数据流&#xff0c;包括数据位数、波特率、校验位和停止位等。由于串口简单易用&#xff0c;在各种产品交互中都有广泛应用。 但在使用串…

佛罗里达大学利用神经网络,解密 GPCR-G 蛋白偶联选择性

内容一览&#xff1a;G 蛋白偶联受体 (GPCRs) 是一种将细胞膜外的刺激&#xff0c;传递到细胞膜内的跨膜蛋白&#xff0c;广泛参与到人体生理活动当中。近日&#xff0c;佛罗里达大学的研究者测定了 GPCRs 和 G 蛋白的结合选择性&#xff0c;并开发了预测二者选择性的算法&…

C++日常遇到的一些坑的总结

一、const 相关 C中const的不同位置的用法 const 修饰符用法总结 二、函数形参没有变量名 三、指针偏移问题 笔记&#xff1a; 包含来自C标准库的头文件&#xff0c;用#inlcude<xxx>&#xff0c;包含不来自C标准库的头文件&#xff0c;用#include"xxx"最…

【动手学深度学习】(十)PyTorch 神经网络基础

文章目录 一、层和块1.自定义块2.顺序块3.在前向传播函数中执行代码 二、参数管理1.参数访问2.参数初始化3.参数绑定 三、自定义层1.不带参数的层2.带参数的层 四、读写文件1.加载和保存张量2.加载和保存模型参数 [相关总结]state_dict() 一、层和块 为了实现复杂神经网络块&am…

论文投稿查询会议期刊及deadlines的网站

1. 这个是查近期CCF-ABC的ddl会议的网址 https://ccfddl.github.io/ https://ccfddl.top/ 2. 期刊选刊 https://ijournal.topeditsci.com/home https://journalsuggester.springer.com/ 3. IEEE出版物推荐 https://publication-recommender.ieee.org/home

java后端技术演变杂谈(未完结)

1.0版本javaWeb&#xff1a;原始servletjspjsbc 早期的jsp&#xff1a;htmljava&#xff0c;页面先在后端被解析&#xff0c;里面的java代码动态渲染完成后&#xff0c;成为纯html&#xff0c;再通过服务器发送给浏览器显示。 缺点&#xff1a; 服务器压力很大&#xff0c;因为…

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析 精度损失与隐式类型转换精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…

用友U8 Cloud TaskTreeQuery SQL注入漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud /service/~iufo/nc.itf.iufo.mobilereport.task.TaskTreeQuery接口处存在SQL注入漏洞&#xff0c;未授权的…

类和对象——(6)友元

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 没有存储汗水&#xff0c;就无法支取成…

奥本海默-电影剧情简介

片头&#xff0c;奥本海默 脑海浮现恒星生命周期画面 1925年&#xff0c;奥本海默离开美国去欧洲学习新物理&#xff08;量子力学&#xff09; 脑海浮现量子力学相关画面&#xff08;像 德布罗意波&#xff09; 1927年从德国哥廷根大学毕业&#xff0c;获得物理学博士学位。…

MySQL笔记-第04章_运算符

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第04章_运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展&#xff1a;使用正则表达式查询 第04章_运算符 …

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…

【Windows】使用SeaFile搭建本地私有云盘并结合内网穿透实现远程访问

1. 前言 现在我们身边的只能设备越来越多&#xff0c;各种智能手机、平板、智能手表和数码相机充斥身边&#xff0c;需要存储的数据也越来越大&#xff0c;一张手机拍摄的照片都可能有十多M&#xff0c;电影和视频更是按G计算。而智能设备的存储空间也用的捉襟见肘。能存储大量…

使用typescript搭建express

使用typescript搭建express 开始 为这个项目创建一个新的目录&#xff0c;使用下面的命令初始化项目并创建一个包。 NPM init -y初始化后&#xff0c;让我们安装必要的包 npm i express dotenv cors helmet body-parser 在express中配置typescript npm i -D typescript typ…

filter过滤器

package com.it.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter;import java.io.IOException;WebFilter(urlPatterns"/*") public class DemoFilter implements Filter {Override // 初始化的方法 只要调用一次public void init(Filte…