在上一章中,我们学习了许多可以用来将基于unittest的套件转换为 pytest 的技术,从简单地将其用作运行程序,一直到将复杂的现有功能移植到更为 pytest 友好的样式。
这是本快速入门指南的最后一章,我们将讨论以下主题:
- 我们所学内容的概述
- pytest 社区
- 下一步
- 最后总结
以下各节将总结我们在本书中学到的内容。
- 你应该把考试作为你的安全网。它将使您对自己的工作更有信心,使您能够自信地进行重构,并确保您不会破坏系统的其他部分。
- 如果您要将 Python2 代码库移植到 Python3,测试套件是必不可少的,任何指南都会告诉您,(https://docs.python.org/3/howto/pyporting.html#have-良好的测试覆盖率。
- 如果您所依赖的外部 API没有自动测试,那么为它们编写测试是个好主意。
- pytest 之所以是初学者的最佳选择之一,是因为它很容易入门;使用简单的函数和
assert语句编写测试
- 始终使用虚拟环境来管理包和依赖项。此建议适用于任何 Python 项目。
- pytest内省功能使您的支票表达更简洁;直接比较字典、文本和列表很容易。
- 用
pytest.raises检查异常,用pytest.warns检查警告。 - 将浮点数和数组与
pytest.approx进行比较。 - 试验机构;您可以将您的测试与您的应用程序代码内联,或者将它们保存在单独的目录中。
- 选择带有
-k标志的测试:-k test_something。 - 使用
-x在第一个故障处停止。 - 还记得可怕的重构组合:
--lf -x吗。 - 用
-s禁用输出捕捉。 - 用
-ra显示测试失败、失败和跳过的完整摘要。 - 对于每个存储库配置的使用
pytest.ini。
- 使用
@pytest.mark修饰符在测试函数和类中创建标记。要应用于模块,请使用pytestmark专用变量。 - 使用
@pytest.mark.skipif、@pytest.mark.skip和pytest.importorskip("module")跳过不适用于当前环境的测试。 - 使用
@pytest.mark.xfail(strict=True)或pytest.xfail("reason")标记预计不通过的测试 - 使用
@pytest.mark.xfail(strict=False)标记片状试验。 - 使用
@pytest.mark.parametrize快速测试多输入的代码,测试同一接口的不同实现。
- 夹具是 pytest 的主要功能之一,用于共享资源并提供易于使用的测试助手。
- 使用
conftest.py文件跨测试模块共享夹具。请记住,更喜欢本地导入以加快测试收集。 - 使用自动使用夹具,确保层次结构中的每个测试都使用特定夹具执行所需的设置或拆卸操作。
- 夹具可以假设多个范围:
function、class、module和session。明智地使用它们来减少测试套件的总时间,记住高级夹具实例是在测试之间共享的。 - 夹具可以使用
@pytest.fixture装饰器的params参数参数化。所有使用参数化夹具的测试都将自动参数化,使其成为一个非常强大的工具。 - 使用
tmpdir和tmpdir_factory创建空目录。 - 使用
monkeypatch临时更改对象、字典和环境变量的属性 - 使用
capsys和capfd捕获并验证发送到标准输出和标准错误的输出。 - fixture 的一个重要特征是它们抽象方式依赖关系,并且在使用简单函数和fixture 之间保持平衡
- 使用
plugincompat(http://plugincompat.herokuapp.com/ 和 PyPI(https://pypi.org/ 搜索新插件。 - 插件安装简单:与
pip一起安装并自动激活。 - 有大量的插件可以满足所有的需求。
- 您可以以跑步者身份切换到pytest开始。通常,这可以通过现有代码中的零更改来完成。
- 使用
unittest2pytest将self.assert*方法转换为普通assert。 - 现有的设置和拆卸代码可以通过自动使用夹具进行小规模重构来重用。
- 复杂的测试实用程序层次结构可以重构为更多模块化夹具,同时保持现有测试正常工作。
- 实现迁移的方法有很多:一次转换所有,在更改现有测试时转换测试,或者只对新的测试使用 pytest。这取决于测试套件的大小和时间预算。
我们的社区生活在 GitHub(上的pytest-dev组织中 https://github.com/pytest-dev 和比特桶(https://bitbucket.org/pytest-dev )。pytest 存储库(https://github.com/pytest-dev/pytest 本身托管在 GitHub 上,而 GitHub 和 Bitbucket 都托管了许多插件。成员们努力使社区尽可能欢迎和友好地对待来自不同背景的新贡献者。我们在pytest-dev@python.org上还有一个邮件列表,欢迎大家加入(https://mail.python.org/mailman/listinfo/pytest-dev 。
大多数 pytest 开发人员成员居住在西欧,但我们的成员来自世界各地,包括阿联酋、俄罗斯、印度和巴西(我住在那里)。
由于所有 pytest 维护都是完全自愿的,因此我们一直在寻找愿意加入社区并提供帮助的人,真诚地与其他人一起努力改进 pytest 及其插件。参与的方式有很多:
- 提交功能请求;我们喜欢听到用户关于他们希望在 pytest 或插件中看到的新特性。确保将其作为问题报告以开始讨论(https://github.com/pytest-dev/pytest/issues )
- 报告错误:如果您遇到错误,请报告。我们尽最大努力及时修复 bug。
- 更新文件;我们有许多与文档相关的未决问题(https://github.com/pytest-dev/pytest/issues?utf8=%E2%9C%93 &q=is%3Issue+is%3Open+sort%3Update desc+标签%3A%22 状态%3A+easy%22+标签%3A%22 类型%3A+单据%22+。如果你喜欢帮助别人并写出好的文档,这是一个很好的帮助别人的机会。
- 实施新功能;虽然代码库对于新手来说可能令人望而生畏,但有许多特性或改进都标有一个简单的标签(https://github.com/pytest-dev/pytest/issues?q=is%3Aissue+是%3Aopen+sort%3Aupdated desc+标签%3A%22status%3A+easy%22,对新贡献者很友好。此外,如果您不确定,请随时询问!
- 修复 bug;尽管 pytest 针对自身进行了 2000 多个测试,但它与任何软件一样都存在 bug。我们总是乐于审查已知 bug 的拉取请求(https://github.com/pytest-dev/pytest/issues?q=is%3Aissue+是%3 打开+排序%3 更新的描述+标签%3A%22 类型%3A+错误%22。
- 通过使用
#pytest散列标签或提及@pytestdotorg在 twitter 上传播你的爱。我们也喜欢阅读关于您使用 pytest 体验的博客文章。 - 在许多会议上,社区成员组织研讨会、冲刺或演讲。一定要打招呼!
很容易成为一个贡献者;您只需提交一个有关相关代码更改、文档或 bug 修复的请求,如果您愿意,您可以成为pytest-dev组织的成员。作为成员,您可以帮助回答、标记和关闭问题,以及查看和合并请求
另一种贡献的方式是在 GitHub 或 BitBucket 上向pytest-dev提交新插件。我们喜欢将新插件添加到组织中,因为这提供了更高的可视性,并有助于与其他成员共享维护。
您可以在 pytest 网站(上阅读我们的完整贡献指南 https://docs.pytest.org/en/latest/contributing.html )。
2016 年 6 月,核心集团在德国弗莱堡举行了一次大型冲刺。超过 20 名参与者参加了为期六天的会议;该活动以实现新功能和解决问题为主题。我们进行了大量的小组讨论和闪电式的谈话,休息一天去美丽的黑森林徒步旅行。
该团队成功地发起了 Indiegogo 活动(https://www.indiegogo.com/projects/python-testing-sprint-mid-2016#/ ),目标为 11000 美元,用于报销差旅费用、短跑场地和参与者餐饮费用。最后,我们成功筹集了 12000 美元,这显示了使用 pytest 的用户和公司的感激之情。
非常有趣!我们肯定会在将来重复这一点,希望有更多的与会者。
在我们了解了所有这些之后,您可能急于开始使用 pytest,或者渴望更频繁地使用它。
以下是您可以采取的后续步骤的一些想法:
- 在工作中使用它;如果您已经在日常工作中使用 Python 并进行了大量测试,那么这是最好的开始方式。通过将 pytest 用作测试运行者,您可以慢慢开始,并以您感到舒服的速度使用更多 pytest 功能。
- 在您自己的开源项目中使用它:如果您是开源项目的成员或所有者,这是获得 pytest 经验的好方法。如果您已经有了测试套件就更好了,但是如果您没有,那么从 pytest 开始无疑是一个很好的选择。
- 为开源项目做出贡献;您可以选择一个具有
unittest风格测试的开源项目,并决定将其更改为使用 pytest。2015 年 4 月,pytest 社区组织了所谓的采用 pytest 月(https://docs.pytest.org/en/latest/adopt.html ),其中开源项目与社区成员配对,将他们的测试套件转换为 pytest。这次活动很成功,大多数参与者都玩得很开心。这是一个参与另一个开源项目并同时学习 pytest 的好方法。 - 有助于测试本身;如前一节所述,pytest 社区非常欢迎新的贡献者。我们很想拥有你!
Some topics were deliberately left out of this book, as they are considered a little advanced for a quick start, or because we couldn't fit them into the book due to space constraints.
- 毒物(https://tox.readthedocs.io/en/latest/ 是一个通用的虚拟环境管理器和命令行工具,可用于测试具有多个 Python 版本和依赖项的项目。如果您维护支持多个 Python 版本和环境的项目,那将是天赐良机。pytest 和
tox是兄弟项目,合作得非常好,尽管它们是独立的,并且对自己的目的很有用。 - 插件:本书没有介绍如何使用插件扩展 pytest,因此如果您感兴趣,请务必查看插件部分(https://docs.pytest.org/en/latest/fixture.html pytest 文档的),并查找其他可作为示例的插件。另外,请务必检查示例部分(https://docs.pytest.org/en/latest/example/simple.html 用于高级 pytest 定制的片段。
- 日志记录和警告是 pytest 内置支持的两个 Python 特性,本书没有详细介绍,但如果您广泛使用这些特性,它们当然值得一看。
因此,我们的快速入门指南到此结束。在本书中,我们有一个完整的概述,从在命令行上使用 pytest 一直到转换现有测试套件以利用强大的 pytest 特性的技巧和技巧。现在,您应该能够每天轻松地使用 pytest,并且能够根据需要帮助他人。
你已经成功了,恭喜你!我希望你已经学到了一些东西,并且在这过程中玩得很开心!