Python测试框架 —— pytest与unittest的区别!

news2024/12/24 10:38:52

前言

在Python中进行测试时,两个最流行的测试框架是unittest和pytest。虽然它们的目标相同,但它们之间存在许多不同之处。

本文将详细比较它们在用例编写规则、前置和后置方法、参数化、断言功能、用例执行和报告生成等方面的差异,并适当补充pytest相较于unittest的其他优点。

相同点

首先,让我们看一下它们的共同点:

  • 都是用于Python的测试框架

  • 都使用断言(assertions)来验证代码的正确性

  • 都支持自动化测试

尽管它们有着相同的目标和基本特征,但在实际应用过程中表现出了不同的特点。

用例编写规则的不同

unittest

在unittest中,测试类必须继承unittest.TestCase。测试方法必须以test_开头,并且不能带有参数。以下是一个使用unittest编写测试用例的示例:

import unittest

# 继承 TestCase 类
class TestStringMethods(unittest.TestCase):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])

        # 执行测试
if __name__ == '__main__':
    unittest.main()

pytest

在pytest中,测试函数可以任意命名,无需继承特定的基类或遵循特定的命名规范。以下是一个使用pytest编写测试用例的示例:

# 测试函数可以随意命名
def test_upper():
    assert 'foo'.upper() == 'FOO'

def test_isupper():
    assert 'FOO'.isupper()
    assert not 'Foo'.isupper()

def test_split():
    s = 'hello world'
    assert s.split() == ['hello', 'world']

这里不同之处在于pytest对测试用例命名和所继承的基类没有要求,而unittest则需要遵循特定的命名规范和继承特定的基类。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

前置和后置方法的不同

unittest

unittest使用setUp和tearDown方法来设置和清理测试夹具(test fixtures)。setUp方法在每个测试方法之前执行,用于准备测试环境;tearDown方法在每个测试方法之后执行,用于清理测试环境。以下是一个使用setUp和tearDown方法的示例:

import unittest

class TestStringMethods(unittest.TestCase):
    def setUp(self):
        self.text = 'hello world'

    def test_upper(self):
        self.assertEqual(self.text.upper(), 'HELLO WORLD')

    def tearDown(self):
        self.text = None

if __name__ == '__main__':
    unittest.main()

pytest

在pytest中,使用fixture系统管理测试夹具。夹具(fixture)是函数、类或模块级别的对象,可以提供测试数据、初始化代码等。如果需要在多个测试用例中重复使用相同的夹具,则fixture尤其有用。以下是一个使用fixture的示例:

import pytest

@pytest.fixture
def setup_text():
    return 'hello world'

def test_upper(setup_text):
    assert setup_text.upper() == 'HELLO WORLD'

这里不同之处在于pytest使用fixture来管理测试夹具,而unittest则使用setUp和tearDown方法。

参数化的不同

unittest

在unittest中,参数化通常需要手动实现。例如,使用for循环迭代测试数据,并为每个数据集执行一个测试方法:

import unittest

class TestMultiplication(unittest.TestCase):
    def test_numbers_3_4(self):
        self.assertEqual(3 * 4, 12)

    def test_numbers_2_4(self):
        self.assertEqual(2 * 4, 8)

        def test_numbers_6_9(self):
            self.assertEqual(6 * 9, 54)

pytest

pytest内置支持参数化,使得为一组输入执行相同的测试变得非常容易。以下是一个使用@pytest.mark.parametrize装饰器实现参数化测试的示例:

import pytest

# 参数化测试
@pytest.mark.parametrize("a, b, expected", [
    (3, 4, 12),
    (2, 4, 8),
    (6, 9, 54),
])
def test_multiplication(a, b, expected):
    assert a * b == expected

除此之外,pytest还提供了更多灵活的参数化方式,例如从CSV、YAML或JSON文件中加载测试数据等。

断言功能的不同

unittest

unittest只能使用assertEqual、assertTrue和assertFalse等基本断言方法进行断言。如果需要其他特殊类型的断言,则需要手动编写代码来实现。例如,如果需要比较两个列表是否相等,则需要使用assertListEqual方法。

import unittest

class TestListMethods(unittest.TestCase):
    def test_list_equal(self):
        list1 = [1, 2, 3]
        list2 = [1, 2, 3]
        self.assertListEqual(list1, list2)

if __name__ == '__main__':
    unittest.main()

pytest

pytest具有更丰富的内置断言方法,例如assertAlmostEqual、assertDictEqual和assertRegex等。如果需要自定义断言,则可以使用pytest.assert语法。

import pytest

def test_list_equal():
    list1 = [1, 2, 3]
    list2 = [1, 2, 3]
    assert list1 == list2

此外,pytest还支持自定义的assertion helper函数和插件来扩展断言功能。

用例执行的不同

unittest

在unittest中,测试套件由TestLoader加载,并由TextTestRunner运行。以下是一个手动创建并运行测试套件的示例:

import unittest

class TestStringMethods(unittest.TestCase):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(TestStringMethods('test_upper'))

    runner = unittest.TextTestRunner()
    runner.run(suite)

