Pytest:一个卓有成效的测试工具

Python 领域 pytest 与其他测试工具对比 在 Python 开发中,为了保证代码的正确性、稳定性和可维护性,测试是必不可少的环节。不同的测试工具具有不同的特点和适用场景。本文的目的在于全面对比 pytest 与其他常见 Python 测试工具,分析它们在功能、易用性、扩展性等方面的差异,为开发者在选择合适的测试工具时提供参考。范围涵盖 unittest、doctest、nose2 等主流 Python 测试工具。本文将按照以下结构展开:首先介绍核心概念与各测试工具的联系; 阅读详情

我正在参加「掘金·启航计划」

大家都知道,目前最流行的Python单元测试框架有三种,分别是unittest, nose和pytest。其中unittest是Python自带的测试框架,但问题是比较老了,赶不上时代发展了(哈哈哈);nose2定位是带插件的unittest,实则对unittest的扩展。长远来看,pytest属于潜力股。

通过官网介绍的特点和使用经验,可以将pytest优点总结如下:

1)支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数

2)可以自动识别测试模块和测试函数

3)兼容unittest和nose测试集

4)支持参数化

5)支持测试用例的skip和xfail处理

6)可以很好的和jenkins集成

7)支持丰富的插件,例如报告插件pytest-html、allure-pytest、失败重试插件pytest-rerunfailures、

8)活跃的社区,遇到的问题可以高效解决。

简化样板代码

大多数功能测试遵循 Arrange-Act-Assert 模型:

  1. 设置测试前置条件
  2. 调用函数来执行测试
  3. 断言执行结果

测试框架通常会挂接到测试的断言中,以便它们可以在断言失败时提供信息。unittest,例如,提供了许多开箱即用的断言方法,但是不友好的地方是,unittest编写的用例即使是一小部分测试也需要相当数量的样板代码。

下面写一个unittest测试用例并断言在项目中正常工作。

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):

def test_always_passes(self):

self.assertTrue(True)

def test_always_fails(self):

self.assertTrue(False)

然后,你可以使用命令行运行这些测试:

(venv) $ python -m unittest discover

F.

======================================================================

FAIL: test_always_fails (test_with_unittest.TryTesting)

----------------------------------------------------------------------

Traceback (most recent call last):

File "...\effective-python-testing-with-pytest\test_with_unittest.py",

line 10, in test_always_fails

self.assertTrue(False)

AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)

一个测试通过,一个测试失败。OK,下面我们总结一下一个完整的测试需要写多少代码:

  1. 导入类unittest引入TestCase
  2. 创建TryTesting,一个子类TestCase
  3. TryTesting为每个测试写一个方法
  4. 使用self.assert*方法进行断言

这是要编写的大量代码的,所以在开发测试用例时会一遍又一遍地编写相同的样板代码。而pytest则不同,它允许你直接使用普通函数和python assert关键字来简化样板代码达到相同的目的:

# test_with_pytest.py

def test_always_passes():

assert True

def test_always_fails():

assert False

就是如此简单。你需要做的就是写一个带有test_前缀的函数,使用assert关键字断言期望是True/False,然后执行测试即可。

Pytest不仅消除了很多样板代码,而且还提供了更加详细和易于阅读的输出。

更好的测试输出

在项目根目录文件夹下使用pytest命令运行所有测试用例:

(venv) $ pytest

============================= test session starts =============================

platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0

rootdir: ...\effective-python-testing-with-pytest

collected 4 items

test_with_pytest.py .F [ 50%]

test_with_unittest.py F. [100%]

================================== FAILURES ===================================

______________________________ test_always_fails ______________________________

def test_always_fails():

> assert False

E assert False

test_with_pytest.py:7: AssertionError

________________________ TryTesting.test_always_fails _________________________

self = <test_with_unittest.TryTesting testMethod=test_always_fails>

def test_always_fails(self):

> self.assertTrue(False)

E AssertionError: False is not true

test_with_unittest.py:10: AssertionError

=========================== short test summary info ===========================

