Phpunit:测试结果相同

时间:2013-09-30 20:34:02

标签: php unit-testing phpunit dry code-reuse

我是单元测试的新手并试图关注TDD。

我的CardStackTest,有很多测试,比如这些......

public function testGetTopStackThrowsExceptionIfFirstArgumentNotInt()
public function testGetTopStackReturnsNullIfNoCardsAvailable()
public function testGetTopStackReturnsInstanceOfCardStack()
public function testGetTopStackRemovesAmountOfCardsFromStack()
public function testGetTopStackReturnsRestOfCardsIfNumberHigherThanCardsAvailable()

现在......这些都是有效的,一切都很好,很乐意接受更好的测试方法命名的提示。

我的问题是。在我看来,我已经选择了getBottomStack方法。我知道它需要与我的getTopStack方法完全相同的测试。也许我会添加一个额外的测试beyound。

我的第一个想法是制作像testReturnsInstanceOfCardStack这样的私有方法,然后将公共测试点设为私有方法。

但是,我应该以同样的方式编写每个测试,还是有办法解决这个问题,也许可以进行一些可重复使用的测试?

1 个答案:

答案 0 :(得分:1)

如果您发现在测试用例中开始获得代码重复,您也可以开始重构测试用例的代码。

但是,当所有测试都是绿色(通过)时,请注意您只进行重构 。此规则不仅适用于代码库,还适用于测试库。

例如,您可以将重复的代码移动到私有方法中,然后在公共testXyz() - Method中调用。

以下是测试用例中私有帮助函数的示例,场景不同,但它应该有助于说明answer to "PHPUnit Testing version of assertIsA"

private function assertNumber($actual, $message = "Is a number")  {
    $isScalar = is_scalar($actual);
    $isNumber = $isScalar && (is_int($actual) || is_float($actual));
    $this->assertTrue($isNumber, $message);
}

进行可重复使用测试的另一种方法是使用数据提供程序,但更多的是测试数据。例如,如果多个测试方法需要相同的测试数据,则两者都可以共享一个数据提供者。

希望这有助于提供一些一般指导。尝试自己,不要忘记将所有代码和测试置于版本控制之下并经常提交。