【Pytest官方文档翻译及学习】1.1 安装和入门

目录

1.1 安装和入门

1.1.1 安装pytest

1.1.2 创建第一个测试

1.1.3 运行多个测试

1.1.4 断言引发了某个异常

1.1.5 将多个测试分组在一个类中

1.1.6 请求功能测试的唯一临时目录

1.1.7 继续阅读


Pytest是一个成熟的全功能的Python测试框架,它可以满足大多数Python测试需求。以下是一些Pytest的主要特点:

  1. 简洁的语法:Pytest使用简洁的语法,使你的测试代码更加清晰易读。
  2. 丰富的内建功能:Pytest内建支持单元测试、功能测试、集成测试和回归测试。
  3. 灵活的fixture机制:Pytest提供了fixture机制,能够方便的在测试函数之间共享测试数据或测试状态。
  4. 参数化测试:Pytest支持参数化测试,可以用一组输入数据针对同一测试用例执行多次测试。
  5. 插件支持:Pytest有大量的插件,如用于测试覆盖率的pytest-cov,用于并行测试的pytest-xdist等。
  6. 兼容unittest框架:Pytest兼容Python标准库中的unittest测试框架,所以你可以在Pytest中运行unittest的测试用例。
  7. 详细的错误报告:当测试失败时,Pytest可以提供详细的错误报告,包括测试期间的输入数据、执行路径和异常堆栈。

在创建测试用例时,你不需要继承任何特定的类,只需要定义一个函数,并在函数名前加上test_前缀即可。Pytest会自动发现并运行这些测试用例。

安装pytest非常简单,只需在命令行中运行pip install pytest即可。

1.1 安装和入门

1.1.1 安装pytest

1、在命令行中运行以下命令:

pip install -U pytest

2、检查是否安装了正确的版本:

$ pytest --version
pytest 6.2.1

1.1.2 创建第一个测试

创建一个名为test_sample.py的新文件,其中包含一个函数和一个测试:

# content of test_sample.py 
def func(x):     return x + 1 
def test_answer():     assert func(3) == 5

现在可以执行测试功能:

$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 itemtest_sample.py F                                                     [100%]================================= FAILURES =================================________________________________test_answer _____________________________def test_answer():assert func(3) == 5E       assert 4 == 5
E        +  where 4 = func(3)test_sample.py:6: AssertionError
========================= short test summary info ==========================
FAILED test_sample.py::test_answer - assert 4 == 5
============================ 1 failed in 0.12s =============================

这个 [100%] 指运行所有测试用例的总体进度。完成后,pytest会显示一个失败报告,因为 func(3) 不返 5 .

注:

您可以使用assert语句来验证测试期望值。pytest的高级断言内省(Advanced assertion introspection)将智能地报告断言表达式的中间值,这样您就可以避免使用多个名称JUnit遗留方法(of JUnit legacy methods)。

1.1.3 运行多个测试

pytest将运行当前目录及其子目录中test_*.py或*_test.py格式的所有文件。更一般地说,它遵循标准的测试发现规则(standard test discovery rules)。

1.1.4 断言引发了某个异常

使用 raises 助手来断言某些代码引发异常:

#content of test_sysexit.pyimport pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()

以“quiet”报告模式执行测试功能:

$ pytest -q test_sysexit.py
.                                                                    [100%]
1 passed in 0.12s

注:

在本例和以下示例中,-q/--quiet标志使输出保持简短。

1.1.5 将多个测试分组在一个类中

一旦开发了多个测试,您可能需要将它们分组到一个类中。pytest使创建包含多个测试的类变得容易:

# content of test_class.py
class TestClass:def test_one(self):x = "this"assert "h" in xdef test_two(self):x = "hello"assert hasattr(x, "check")

pytest按照Python测试发现的约定来发现所有测试( Conventions for Python test discovery),因此它可以找到两个带有test_前缀的函数。没有必要对任何东西进行子类化,但请确保在类前面加上Test,否则该类将被跳过。我们可以简单地通过传递其文件名来运行模块:

$ pytest -q test_class.py
.F                                                                   [100%]
================================= FAILURES =================================____________________________TestClass.test_two ____________________________self = <test_class.TestClass object at 0xdeadbeef>def test_two(self):x = "hello"
>       assert hasattr(x, "check")
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')test_class.py:8: AssertionError
========================= short test summary info ==========================
FAILED test_class.py::TestClass::test_two - AssertionError: assert False
1 failed, 1 passed in 0.12s

第一次测试通过,第二次失败。您可以很容易地看到断言中的中间值,以帮助您理解失败的原因。

