如何测试方法是否能很好地协同工作?

时间:2014-10-11 23:58:04

标签: php unit-testing

要测试的课程:

class TestMe
{
    public function add ($a, $b)
    {
        return $a + $b;
    }

    public function mul ($a, $b)
    {
        return $a * $b;
    }

    public function sumAddMul ($a, b)
    {
        $i = $this->add ($a, $b);
        $j = $this->mul ($a, $b);
        return $i + $j;
    }
}

识别TestClass:

public function testAdd()
{
    $sut = new TestMe();
    $this->assertEquals (9, $sut->add(4,5));
}

public function testAdd()
{
    $sut = new TestMe();
    $this->assertEquals (8, $sut->mul(4,2));
}

public function testSumAndMul()
{
    ?
}

那么,如何测试sumAndMul()?当然,我可以写:

public function testSumAndMul()
{
    $this->assertEquals (3, $this->sut->sumAndMul(1,1));
}

问题在于它再次测试已经测试过的东西。它正在测试相互合作的东西。

2 个答案:

答案 0 :(得分:1)

看到一个真实的例子会更有意义我猜。但是当你有更复杂的功能和更复杂的测试时,你建议的方式可能是最好的。当然,在给定的例子中,你可以做到以下几乎一刀三杀:

public function testSumAndMul()
{
    $sum       = $sut->add(1, 1);
    $mul       = $sut->mul(1, 1);
    $sumAndMul = $sut->sumAndMul(1, 1);

    $this->assertEquals(2, $sum);
    $this->assertEquals(1, $mul);
    $this->assertEquals(3, $sumAndMul);
}

单元测试是关于测试可能的最小单元。当您开始测试更大的块时,您开始偏离规则。尽可能保持每项测试的独立性是毫无疑问的最佳方法。

答案 1 :(得分:1)

不要太担心sumAndMul()在内部调用其他方法,因为没有内部逻辑可以根据输入改变其行为(如果有意义的话)。

只是测试它返回一个可预测的值:例如:如果你通过它1719,你会得到359

问问自己是否真的关心测试中的方法是如何达到其结果的,或者 是否到达其结果(以及结果是什么)这很重要。

我认为sumAndMul()内部调用add()mul()并不重要?显然这些是示例方法,因此在这里看到实际情况可能会有所帮助吗?