pytest

在pytest中,使用pytest命令行工具运行测试。pytest会自动发现并执行所有符合命名规则(test_*.py)的测试文件。以下是一个在终端中运行pytest测试的示例:

$ pytest

pytest还支持多种插件扩展测试功能,例如pytest-xdist可以实现分布式测试。以下是一个使用pytest-xdist插件进行并发执行的示例:

$ pytest -n 4

这里不同之处在于unittest需要手动创建并运行测试套件,而pytest则由pytest命令行工具自动发现和执行测试。

报告生成的不同

unittest

unittest默认情况下生成文本报告并将其输出到控制台。可以编写一个单独的测试运行器来生成HTML报告等其他格式。以下是一个使用HtmlTestRunner模块创建HTML测试报告的示例:

import unittest
import HtmlTestRunner

class TestStringMethods(unittest.TestCase):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

if __name__ == '__main__':
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='example_dir'))

pytest

在pytest中,可以使用多个插件来生成各种格式的测试报告,例如pytest-html可以生成漂亮的HTML测试报告:

$ pytest --html=report.html

此外,还有更多插件支持生成JUnit XML、JSON和Allure等报告格式。

pytest其他优点的补充

除了上述功能之外,pytest还提供了许多其他有用的特性,使得它比unittest更加灵活、易用、高效和可扩展。以下是一些pytest的其他优点:

参数化

pytest的参数化测试功能非常强大,可以轻松地对一组输入执行相同的测试,并在测试失败时提供更多的上下文信息。参数化测试还可以与fixture系统一起使用,从而实现更高级的夹具设置。例如,以下是一个使用参数化和fixture的示例:

import pytest

@pytest.fixture(params=[1, 2, 3])
def input_value(request):
    return request.param

def test_square(input_value):
    assert input_value ** 2 == 4

这里,fixture函数input_value返回一个参数(request.param) ,pytest将会用列表中的每个元素调用一次fixture。

fixture管理测试夹具

除了基本夹具之外,pytest的fixture系统还支持诸如scope、autouse和yield-fixture等高级特性。这使得夹具的管理变得更加容易和灵活。例如,以下是一个使用autouse fixture自动启用测试日志记录的示例:

import pytest

@pytest.fixture(autouse=True)
def log_test_info(request):
    """Auto logs information about the tests being run"""
    print(f"Running test {request.node.name}")

这里,autouse=True表示此fixture将自动应用于所有测试用例,无需手动运行。

插件系统,使得扩展功能变得非常容易

pytest的插件系统非常丰富,支持大量第三方插件和自定义插件。这些插件可以轻松地扩展pytest的功能,例如增强断言、生成更高级别的报告、支持分布式测试等。以下是一个使用pytest-html插件生成HTML测试报告的示例:

$ pytest --html=report.html

支持并发执行

与unittest不同,pytest具有内置并发执行功能。pytest-xdist是一个非常流行的第三方插件,可用于实现分布式测试和多进程测试。以下是一个使用xdist插件并发运行测试的示例:

$ pytest -n 4

这里,-n参数告诉pytest使用4个进程来运行测试。

断言详细信息

当测试失败时,pytest会在控制台上提供更详细的错误信息,以便开发人员更容易地调试代码。例如,以下是一个使用pytest的详细错误信息的示例:

E       assert 'foo'.upper() == 'FOO'
E         AssertionError: assert 'FOO' == 'FOO '
E           - FOO
E           + FOO

pytest还提供了其他工具来帮助开发人员更轻松地查看和分析测试结果,例如pytest-watch用于自动重新运行测试,pytest-cov用于测量测试覆盖率等等。

结论

本文对比了Python测试框架中的unittest和pytest之间的差异,包括用例编写规则、前置和后置方法、参数化、断言功能、用例执行和报告生成等方面。尽管它们有着相同的目标和基本特征,但在实际应用过程中表现出了不同的特点。

pytest比unittest更加灵活、易用、高效和可扩展,因此建议优先考虑使用pytest进行Python测试。

除了本文中提到的功能之外,pytest还具有其他许多有用的特性,例如参数化、fixture管理、插件系统、并发执行、详细断言信息等,可以进一步提高测试效率和质量。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据…

本地知识库搭建教程来了,跟着做就行

你是不是常常因为找不到几个月前那个重要的工作笔记而头疼?或者是厌倦了反复在互联网的海洋中搜寻相同的信息?一个本地的知识库可能是你需要的解决方案。今天,我就要为你分享如何简单地搭建起自己的知识库,让你的信息更有组织、更…

别等Sora了!字节跳动旗下国产AI工具Dreamina,AI视频生成虽不完美,但够惊艳!

别等 Sora 了,试试字节跳动的 Dreamina!Dreamina 是剪映旗下的一个 AI 创作平台,目前支持「文生图」、「智能画布」和「视频生成」功能。 Dreamina 官网:https://dreamina.jianying.com/ai-tool/home 之前对 Dreamina 的「文生图…

