更远 
系统软件测试(尤其是在Python社区中)通常被完全忽略或以特殊方式执行。 许多Python程序员完全不了解pytest的存在。 Brian Ocken费力证明pytest测试软件简单,自然,甚至有趣。
德米特里·季诺维耶夫(Dmitry Zinoviev)
Python数据科学基础知识作者

本书中的示例是使用Python 3.6和pytest 3.2编写的。 pytest 3.2支持Python 2.6、2.7和Python 3.3+。
本书网页上的链接 pragprog.com上提供了Tasks项目以及本书中显示的所有测试的源代码。 您无需下载源代码即可了解测试代码。 示例中以方便的形式提供了测试代码。 但是,为了跟上项目的任务,或者改编测试示例来测试自己的项目(不费力气!),您必须转到本书的网页并下载工作。 在该书的网页上,有一个勘误信息链接和一个论坛 。
在剧透下方是该系列文章的列表。
致谢
首先,我要感谢米歇尔-我的妻子和最好的朋友。 遗憾的是您没有看到我正在写的房间。 我有一张古董方形橡木餐桌,而不是桌子,桌上有足够的空间可放置纸张。 多年来,我们收集了一个漂亮的玻璃书架,上面放着我的复古太空玩具,还有技术书籍,电路板和杂耍球。 用来将纸张存放到顶部的古董铝制盒子,里面装满了笔记,绳索和火箭的剩余贴纸。 一堵墙覆盖着天鹅绒,这是我们很多年前购买的,当时这家布料店决定永久关闭。 录制播客时,面料应使回声平息。
我喜欢在这里写书,不仅因为它很方便并且与我的内心世界保持一致,还因为它是Michel与我以及为我创造的空间。 她和我一直是一个团队,她为我的疯狂想法提供了令人难以置信的支持,他们写了一个博客,开始了一两个播客,现在,在过去一年左右的时间里,写这本书。 她确保我有时间和空间写作。 当我感到疲倦并考虑我是否仍然有写作能力时,她让我继续二十分钟,观察我的感受,然后她帮我度过了后来的时光。大学之夜。 没有她,我真的无法做到。
我还有两个令人惊讶的,奇妙而又聪明的女儿,加布里埃拉和索非亚,这是我最大的两个粉丝。 埃拉(Ella)为所有谈论编程的人听我的播客,菲亚(Pia)在背包里标了一张测试代码贴纸,她在二年级就读了。
还有很多人要感谢。
我的编辑凯瑟琳·德沃夏克(Katherine Dvorak)帮助我将一堆随机的想法和主题紧密结合在一起,这就是为什么这是一本书而不是一系列博客文章在一起的原因。 我以博客作者的身份进入这个项目,对很多头条新闻,小标题和列表项都很感兴趣,凯蒂耐心地指导我,以便我可以成为一名更好的作家。
感谢Suzanne Davidson Palatinate,Andy Hunt和其他Pragmatic Bookshelf给我机会。
技术审查人员在pytest中保持了诚实,在Python风格中也使我诚实,这也是代码示例遵循PEP 8的原因。感谢Oliver Bestwalter,Florian Bruhin,Floris Bruinog,Mark Goody,Peter Hampton,Dave Hunt,Al Crinker,Lokesh库玛鲁·马卡尼(Kumaru Makani),布鲁诺·奥利维拉(Bruno Oliveira),罗尼·普芬施密特(Ronnie Pfannschmidt),拉斐尔·皮尔津(Rafael Pierzine),卢西亚诺·拉玛洛(Luciano Ramallo),弗兰克·鲁伊斯(Frank Ruiz)和德米特里·兹诺维耶夫(Dmitry Zinoviev)。 此列表中的许多人也是pytest内核开发人员和/或支持令人难以置信的pytest插件。
特别感谢Luciano。 写完这本书后,我将前四章发给了几位审稿人。 卢西亚诺是其中之一,而他的评论是最难读的。 我认为我并没有听从他的所有建议,但是由于他的言论,我修改并重写了前三章的大部分内容,并对本书的其余部分进行了更改。
感谢整个pytest-dev团队创建了如此出色的测试工具。 感谢Oliver Bestwalter,Florian Bruhin,Floris Bruinoh,Dave Hunt,Holger Krekel,Bruno Oliveira,Ronnie Pfannschmidt,Rafael Pierzine以及许多其他人回答了我多年来的生活问题。
最后但同样重要的是,我要感谢那些感谢我的人。 他们借此机会通过电子邮件通知我,我的工作节省了时间,并使工作更轻松。 这很酷,让我开心! 谢谢你
布莱恩·奥克肯
2017年9月
前言
Python的使用不仅在软件开发中不断增加,而且在数据分析,研究,测试和测量等领域以及其他行业也在不断增长。 在许多关键领域中,Python的发展也伴随着对正确,高效地进行软件测试以确保程序正确运行并给出正确结果的渴望。 此外,越来越多的软件项目跨越了持续集成,并且由于发布周期缩短而自动测试阶段不断增加,而对日益复杂的项目进行仔细的手动测试根本不可行。 团队应该能够信任由持续集成服务器执行的测试,该测试告诉他们是否可以足够信任自己的软件来发布它。
输入pytest。
什么是pytest?
pytest是可靠的Python测试工具,可用于所有类型和级别的软件测试。 pytest可以由开发团队,质量保证团队,独立的测试小组,从事TDD的人员以及开源项目使用。 实际上,整个Internet上的项目已经从unittest或鼻子转移到pytest ,包括Mozilla和Dropbox。 怎么了 因为pytest提供了强大的功能,例如重写“断言”,第三方插件模型以及功能强大但简单的夹具模型,是其他任何测试框架所无法比拟的。
pytest是一个软件测试平台,这意味着pytest是一个命令行程序。 一个自动查找书面测试,运行测试并写入结果的报告的工具。 它具有一个乳液库,您可以在测试中使用它们来帮助您更有效地进行测试。 可以通过编写自己的插件或安装第三方插件来扩展它。 它可以用来测试Python发行版。 并且它与其他工具无缝集成,例如持续集成和Web自动化。
pytest在众多其他集成系统测试中脱颖而出的原因如下:
- 简单的测试很容易用pytest编写。
- 复杂的测试甚至更容易编写。
- 测试很容易阅读。
- 测试很容易阅读。 (非常重要,要两次指出。)
- 您可以在几秒钟内上手。
assert
用于失败的测试,而不是self.assertEqual()
或self.assertLessThan()
。 断言 !- 您可以使用pytest运行针对unittest或鼻子编写的测试。
pytest是一个充满热情且不断发展的社区的积极开发和支持。 它具有很好的可扩展性和灵活性,可以轻松地适合您的工作流程。 由于它是与您的Python版本分开安装的,因此您可以在旧版Python 2(2.6和更高版本)和Python 3(3.3和更高版本)上使用相同最新版本的pytest。
测试示例应用程序时学习pytest
您是否想通过测试在现实生活中从未见过的愚蠢示例来学习pytest? 我也是 在本书中我们不会这样做。 相反,我们将为一个项目编写测试,我希望该项目与阅读本书后要测试的应用程序有很多共同点。
任务项目
我们将查看的应用程序称为“任务”。 Tasks是带有命令行界面的最小任务跟踪应用程序。 它与许多其他类型的应用程序有足够的共通之处,我希望您可以轻松地看到在针对问题进行测试时所学到的测试概念如何适用于现在和将来的项目。
尽管Tasks具有命令行界面(CLI),但是CLI通过应用程序编程接口(API)与其余代码交互。 API是我们将大部分测试引向的接口。 该API与数据库管理层交互,后者与文档数据库MongoDB或TinyDB交互。 数据库的类型是在初始化数据库时配置的。 在关注API之前,让我们看一下任务本身,这是一个提供任务用户界面的命令行工具。
这是一个示例会话:
$ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $
译者注:在使用Windows平台的情况下,在测试此会话时遇到了一些问题。
- 应该在您的用户文件夹中为TinyDB数据库创建一个名为
tasks_db
的文件夹。 例如c:\Users\User_1\tasks_db\
- 使用引号而不是撇号。 否则,我们会收到这样的错误。
$任务添加“执行其他操作”
用法:任务添加[选项]摘要
错误:得到了意外的额外参数(其他“”)
这不是最困难的任务管理应用程序,但是足够复杂以用于研究测试。
测试策略
尽管pytest适用于单元测试,集成测试,系统测试或端到端测试和功能测试,但Tasks项目测试策略主要侧重于皮下功能测试。 以下是一些有用的定义:
- 单元测试 :一种测试,它与系统的其余部分隔离地测试一小段代码,例如函数或类。 我将在第1页的第1章pytest入门中复查测试,以执行单元测试任务的数据结构。
- 集成测试 :测试更大代码段的测试可以包括多个类或子系统。 通常,用于某些测试的标签大于单元测试,但小于系统测试。
- 系统测试 (端到端) :一种测试,它在尽可能接近最终用户环境的环境中测试整个被测系统。
- 功能测试 :测试一项系统功能的测试。 功能测试是一项测试功能,它测试我们在“任务”中添加,删除或更新任务项的程度。
- 皮下测试 :不是针对最终用户界面而是针对位于表面下方的界面运行的测试。 由于本书中的大多数测试都是在API级别而不是CLI级别进行的,因此可以称为皮下测试。
这本书是如何组织的?
在第1页的第1章“ pytest入门”中,安装pytest并准备使用它。 然后,您进入Tasks项目的一部分-一个表示单个任务的数据结构(名为Task的元组),并使用它来测试示例。 您将学习如何使用多个测试文件运行pytest。 您将看到pytest的许多流行且极其有用的命令行选项,例如重新启动测试失败,在第一次失败后停止执行,控制堆栈跟踪和测试运行的多页版本的功能。
在第23页的第2章“创建测试函数”中,您可以通过pip在本地安装Tasks,并了解如何在Python项目中构建测试。 您必须执行此操作才能开始为实际应用程序编写测试。 本章中的所有示例都针对已安装的应用程序运行测试,包括写入数据库。 实际的测试功能是本章的重点,您将学习如何在测试中有效使用assert
。 您还将了解标记。 该功能允许您标记许多将同时运行的测试,标记将被跳过的测试或告诉pytest我们已经知道某些测试将失败。 我将讨论如何不仅使用标记来运行某些测试,而且还要通过将我们的测试代码结构化为目录,模块和类,以及如何运行这些测试子集来讨论。
并非所有测试代码都包含在测试功能中。 在第49页的第3章“ pytest固定装置”中,您将学习如何将测试数据放入测试固定装置,以及配置和破坏代码。 设置系统(或子系统或单个单元)的状态是软件测试的重要组成部分。 您将学习pytest固定装置的这一方面,以帮助初始化Tasks项目数据库并预先填充某些测试的测试数据。 夹具是pytest不可思议的强大组成部分,您将学习如何有效地使用它们来进一步减少测试代码的重复,并有助于使您的测试代码具有令人难以置信的可读性和可维护性。 Pytest固定装置也可以进行参数化,类似于测试功能,并且您将使用此功能来对TinyDB和MongoDB(Tasks支持的数据库服务器部件)运行所有测试。
在第71页的第4章“内置固定装置”中,您将看到pytest提供的一些内置固定装置。 您将了解pytest内置固定装置如何为您跟踪临时目录和文件,如何帮助您检查测试代码的输出,使用猴子补丁,检查警告等等。
在第95页第5章“插件”中,您将学习如何向pytest添加命令行选项,如何更改pytest的输出以及如何通过编写,打包和分发与其他用户共享pytest设置(包括固定装置)(分发)自己的插件。 我们在本章中开发的插件用于创建测试任务时看到的测试错误,更好一些。 您还将学习如何正确测试测试插件。 什么样的元? 为了以防万一,如果您对本章的启发不足以编写自己的插件,我会挑选一堆很棒的插件来说明第163页附录3“插件采样器包”中的功能。
谈到自定义,在第113页的第6章“配置”中,您将学习如何使用配置文件为项目配置默认的pytest启动。 使用pytest.ini文件,您可以执行以下操作,例如存储命令行参数,这样您就不必一直输入它们,告诉pytest不要在特定目录中查找测试文件,指定pytest的最低版本测试等等。 这些配置项可以放在tox.ini或setup.cfg中 。
在第7章的最后一章,第125页上,将pytest与其他工具结合使用,您将看到如何使用已经强大的pytest以及如何使用其他工具来使测试过载。 您将在具有tox的多个Python版本上运行Tasks项目。 您将测试CLI任务而不用模拟运行系统的其余部分。 您将使用coverage.py来检查任务项目的源代码是否正在测试中。 您将使用Jenkins运行测试套件并随时间显示结果。 最后,您将了解如何将pytest用于运行unittest测试,以及如何与基于unittest的测试交换pytest样式的固定装置。
你需要知道的
巨蟒
您无需成为Python专家。 例子没有做任何超自然或怪异的事情。
点子
您必须使用pip来安装pytest插件和pytest本身。 如果要升级pip,请参阅第159页的附录2 pip。
指令行
我写了这本书,并捕获了在Mac笔记本电脑上使用bash的输出示例。 但是,我在bash中使用的唯一命令是cd进入特定目录,当然还有pytest。 由于cd存在于Windows cmd.exe和我所知道的所有unix shell中,因此所有示例都应可在您决定使用的任何终端应用程序中运行。
仅此而已。 您无需成为编程专家就可以开始使用pytest编写自动化测试。
代码示例和Internet资源
本书中的示例是使用Python 3.6和pytest 3.2编写的。 pytest 3.2支持Python 2.6、2.7和Python 3.3+。
本书网页上的链接 pragprog.com上提供了Tasks项目以及本书中显示的所有测试的源代码。 您无需下载源代码即可了解测试代码。 示例中以方便的形式提供了测试代码。 但是,为了跟上项目的任务,或者改编测试示例以检查自己的项目(不费力气!),您必须转到本书的网页下载该作品。 在该书的网页上,有勘误发布和讨论论坛的链接。
我已经进行了25年的编程工作,没有什么让我像pytest一样编写测试代码。 希望您从这本书中学到很多东西,并希望最终您会像我一样喜欢测试代码。
更远 