【问题标题】:Writing test suites编写测试套件
【发布时间】: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


【解决方案1】:

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

PHPUnit 是针对单元测试的,也就是说:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-05-07
    • 2020-02-27
    • 2016-04-23
    相关资源
    最近更新 更多