【发布时间】:2012-12-09 18:24:39
【问题描述】:
我知道每个人都同意单元测试应该是单一的这一事实。但是如果你读过这本书,你会发现这里有构建测试套件的空间。
第 7 章。组织测试 PHPUnit 的目标之一(参见第 2 章)是测试应该是可组合的:我们希望能够一起运行任意数量或组合的测试,例如整个项目的所有测试,或者所有类的测试作为项目一部分的组件,或者只是单个类的测试。
示例 7.2:使用 XML 配置编写测试套件
<phpunit>
<testsuites>
<testsuite name="Object_Freezer">
<file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file>
<file>Tests/Freezer/IdGenerator/UUIDTest.php</file>
<file>Tests/Freezer/UtilTest.php</file>
<file>Tests/FreezerTest.php</file>
<file>Tests/Freezer/StorageTest.php</file>
<file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file>
<file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file>
</testsuite>
</testsuites>
</phpunit>
如果你添加测试依赖的能力:
测试依赖
编写单元测试主要是为了帮助开发人员识别和修复错误、重构代码以及作为被测软件单元的文档而编写的。为了实现这些好处,理想情况下,单元测试应该涵盖程序中所有可能的路径。一个单元测试通常涵盖一个功能或方法中的一个特定路径。然而,测试方法不一定是封装的、独立的实体。测试方法之间通常存在隐含的依赖关系,隐藏在测试的实现场景中。
您可以使用 @depends ClassName::Function 在类内或类之间使用依赖关系,并使用 ClassName::Function 提供的数据。
例如,如果 A 类提供了 B 类和 C 类也使用的数据,你会得到:
A {
function a()
{
return $data;
}
}
B {
/**
* @depends A::a
*/
function b($data)
{
return $data2;
}
}
C {
/**
* @depends B::b
*/
function c($data2)
{
}
}
为什么这么糟糕?将 A::a 中的代码复制到 B::b 类,然后将 A::a 和 B::b 中的代码复制到 C::c 类中是否更好?
我想学习您认为的最佳实践。我之前一直使用测试套件,单元测试非常适合测试独立功能,但是当您需要测试依赖于依赖关系的整个服务时,它会稍微复杂一些。 . 对于谁的测试,我应该完全放弃 PHPUnit,你有什么建议作为替代品?
【问题讨论】:
-
大家都分享什么事实?什么是单一的?
-
单元测试的重点在于“单元”一词,这意味着您要测试独立单元而不是整个服务。如果每个小单元都有效,那么您的代码就有效。单元测试并不意味着测试你的整个架构是否有意义。
-
IMO 单一意味着独立且注重功能
-
好的,那么为什么 PHPUnit 提供了他们的功能并在他们的文档中有所宣传?
标签: unit-testing phpunit