单元测试分离

时间:2010-01-21 10:46:13

标签: php unit-testing design-patterns phpunit

这个问题与PHPUnit有关,虽然 应该是一个全局的xUnit设计问题。

我正在为一个班级Image编写单元测试用例。

此课程的其中一个方法是setBackgroundColor()

我需要为此方法测试4种不同的行为,

  1. 尝试设置无效的背景颜色。将测试多个无效参数。
  2. 尝试使用短手RGB阵列设置有效的背景颜色,例如array(255,255,255)
  3. 尝试使用标准RGB阵列设置有效的背景颜色,例如array('red' => 255, 'green' => 255, 'blue' => 255)(这是GD函数的输出格式imagecolorsforindex()
  4. 尝试使用透明常量IMG_COLOR_TRANSPARENT
  5. 设置有效的背景颜色

    目前,我已将所有这些包含在我的测试用例testSetBackgroundColor()中的1个测试中,但是我感觉这些应该是4个单独的测试,因为测试变得很长并且做了很多

    我的问题是,我该怎么办?我是否将所有这些封装到Image测试用例的1个测试中,或者我将上述内容拆分为单独的测试,例如,

    • testSetBackgroundColorErrors
    • testSetBackgroundColorShorthandRGB
    • testSetBackgroundColorRGB
    • testSetBackgroundColorTransparent

    我在这里提出了问题http://pastebin.com/f561fc1ab

    感谢

4 个答案:

答案 0 :(得分:7)

拆分它。绝对

当单元测试失败时,必须立即清楚究竟是什么断了。如果组合测试,您将调试单元测试失败。

顺便问一下,你是writing tests first吗?使用TDD,它不太可能最终得到臃肿的测试。

答案 1 :(得分:3)

我倾向于按照您的描述拆分测试。

  • 当测试失败并因此更快地调试
  • 时,它会更明显地出现问题
  • 您可以将对象重置为测试条件之间的干净启动状态
  • 通过查看方法名称
  • ,可以更轻松地查看您已包含/省略的测试

答案 2 :(得分:0)

我在概念上将我的测试分为两类(正如相当多的TDD从业者所做的那样):集成测试和单元测试。单元测试应该测试一件事,我应该遵守我在任何特定时刻测试单一合同的规范 - 通常一种方法需要一次测试。这迫使我编写一些小而可测试的方法,这些方法让我高度自信。这反过来又会引导我去编写小型可测试类。

集成测试是更高级别的测试,用于证明组件之间的交互问题,否则这些组件将被证明可以通过单元测试单独工作。我写的更少,并且必须明智地应用它们,因为永远不会有完全的集成级别覆盖。这些重点是证明各个组件之间风险较大的交互领域,并可以使用书面验收测试作为指导。

识别需要进行集成测试的区域更像是一种“感觉”。如果您对单元测试一直保持纪律,那么您应该很好地了解集成测试需求的位置,即具有更深调用堆栈或跨进程交互的区域,或者您知道风险较高的区域。或者,您可以决定集成测试是证明高级行为期望的好方法,这些期望可以映射到产品所有者的书面要求。这也很好用。

答案 3 :(得分:0)

是的,您应该将它们分成四个测试。也许你不愿意,因为它会重复代码。我读了一篇文章,认为单元测试应该非常可读(抱歉,我没有参考)。它继续讨论如何做到这一点,但它的要点是编写效用函数。