您如何管理项目中的PHPUnit文件?
你将它添加到你的git存储库还是忽略它们?
你在你的PHPdocs代码中使用@assert 标签吗?
3 回答
设置
我目前没有使用 php,但我正在使用git 中的python 单元测试和sphinx 文档。我们将测试添加到 git,甚至对推送到远程devel
和master
分支的测试通过有一定的要求(master
比 更难devel
)。这保证了一些代码质量(也应该评估测试覆盖率,但那还没有实现:))。
我们将测试文件放在它们所属目录中顶级源目录旁边的单独目录test_
中,前缀为,以便单元测试框架自动找到它们。
对于类似的文档,我们只是将 sphinx docs 文件放入它们自己的子目录(docs)中,在我们的例子中,这是一个独立的 git 子模块,将来可能会更改。
基本原理
我们希望能够跟踪测试中的变化,因为它们应该很少见。频繁的更改表明代码不成熟。
其他团队成员需要访问测试,否则他们将毫无用处。如果他们在某些地方更改代码,他们必须能够验证它不会破坏任何东西。
文档属于代码。在 python 的情况下,代码直接包含文档。所以我们必须将它们放在一起,因为文档是从代码生成的。
在存储库中拥有测试和文档允许在远程服务器上进行自动化测试和文档构建,这为我们提供了即时更新的文档和测试反馈。同样,基于测试结果的“代码质量”限制的实现也是如此(它实际上更多地提醒人们运行测试,因为如果不查看测试覆盖率就无法通过测试检查代码质量)。如果测试未通过,则 git 服务器会拒绝 Refs。
例如,我们要求在 上
master
,所有测试都必须通过或被跳过(遗憾的是,我们需要跳过,因为某些测试需要 OpenGL,这在 headless 上不可用),而devel
如果测试只是“表现得像预期的那样”(即通过、跳过或预期失败,没有意外成功、错误或失败)。
是的,将它们保存在 git 中。我通过查看项目获得了其他约定,包括 phpunit 本身。(看一下教义 2 示例表明它似乎遵循相同的约定。)
我将测试保存在顶级tests
目录中。在此之下,我对子目录进行了有意义的命名,通常遵循主项目目录结构。我有一个functional
用于测试多个组件的子目录(如果适用)。
我创建phpunit.xml.dist
告诉它在哪里可以找到测试(并立即告诉任何查看源代码的人我们使用 phpunit,并且通过查看 xml 文件,他们也可以理解约定)。
我不使用@assert
或骨架生成器。感觉就像一个玩具功能;您在一个地方(您的源文件)进行一些输入以在另一个地方(您的单元测试文件)保存一些输入。但是随后您将扩展单元测试文件中的测试(请参阅我的下一段),甚至可能删除一些原始断言,现在@assert
原始源文件中的条目已过时并误导任何只看的人那个代码。
您还失去了最终需要对真实世界类进行真实世界测试的大量功能(简单的 BankAccount 示例,我正在看着您)。没有setUp()
/ tearDown()
。没有实例变量。不支持所有其他内置断言函数,更不用说自定义函数了。没有@depends
和@dataProvider
。
反对@assert
和维护一个单独的tests
目录树的另一个原因是:我喜欢不同的人尽可能地编写测试和实际代码。当测试失败时,有时表明您的编码人员或测试人员对原始项目规范存在误解。当代码和测试紧密结合在一起时,很容易同时更改它们。尤其是在周五下午晚些时候,当你有约会的时候。
我们将测试与代码文件一起存储,因此开发人员可以看到要执行的测试,并确保他们根据需要更改测试。我们只需在文件中添加 .test 的扩展名。这样,我们可以简单地将原始文件自动包含在每个测试文件中,然后可以使用模板创建该文件。当我们发布代码时,构建过程会从所有目录中删除 .test 文件。
/application/src/
Foo.php
Foo.php.test
/application/src/CLASS/
FOO_BAR.class
FOO_BAR.class.test
require_once(substr(__FILE__, 0, -5)); // strip '.test' extension