使用许多可选方法为有状态对象编写单元测试时,我是将单元定义为类的各个方法还是可以通过类获取的特定路径?或者我的单位是全班吗?
为了说明,想象一下发送单个电子邮件的类,并且有几个方法,如:send, attachBinary, attachText, clearAttachments, addSender, addRecipient, addCC, setBody, setSubject
。对于电子邮件有效,只需要调用addRecipient,但我可以设想任意数量的路径:添加附件,删除以前附加的文件并添加新文件,更改收件人等等。
我应该如何为这样的课程编写测试?如果我正在测试路径,我仍然在编写单元测试,尽管这种感觉更像是集成测试吗?
答案 0 :(得分:1)
如果所有的“部分”真的属于班级,那么你的班级就是单位,只要你正在测试这个单元的方法,那就是ahem,单元测试。
如果您觉得您的对象的方法需要完全不同地进行测试,那么您的课程可以分成较小的“单位”,您可以进行测试。
其中一些方法可能是私有的,只能通过调用一些“公共”方法来行使;没关系。不要以为一种方法需要进行单一的相应测试。
这种约定很危险,因为它可能意味着每种方法需要一次测试:
@Test
private void testSendMail() {
// Code for a test for mail with attachement
// Code for another test for mail without attachement
// Code for hundreds of other tests...
}
这个可能更健康:
@Test
private void testMailsCanBeSentWithAttachement() {
}
@Test
private void testMailsCanBeSentWithMultipartAttachement() {
}
// etc...
编写许多测试以测试具有许多不同行为的单个方法通常也很好。 虽然,如果它增加了开销,测试单个“较小”的方法可能没问题。
你可以做到最简单的事情就是在测试中调用“私有”方法。至此,将方法更改为公共或受保护将变为philosophy debate。我的(个人)意见是继续你的生活,提取或揭露一些受保护的方法,并测试它们。
最后,“单元”和“整合”测试之间的区别是一个很好的主题辩论;我写的测试越多,我就越喜欢用"size"分隔测试。