【问题标题】:Phpunit : Tests with same outcomePhpunit :具有相同结果的测试
【发布时间】:2013-10-06 20:28:19
【问题描述】:

我刚接触单元测试并尝试遵循 TDD。

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

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

现在...这些都在工作,一切都很好,并且很乐意接受更好的测试方法命名的提示。

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

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

但是我应该以相同的方式编写每个测试,还是有办法把它干掉,也许做一些可重用的测试?

【问题讨论】:

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


    【解决方案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);
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      相关资源
      最近更新 更多