2016-07-28 82 views
0

那么,我有一个使用另一种方法的方法。我有次要方法的测试,现在我想为主要方法编写单元测试。如何使用包含其他方法的方法编写单元测试?

我认为我必须在没有看到要测试的方法的代码的情况下编写测试,我的意思是,我没有在实现中考虑测试,因此在测试主要方法I必须测试次要方法的功能和主要方法的功能。

例如,我有两个汽车车库。在加拉加有一辆汽车和我拥有的汽车数量。所以我想能够添加一辆新车到加拉加,取下汽车并将车从车库转移到另一辆车。所以我有这种方法:

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

的传输方法的代码是类似的东西:

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

如果我测试removeCar和addCar,我相信他们的工作预期,测试转移,我一定要考所有addCar的情况以及removeCar的所有情况?因为如果我不知道transferCar的实现,我不知道此方法是否使用removeCar和addCar,因此我不知道该方法是否按预期工作。

换句话说,当我测试transferCar时,测试必须覆盖removeCar的代码的100%,addCar的代码的100%和transferCar方法的代码的100%,或者确保我调用该方法removeCar一次和addCar在transferCar和它的预期是否足够,虽然removecar和addCar不被覆盖100%?

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

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

总的来说,当我测试一个方法时,我已经覆盖了此方法的代码的100%以及此方法使用的方法的代码的100%,或者只是为了确保main方法的工作原理为预计和每次辅助方法调用一次?

谢谢。

回答

1

TDD并不意味着您需要对实现细节没有零知识,而是测试第一个编程概念。单元测试是白盒测试,因此这个人应该确切知道类实现是什么。黑盒测试可能不需要实现细节的知识。

严格地说单元测试应该只测试一个类的公共接口,看看我们给出了100%的覆盖率类(包括其所有专用和受保护的代码)。

覆盖要功能是了解有多少的用于该特定功能码线的测试,以及如何许多分支(如果 - 否则,开关......)进行验证。

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

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

+0

但是,如果有可能,谁实现了单元测试应该是不同的谁执行测试,becuse以这种方式很容易发现错误的方法的人。因此,实施测试的人可能不知道实施的任何内容。 –

+0

所以,你的意思是双方都知道类的结构,公共方法,接口,存根/伪造什么,模拟和其他细节,除了每个函数是如何单独实现的?不知道这是否是一个正确的做法,但我想接下来我们要接受太多的冗余代码和额外的努力, –

+0

因为这个问题是在TDD标签提交下看,“不同的人应该写测试”在我看来是一些非常奇特咨询。然而,这是一个非常好的主意,让测试的重点是行为(即不按样的规则,“每个方法1个单元测试”,只是测试被测系统的所有可能的用途,如果像这样的测试练习3个不同的那个对象的方法,就这样吧)。 – prgmtc

相关问题