大数据------JavaWeb------JDBC(完整知识点汇总)

JDBC 定义 全称为Java数据库连接(Java DataBase Connectivity):是使用java语句来操作所有关系型数据库的一套API JDBC本质 它是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂商会去实现…

socat神器解密:网络数据传输的利器

欢迎来到我的博客,代码的世界里,每一行都是一个故事 socat神器解密:网络数据传输的利器 前言socat简介基本用法常见功能常见功能:1. 端口转发和数据重定向:2. 加密和解密数据流: 高级功能1. 代理服务器和隧…

Tomcat启动闪退的10个解决小技巧

引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的。 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事。 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项目或者修复一个重要的bug时。 不过…

单链表的创建与修改

链表的分类: 链表可按照:1.双向,单向。2.循环,不循环。3.带头,不带头。 根据不同组合可分为8类。其中不带头单项不循环链表为单链表。 单链表的第一个节点为头节点: 节点的创建: 通过这样一…

2024 年排名前 5 的 CSS 框架

文章目录 1、Bootstrap2、Tailwind CSS3、Foundation4、Bulma5、UIKit 1、Bootstrap Bootstrap框架是由Twitter的设计师Mark Otto和Jacob Thornton合作开发的,于2011年8月在GitHub上发布。它是目前最受欢迎的前端框架之一,被广泛应用于各种Web项目中。Bo…

基于机器学习预测岗位薪资

本文根据某招聘网站抓取的岗位信息,来预测该岗位平均薪资。 数据预处理 数据示例如下: 因为本文重点介绍如何实现预测,因此对于数据的预处理部分讲解一下处理逻辑: 1、统一薪资的单位,要么统一为年薪(万/…

【Linux】序列化与反序列化{服客编程/守护进程/JSON}

文章目录 1.引入2. 静态成员函数3.TCP:传输控制协议4.守护进程4.0前台进程4.1介绍4.2认识4.3会话4.3ps axj4.4理解4.5/dev/null4.6守护进程和孤儿进程 5.JSON6.完整代码6.1Makefile6.2Socket.hpp6.3Protocol.hpp6.4Log.hpp6.5Daemon.hpp6.6TcpServer.hpp6.7Client.c…

PBXAI:将疾病预测转为沿知识图谱的随机游走

PBXAI:将疾病预测转为沿知识图谱的随机游走 PBXAI 知识图谱构建 病人特征与知识图谱连接 强化学习 疾病发展路径的生成PBXAI 流程PBXAI 算法设计 论文: https://arxiv.org/ftp/arxiv/papers/2010/2010.08300.pdf 代码:https://github.co…

NLP_知识图谱_介绍、构建、问答知识

文章目录 知识图谱的介绍图图能做些什么任务基于图的推荐系统图的一些基本概念与表述有向图与无向图节点的度节点的边的数量有向图又分为入度和出度 什么是知识图谱知识图谱属于异质图知识图谱的schema知识图谱的应用场景 知识图谱的构建三元组如何构建知识图谱构建知识图谱通常…

基于springboot+vue+Mysql的简历系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

C语言输出不同颜色的字体

本文章在Linux进行演示!!! 使用C语言输出不同颜色字体和背景 格式: printf("\033[字体背景颜色;字体颜色m字符串\033[0m"); 上边的 \033 也可以用 \e 来代替。 字体颜色与字符的对应关系 字符颜色30黑色31红…

小白学视觉 | 各种各样神奇的自注意力机制(Self-attention) 建议收藏!

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。 原文链接:收藏!各种各样神奇的自注意力机制(Self-attention) 编者荐语 文章总结了关于李宏毅老师在 2022 年春季机器学习课…

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作,经常性发热严重,并且时间慢。直到昨天编译一个项目用时30分钟,电脑温度很高,并且有烧灼的味道,于是有了此篇文章。 二、…

关于Jar包提示找不到主类 找不到或无法加载主类

关于Jar包提示找不到主类 找不到或无法加载主类 当时看到教程打包一个正常的小型增删改查为50MB,也就是几十MB,可我打包得到的Jar包只有几MB,一直提示找不到主类application。经检查 根据方法,只需使用mvn clean 和 mvn packa…

大米自动化生产线设备:现代粮食加工的核心力量

随着科技的不断进步和粮食加工行业的快速发展,大米自动化生产线设备在现代粮食加工中的地位愈发重要。这些设备不仅大大提高了生产效率,还保证了产品的质量和安全,成为了现代粮食加工行业不可或缺的核心力量。 一、自动化生产线设备助力效率提…

厂房起火3D消防灭火安全救援模拟演练

深圳VR公司华锐视点依托前沿的VR虚拟现实制作、三维仿真和图形图像渲染技术,将参训者带入栩栩如生的火灾现场。佩戴VR头盔,参训者将真切体验火势蔓延的紧张与危机,身临其境地感受火灾的恐怖。 并且消防安全VR虚拟现实演练系统精心模拟了住宅、…

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页:秋风起,再归来~ 文章专栏:C语言实战项目 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、前言 友友们,这篇文章是基于单链…