0

我知道每个人都同意单元测试应该是单一的事实。但是如果你读过这本书,你会注意到有构建测试套件的空间。

第 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 进行谁的测试,你有什么建议作为替代品?

4

1 回答 1

0

我将写下与 markus-tharkun 的讨论记录:

PHPUnit 旨在进行单元测试,这意味着:

单元测试的重点在于“单元”一词,这意味着您要测试独立单元而不是整个服务。如果每个小单元都有效,那么您的代码就有效。单元测试并不意味着测试你的整个架构是否有意义。

正如我问他的那样,如果您正在测试一个具有依赖关系的函数,您可以向该函数注入一个 Mock 对象。您应该模拟该函数的所有外部依赖项,包括安全层、用户对象、数据库访问等所有内容。如果你真的不能模拟依赖,那么你可以使用@depends,但应该避免这种情况。

Markus 建议我使用 Mockery 框架:https ://github.com/padraic/mockery

于 2012-12-09T19:33:33.717 回答