测试类的路径或方法

时间:2014-09-22 15:31:20

标签: unit-testing

使用许多可选方法为有状态对象编写单元测试时,我是将单元定义为类的各个方法还是可以通过类获取的特定路径?或者我的单位是全班吗?

为了说明,想象一下发送单个电子邮件的类,并且有几个方法,如:send, attachBinary, attachText, clearAttachments, addSender, addRecipient, addCC, setBody, setSubject。对于电子邮件有效,只需要调用addRecipient,但我可以设想任意数量的路径:添加附件,删除以前附加的文件并添加新文件,更改收件人等等。

我应该如何为这样的课程编写测试?如果我正在测试路径,我仍然在编写单元测试,尽管这种感觉更像是集成测试吗?

1 个答案:

答案 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...

编写许多测试以测试具有许多不同行为的单个方法通常也很好。 虽然,如果它增加了开销,测试单个“较小”的方法可能没问题。

SPOILER:私有方法

你可以做到最简单的事情就是在测试中调用“私有”方法。至此,将方法更改为公共或受保护将变为philosophy debate。我的(个人)意见是继续你的生活,提取或揭露一些受保护的方法,并测试它们。

“名字里有什么?” vs“尺寸重要吗?”

最后,“单元”和“整合”测试之间的区别是一个很好的主题辩论;我写的测试越多,我就越喜欢用"size"分隔测试。