我知道所谓的单元测试和集成测试的教科书定义。我好奇的是什么时候该写单元测试了……我将写它们来覆盖尽可能多的类集。

例如,如果我有一个Word类,我将为Word类编写一些单元测试。然后,我开始编写我的Sentence类,当它需要与Word类交互时,我经常会编写单元测试,这样它们就可以同时测试Sentence和Word……至少在他们相互作用的地方。

这些测试本质上变成集成测试了吗?因为它们现在测试这两个类的集成,还是仅仅是一个跨越两个类的单元测试?

一般来说,由于这条不确定的界线,我很少实际编写集成测试……或者我是否使用成品来查看所有部件是否正常工作,即实际的集成测试,即使它们是手动的,并且很少在每个单独的功能范围之外重复?

我是否误解了集成测试,或者集成测试和单元测试之间真的只有很小的区别?


当前回答

A little bit academic this question, isn't it? ;-) My point of view: For me an integration test is the test of the whole part, not if two parts out of ten are going together. Our integration test shows, if the master build (containing 40 projects) will succeed. For the projects we have tons of unit tests. The most important thing concerning unit tests for me is, that one unit test must not be dependent on another unit test. So for me both test you describe above are unit tests, if they are independent. For integration tests this need not to be important.

其他回答

单元测试是一种测试方法,用于验证源代码的各个单元是否正常工作。

集成测试是软件测试的一个阶段,在这个阶段中,各个软件模块被组合起来并作为一个组进行测试。

Wikipedia将单元定义为应用程序中最小的可测试部分,在Java/ c#中是一个方法。但是在你的单词和句子类的例子中,我可能只会为句子写测试,因为我可能会发现使用一个模拟单词类来测试句子类是多余的。所以句子是我的单位,单词是这个单位的实现细节。

我也这么做——我把它们都称为单元测试,但在某些时候,我有一个“单元测试”,它涵盖了太多内容,我经常把它重命名为“..IntegrationTest”——只是名字改变了,其他的都没有改变。

我认为从“原子测试”(测试一个微小的类或方法)到单元测试(类级别)和集成测试——然后是功能测试(通常从上到下覆盖了更多的东西)——有一个延续——似乎没有一个干净的分界线。

如果您的测试设置了数据,可能还加载了数据库/文件等,那么它可能更像是一个集成测试(我发现集成测试使用更少的模拟和更多的真实类,但这并不意味着您不能模拟出系统的某些部分)。

在单元测试中,你要测试每个独立的部分:

在集成测试中,您将测试系统的许多模块:

这是当你只使用单元测试时发生的事情(通常两个Windows都可以工作,不幸的是不能一起工作):

来源: source1 source2

单元测试使用模拟

您正在讨论的是集成测试,它实际上测试了系统的整个集成。但是当你做单元测试时,你应该分别测试每个单元。其他一切都应该被嘲笑。在你的Sentence类的例子中,如果它使用了Word类,那么你的Word类应该被嘲笑。这样,您将只测试您的Sentence类功能。

这些测试本质上变成集成测试了吗?因为它们现在测试的是这两个类的集成?或者它只是一个跨越2个类的单元测试?

我认为是和是。跨越2个类的单元测试变成了集成测试。

您可以通过使用mock实现(MockWord类)测试Sentence类来避免这种情况,当系统的这些部分足够大,可以由不同的开发人员实现时,这一点非常重要。在这种情况下,Word是单独的单元测试,句子是在MockWord的帮助下进行单元测试,然后句子是用Word进行集成测试。

以下是真实差异的例子 1) 1,000,000个元素的数组很容易进行单元测试,工作良好。 2) BubbleSort很容易在10个元素的模拟数组上进行单元测试,而且工作得很好 3)集成测试表明有些东西不是很好。

如果这些部分是由一个人开发的,在单元测试BubbleSoft时很可能会发现问题,因为开发人员已经有了真实的数组,他不需要模拟实现。