历史

pytest 拥有一段漫长而有趣的历史。此仓库的首次提交来自 2007 年 1 月,即使是那次提交本身也足以说明很多:该仓库最初来自 py 库(后来分拆为 pytest),它最初是一个 SVN 版本,迁移到 Mercurial,最终迁移到 git。

然而,该提交表示“创建新的开发主干”并且已经相当庞大:435 个文件更改,58640 次插入(+)。这是因为 pytest 最初是作为 PyPy 的一部分而诞生的,旨在使其更容易编写测试。以下是它如何从那里演变为一个独立项目的故事。

  • 2002 年底 / 2003 年初,PyPy 诞生

  • 正如那篇博客文章所提到的,从很早开始,就非常注重测试。在 unittest.py 之上有很多 testsupport 文件,早在 2003 年 6 月,Holger Krekel (@hpk42) 重构了他的测试框架以清理代码(pypy.tool.test,但仍然基于 unittest.py,当时还没有任何类似 pytest 的东西)。

  • 2003 年 12 月,Stefan Schwarzer 再次迭代改进了他们的测试状况,名为 pypy.tool.newtest

  • 然而,它似乎没有存在太久,因为在 2004 年 6 月/7 月左右,人们开始着手一个名为 utest 的东西,它提供纯断言。这看起来像是类似 pytest 的东西的开始,但不幸的是,当时测试运行器的代码在哪里尚不清楚。最接近的仍然存在的是这个文件,但这看起来根本不像一个完整的测试运行器。可以看到的是,Laura Creighton 和 Samuele Pedroni (@pedronis) 在自动将现有测试转换为新的 utest 框架方面进行了各种努力

  • 大约在同一时间,为了 2004 年的 Europython 会议,@hpk42 启动了一个项目,最初名为“std”,旨在成为一个“补充标准库”——已经为后来成为 pytest 的原则奠定了基础。

    • 当前“内置电池”非常有用,但是

      • 其中一些以 Java 类似风格编写,尤其是单元测试框架

      • […]

      • 最好的 API 是不存在的 API

    […]

    • 测试包应尽可能少地要求样板代码,并提供极大的灵活性

    • 它应提供优质的回溯和调试辅助

    […]

    • 首先……忘记有限的“assertXYZ API”,使用真实的东西,例如

      assert x == y
      
    • 这适用于纯 Python,但您会收到无用的“断言失败”错误,没有任何信息

    • std.utest(魔法!)实际上重新解释了断言表达式并提供了有关底层值的详细信息

  • 2004 年 9 月,py-dev 邮件列表诞生,现在pytest-dev,但值得庆幸的是所有原始档案都完好无损。

  • 大约在 2004 年 9 月/10 月,std 项目更名为 py,而 std.utest 变成了 py.test。这也是整个源代码首次似乎可用,其中许多 API 至今仍在使用。

    • py.path.local,在大约 16-17 年后(为了 pathlib)正逐步从 pytest 中淘汰

    • 收集树的思想,包括 Collector, FSCollector, Directory, PyCollector, Module, Class

    • 参数如 -x / --exitfirst, -l / --showlocals, --fulltrace, --pdb, -S / --nocapture(现在是 -s / --capture=off), --collectonly(现在是 --collect-only

  • 同月,pyPyPy 中分拆出来

  • 在 2004 年 10 月(从 PyPy 中移除 py)到 2007 年 1 月(当前 pytest 仓库的首次提交)之间,情况似乎平静了一段时间,几乎没有什么发生。然而,邮件列表上有一些关于功能/想法的讨论,并且每隔几个月都会发布几个版本

    • 2006 年 3 月:py 0.8.0-alpha2

    • 2007 年 5 月:py 0.9.0

    • 2008 年 3 月:py 0.9.1(pytest 更新日志中找到的第一个版本!)

    • 2008 年 8 月:py 0.9.2

  • 2009 年 8 月,py 1.0.0 发布,引入了许多基本功能

  • 即便在那时,FAQ 就已经提到

    显然,[第二个标准库]雄心勃勃,而命名可能一直困扰着这个项目,而非帮助它。或许有一天项目会改名,并可能拆分成不同的项目。

    这最终发生在 2010 年 11 月,当时 pytest 2.0.0 作为独立于 py 的包发布(但仍称为 py.test)。

  • 2016 年 8 月,pytest 3.0.0 发布,它将 pytest(而不是 py.test)作为推荐的命令行入口点

由于这段历史,很难回答 pytest 是何时开始的这个问题。这取决于究竟哪个时间点应该被视为这一切的开端。一种可能的解释是选择 Europython 2004,即大约在 2004 年 6 月/7 月左右。