将测试分组在类中可能是有益的,原因如下:

  • 测试组织
  • 仅在该特定类别中共享用于测试的固定装置
  • 在类级别应用标记,并将其隐式应用于所有测试

在类中对测试分组时需要注意的是,每个测试都有一个唯一的类实例。让每个测试共享同一个类实例将非常不利于测试隔离,并且会导致不良的测试实践。概述如下:

# content of test_class_demo.py
class TestClassDemoInstance:value = 0def test_one(self):self.value = 1assert self.value == 1def test_two(self):assert self.value == 1
$ pytest -k TestClassDemoInstance -q
.F [100%]
================================= FAILURES =================================
______________________ TestClassDemoInstance.test_two ______________________
self = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef0002>def test_two(self):
>        assert self.value == 1
E        assert 0 == 1
E         + where 0 = <test_class_demo.TestClassDemoInstance object at 0xdeadbeef0002>
˓→.valuetest_class_demo.py:9: AssertionError
========================= short test summary info ==========================
FAILED test_class_demo.py::TestClassDemoInstance::test_two - assert 0 == 1
1 failed, 1 passed in 0.12s

请注意,在类级别添加的属性是类属性,因此它们将在测试之间共享。

1.1.6 请求功能测试的唯一临时目录

pytest提供了 Builtin fixtures/function arguments参数来请求任意资源,比如一个唯一的临时目录:

# content of test_tmp_path.py
def test_needsfiles(tmp_path):print(tmp_path)assert 0

在测试函数签名中列出名称tmp_path,pytest将在执行测试函数调用之前查找并调用fixture工厂来创建资源。在测试运行之前,pytest会创建一个唯一的每次测试调用临时目录:

$ pytest -q test_tmp_path.py
F [100%]
================================= FAILURES =================================
_______________________________ test_needsfiles ____________________________
tmp_path = PosixPath('PYTEST_TMPDIR/test_needsfiles0')def test_needsfiles(tmp_path):print(tmp_path)
>       assert 0
E       assert 0test_tmp_path.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
PYTEST_TMPDIR/test_needsfiles0
========================= short test summary info ==========================
FAILED test_tmp_path.py::test_needsfiles - assert 0
1 failed in 0.12s

有关临时目录处理的更多信息,请访问 Temporary directories and files 。

通过以下命令了解存在哪种内置pytest固定装置 pytest fixtures:

pytest --fixtures   # shows builtin and custom fixtures

注意,这个命令省略了前导的fixtures _ 除非 -v 选项已添加。

1.1.7 继续阅读

查看其他Pytest资源以帮助您为独特的工作流自定义测试:

  • “ 通过调用pytest python -m pytest”,用于命令行调用示例
  • “ 在现有测试套件中使用pytest”,用于处理预先存在的测试
  • “ 用属性标记测试函数”以获取有关 pytest.mark 机制
  • “ Pytest夹具:显式、模块化、可扩展”,用于为测试提供功能基线
  • “ :ref:'plugins`'用于管理和写入插件”
  • “ :ref:'goodpractices`'用于virtualenv和测试布局”

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

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

相关文章

huffman编码【python】【算法】

哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式&#xff0c;哈夫曼编码是可变字长编码(VLC)的一种。该方法完全依据字符出现概率来构造整体平均长度最短的码字&#xff0c;有时称之为最佳编码&#xff0c;一般就叫做Huffman编码&#xff08;…

MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法

MFC/QT利用COM组件接口从字体名称、粗体、斜体获取到字体文件路径的方法 这个是目前唯一能准确从字体名称加粗斜体三个属性定位到ttf/ttc字体路径的方法&#xff0c;其他的方式是没有办法区分后两个属性而且会出现不准确的问题 之前无意间在MSDN找到的资料&#xff1a; IDWr…

el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联

