要测试的课程:
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));
}
问题在于它再次测试已经测试过的东西。它正在测试相互合作的东西。
答案 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()
在内部调用其他方法,因为没有内部逻辑可以根据输入改变其行为(如果有意义的话)。
只是测试它返回一个可预测的值:例如:如果你通过它17
和19
,你会得到359
。
问问自己是否真的关心测试中的方法是如何达到其结果的,或者 是否到达其结果(以及结果是什么)这很重要。
我认为sumAndMul()
内部调用add()
和mul()
并不重要?显然这些是示例方法,因此在这里看到实际情况可能会有所帮助吗?