历史¶
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)
同月,
py库从PyPy中分拆出来。在 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 发布,引入了许多基本功能
函数参数/固件
一个插件架构,今天看起来仍然非常相似!
各种默认插件,包括monkeypatch
即便在那时,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 月左右。