历史¶
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 的风格编写,尤其是 unittest 框架
[……]
最好的 API 是不存在的 API
[……]
测试包应该尽可能少地要求样板代码,并提供很大的灵活性
它应该提供高质量的回溯和调试辅助
[……]
首先……忘记有限的“assertXYZ API”,使用真实的东西,例如
assert x == y
这适用于普通 Python,但你会得到无用的“assertion failed”错误,不包含任何信息
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
)之类的参数
此后似乎平静了一段时间,从 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 发布,引入了许多基本功能
函数参数/fixture
一个插件架构,今天看起来仍然非常相似!
各种默认插件,包括 monkeypatch
即使在那时,常见问题中也提到
显然,[第二个标准库]雄心勃勃,但其命名可能一直困扰着这个项目,而非助益。项目名称可能会在某个时候更改,并且可能会拆分成不同的项目。
这一切最终发生在 2010 年 11 月,当时 pytest 2.0.0 作为一个独立于
py
的包发布(但仍然称为py.test
)。2016 年 8 月,pytest 3.0.0 发布,将
pytest
(而非py.test
)作为推荐的命令行入口点。
由于这段历史,很难回答 pytest 是何时开始的问题。这取决于哪个时间点才应该真正被视为其起点。一种可能的解释是选择 2004 年的 Europython,即 2004 年 6 月/7 月左右。