FAILED test_with_pytest.py::test_always_fails - assert False

FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 f
【测试】Pytest 本文系统对比了unittest与pytest,突出pytest在自动发现、断言重写、fixture依赖注入、参数化测试及插件扩展等方面的显著优势。通过conftest.py实现跨文件共享,结合scope控制生命周期,提升测试效率与可维护性,推荐用于现代Python测试实践。 阅读详情

相关推荐

Decoder如何工作、Transformer如何训练、以及exposure bias问题

1、结合图文描述Decoder中各个模块是什么,以及是如何工作的。2、transformer是如何训练的。3、exposure bias问题造成的原因及解决方法

m0_59113542的博客 3345

Codex API 直接集成指南:告别中转代理,构建稳定高效的 AI 应用

在 AI 应用开发中,API 集成是连接模型能力与业务逻辑的核心环节。其基本原理是通过 HTTP 协议,按照服务提供商定义的规范发送请求并解析响应,实现远程调用。标准化的 API 设计确保了跨平台和跨语言的互操作性,其技术价值在于提供了稳定、可控且可扩展的服务接入方式,是构建企业级智能应用的基础。在实际应用场景中,开发者常需集成如 Codex 这类聚合了多种大语言模型的平台,以调用诸如 DeepSeek 等先进模型。然而,部分开发者仍依赖过时的第三方中转代理工具,这不仅引入了单点故障和版本锁定的风险,还可能

weixin_28224217的博客 339

【GPT】Coze使用开放平台接口-【7】Dify 比较篇

coze 用于社交,dify 用来内部构建。抛开工作流,机器人,工具,coze 最大的区别在于可以直接发布到社交媒体上。所以,coze 对操作体验上也花了不少功夫,而 dify 就专注在帮助使用者打磨工作流。coze 各个大模块之前可以联动的机制也比较多,所以侧重点各不相同。

非晓为骁的博客 7615

AVL_Cruise_interface\Simulink联合仿真

分享了AVL_Cruise通过interface模块与Simulink进行联合仿真的过程

qq_64735036的博客 2679

微信终于支持“多设备同时在线”?我用 NAS + Docker 搭了一个云端微信系统,多端共享24小时在线

通过Docker 容器,将微信运行在云端并通过浏览器访问,实现多设备共享同一微信会话 📱。本文详细介绍完整部署流程、docker-compose 配置及资源控制方案,让微信变成“可访问的云桌面应用” ✨

XiaoqiangClub的博客 878

YOLOv8改进策略【独家融合改进】| StarNet + 小目标检测头,加强跨尺度的上下文特征融合,提高小目标检测能力

P3/8 - small检测头原始模型中的P3/8特征层对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。适合检测尺寸大概在8x8到32x32像素左右的目标。P4/16 - medium检测头这个检测头对应的P4/16特征层经过了更多的下采样操作,相比P3/8特征图空间分辨率降低,但通道数增加,特征更抽象且有语义信息。它主要用于检测中等大小的目标,尺寸范围大概在32x32到64x64像素左右。P5/32 - large检测头P5/32。

Limiiiing的博客 636

零差云控 ZeroErr eRob 电机 CAN、CANopen、EtherCAT、ROS2 机器人开发详细教程

TwinCAT 3(Windows 控制与自动化技术)是 Beckhoff 提供的开发平台,可将任何兼容 PC 转变为实时控制系统,用于管理各种类型的工业自动化系统,如 PLC(可编程逻辑控制器)、运动控制、机器人等。

机器人控制与仿真应用 1万+

华为OD新系统机试真题 - 操作历史管理器的撤销/重做能力

华为OD机试新系统真题【操作历史管理器的撤销/重做能力】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【操作历史管理器的撤销/重做能力】

qq_45776114的博客 867

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 搞钱必看 盘点那些靠谱的程序员副业,狠狠提升财富值
下一篇: 为什么越来越多的 Python 开发者选择使用其他框架替代 Django?
Python_P叔
博客等级 码龄3年 5453粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值