如何使用包含其他方法的方法编写单元测试?

时间:2016-07-28 17:28:20

标签: unit-testing tdd

好吧,我有一个使用其他方法的方法。我有二级方法的测试,现在我想编写main方法的单元测试。

我认为我必须在没有看到测试方法的代码的情况下编写测试,我的意思是,我没有在实现中考虑测试,所以在此之后,在main方法的测试中我必须测试辅助方法的功能和主方法的功能。

例如,我有两个车库。在garaga,有汽车和我拥有的汽车数量。因此,我希望能够将新车添加到garaga,移除汽车并将汽车从车库转移到另一个车库。所以我有这个方法:

  • 将汽车添加到车库的一种方法,必须将汽车与garaga相关联并更新汽车的数量。这是我开新车的时候。
  • 从车库中取出汽车的一种方法,与汽车车库无关,并更新汽车的数量。这是我不再拥有汽车的时候了,例如因为我卖了它。
  • 关于转移汽车的方法,将汽车从第一个车库中取出并将汽车添加到新车库。所以这个方法调用了add方法和remove方法。

转移方法的代码是这样的:

public void transferCar(garage1, garage2, car)
{
    removeCar(garage1, car);
    addCar(garage2, car);
}

如果我测试removeCar和addCar并且我确信它们按预期工作,为了测试传输,我必须测试addCar的所有情况以及removeCar的所有情况?因为如果我不知道transferCar的实现,我不知道这个方法是否使用removeCar和addCar,所以我不知道该方法是否按预期工作。

换句话说,当我测试transferCar时,测试必须覆盖100%的removeCar代码,100%的addCar代码和100%的transferCar方法代码,或者确保我调用方法removeCar一次和transferCar中的addCar并且它按预期工作就足够了,虽然removecar和addCar没有100%覆盖?

因为如果我必须测试removeCar和addCar的所有情况,我会做两次相同的测试。所以我已经重构了代码因为removeCar和addCar我在很多地方使用它,但在我的测试代码中,我有多次相同的测试。

这是一个非常单一的例子,但是如果我有一个使用少量方法的方法而这个其他方法使用了antohers,并且主要的mathod应该覆盖所有方法的所有代码,那么这将是一个非常长的测试,并且很多工作。

在sumary中,当我测试一个方法时,我已经覆盖了此方法的100%代码和此方法使用的方法的100%代码,或者只是为了确保main方法按预期工作并在每个辅助方法中调用一次?

感谢。

1 个答案:

答案 0 :(得分:1)

TDD并不意味着你需要对实现细节零知识,它是测试第一个编程概念。单元测试是白盒测试,为此应该确切知道类的实现是什么。黑盒测试可能不需要了解实现细节。

严格来说,单元测试应该只测试一个类的公共接口,看看我们是否为一个类(包括所有私有代码和受保护代码)提供了100%的覆盖率。

函数的覆盖范围是查看测试该特定函数的代码行数以及验证了多少个分支(if-else,switch ..)。

对于您的情况,我会为转车编写一个简单的测试用例并断言检查汽车是否从车库1转移到车库2。这将是transferCar()的100%覆盖率。然后,您可以编写大量的多个测试用例来实现对addCar()和removeCar()的良好覆盖,我希望它们是公共方法。如果他们是私人的,请检查here

如果你想跳过调用真正的实现,那么mocks是要走的路,但这取决于你如何实现你的代码..如果一个被测试的函数(主函数这么说)调用它自己的实例方法然后嘲笑被调用的函数很棘手。