Vue实现 el-calendar自定义日程,显示文字内容,el-date-picker和el-calendar互动互联 效果展示 首先el-calendar需要自定义日程内容的话,其格式一般必须满足如下结构 dataList = [{date: 2024-05-08, content: "数学模拟试卷(3)"},{date: 2024-05-08, content: …

【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器

目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入&#xff1a;若GPIO引脚配置为上拉输入模式&#xff0c;在默认情况下&#xff08;GPIO引脚无输入&#xff09;&#xff0c;读取的GPIO引脚数据为1&#xff0c;即高电平。 下拉输入&#xff1a;若GPIO引脚配置为下…

C语言(指针)6

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

深度学习之神经网络理论基础

深度学习之神经网络理论基础 人工神经元 人工神经元&#xff1a;人类神经元中抽象出来的数学模型 MP模型 mp模型&#xff1a;1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元&#xff0c;称为M-P模型。 M-P神经元&#xff08;一个用来模拟生物行为的数学模…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…

React 基础案例

React的特点&#xff1a; 1、声明式编程 2、组件化开发 3、多平台适配yuan 原生实现&#xff1a; <h2 class"title"></h2><button class"btn">改变文本</button><script>let msg "Hello World";const titleEl d…

P6397 [COI2008] GLASNICI

题目描述 一条直线上有 &#x1d45b; 个信使&#xff0c;将他们按照从左至右的顺序以 1 至 &#x1d45b; 编号。换句话说&#xff0c;设 &#x1d456; 号信使的的坐标为 &#x1d451;&#x1d456;​&#xff0c;则对于 1≤&#x1d456;<&#x1d45b;&#xff0c; &am…

TCP协议建立连接的过程及其意义

目录 三次握手 四次挥手 三次握手的意义 在客户端与服务器传输数据之前&#xff0c;要在两台主机之间先建立连接&#xff0c;然后再传输业务数据。三次握手&#xff0c;就是建立连接的过程&#xff0c;是在传输业务之前&#xff0c;就要先进行。握手好了&#xff0c;才能进行…

【新手入门】Github与Git使用教程

Github与Git 一、Github基础教程 1.1 基本操作 点击代码文件可以直接查看文件的内容&#xff0c;支持在线修改文件&#xff0c;只需要点击(文件内容)右上角的编辑按钮即可进行编辑。 README.md一般介绍项目的功能&#xff0c;用法&#xff0c;注意事项&#xff1b;有时还有…

LeetCode //C - 93. Restore IP Addresses

93. Restore IP Addresses A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros. For example, “0.1.2.201” and “192.168.1.1” are valid IP addresses, bu…

虚拟机有线已连接但无法上网—·可能性之一

背景 VMware虚拟机&#xff0c;搭建了三台Linux服务器&#xff0c;组成Hadoop集群&#xff0c;由于在Hadoop102上有一些经常与Mysql数据库交互的任务&#xff0c;需要经常打开运行&#xff0c;而Hadoop103和104则经常处于关闭状态&#xff0c;一段时间后再次启动集群时候&…

ES6 笔记03

01 回调地狱 回调地狱: 回调函数嵌套回调函数 嵌套过深导致维护不方便 02 promise语法的基本使用 promise语法的基本使用: 1.new Promise 对象 并接收新对象 2.在构造函数里面传入回调函数 3.回调函数里面有两个形参: resolve reject resolve 表示积极状态 reject 表示消极状…

Springboot整合 Spring Cloud Gateway

1.Gateway介绍 1.是spring cloud官方推出的响应式的API网关框架&#xff0c;旨在为微服务架构提供一种简单有效的API路由的管理方式&#xff0c;并基于Filter的方式提供网关的基本功能&#xff0c;例如&#xff1a;安全认证&#xff0c;监控&#xff0c;限流等等。 2.功能特征…

【逆天OP懒狗的JAVA自学笔记--5.判断和循环】第二阶段始篇

文章目录 前言一、流程控制语句1.顺序结构&#xff08;最简单&#xff09;2.分支结构2.1 if 语句2.1.1 if语句的三种格式2.1.2 if 的注意事项 2.2 switch 语句2.2.1switch 的扩展知识 3.循环结构3.1 for 循环 扩展小点&#xff1a;//1.求和的变量不能定义在循环的里面&#xff…

php全局变量

PHP 全局变量 PHP中预定义了几个超级全局变量&#xff08;superglobals&#xff09; &#xff0c;这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明&#xff0c;就可以在函数及类中使用。 PHP 超级全局变量列表: $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILE…

解决finalshell无法连接,一直提示登陆密码

问题描述 在使用FinalShell连接配置虚拟机时&#xff0c;无法正常连接&#xff0c;一直提示输入登录密码&#xff0c;即使输入的密码是正确的。 切换到root 模式,输入密码 su root 此时需要输入root账户的密码&#xff0c;但是我们又不知道root的密码&#xff0c;怎么办&…

嵌入式STM32中I2C控制器外设详解

STM32中的I2C外设主要负责IIC协议与外界进行通信,就像USART外设一样,我们在学习的过程中,需要抓住I2C应用的重点。 STM32在使用I2C协议时,可以通过两种方式, 一是软件模拟协议 意思是使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。例如,像点亮LED那样…

大数据模型的选择与安装

大数据模型的选择和安装是一个复杂的过程&#xff0c;涉及多个因素&#xff0c;包括模型的通用能力、特定任务的性能、数据效率、评估完整性、成本以及部署的硬件和软件环境。以下是一些关于大数据模型选择与安装的考虑因素和步骤&#xff1a; 选择大数据模型的考虑因素&#…