Unit testing 集成测试和单元测试之间的区别是什么?

Unit testing 集成测试和单元测试之间的区别是什么?,unit-testing,integration-testing,Unit Testing,Integration Testing,我知道所谓的单元测试和集成测试的教科书定义。我好奇的是什么时候该写单元测试了。。。我将尽可能多地编写它们以涵盖多组类 例如,如果我有一个Word类,我将为Word类编写一些单元测试。然后,我开始写我的句子类,当它需要与单词类交互时,我会经常写我的单元测试,以便它们同时测试句子和单词。。。至少在他们互动的地方 这些测试本质上变成了集成测试,是因为它们现在测试这两个类的集成,还是仅仅是一个跨两个类的单元测试 一般来说,由于这条不确定的线,我很少实际编写集成测试。。。或者我是在使用成品来查看所有的部分

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

例如,如果我有一个
Word
类,我将为
Word
类编写一些单元测试。然后,我开始写我的
句子
类,当它需要与
单词
类交互时,我会经常写我的单元测试,以便它们同时测试
句子
单词
。。。至少在他们互动的地方

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

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


我是否误解了集成测试,或者集成测试和单元测试之间真的没有什么区别吗?

使用单一责任设计,它是黑白相间的。不止一个责任,它是一个集成测试

通过duck测试(looks、quacks、waddles、itsaduck),它只是一个包含多个新对象的单元测试


当您进入mvc并对其进行测试时,控制器测试总是集成的,因为控制器同时包含一个模型单元和一个视图单元。在那个模型中测试逻辑,我会称之为单元测试。

我认为当你开始考虑集成测试时,你说的更多的是物理层而不是逻辑层之间的交叉

例如,如果您的测试关注的是生成内容,那么它就是一个单元测试:如果您的测试关注的只是写入磁盘,那么它仍然是一个单元测试,但是一旦您测试了I/O和文件的内容,那么您就有了一个集成测试。当您在服务中测试函数的输出时,这是一个单元测试,但是一旦您进行了服务调用并查看函数结果是否相同,那么这就是一个集成测试


从技术上讲,您无论如何都不能只对一个类进行单元测试。如果你的类是由其他几个类组成的呢?这会自动使它成为集成测试吗?我不这么认为。

单元测试是根据工作单元或代码块进行测试,如果您愿意的话。通常由单个开发人员执行

集成测试是指当开发人员将其代码提交到源代码管理存储库时,最好在集成服务器上执行的测试。集成测试可能由诸如巡航控制等实用程序执行


因此,您需要进行单元测试,以验证您构建的工作单元是否正常工作,然后集成测试将验证您添加到存储库中的任何内容都不会破坏其他内容。

如果class1的单元测试正在测试class1,我想我还是会将两个交互类称为单元测试特性,以及class2的单元测试正在测试它的特性,并且它们不会影响数据库

当一个测试运行在我的大部分堆栈中,甚至访问数据库时,我将其称为集成测试


我真的很喜欢这个问题,因为TDD讨论有时让我觉得有点过于纯粹,看到一些具体的例子对我来说是件好事。

这个问题有点学术性,不是吗?;-) 我的观点是: 对我来说,集成测试是对整个部分的测试,而不是十个部分中的两个部分同时进行测试。 我们的集成测试表明,如果主构建(包含40个项目)成功。 对于这些项目,我们有大量的单元测试。
关于单元测试,对我来说最重要的是,一个单元测试不能依赖于另一个单元测试。所以对我来说,上面描述的两个测试都是单元测试,如果它们是独立的。对于集成测试,这一点并不重要。

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

我认为,从“原子测试”(测试一个小类或一个方法)到单元测试(类级)和集成测试,再到功能测试(通常从上到下覆盖更多内容),似乎没有一个明确的界限

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

我的10位:D

我总是被告知,单元测试是对单个组件的测试,应该充分利用它。现在,这往往有很多层次,因为大多数组件都是由更小的部件组成的。对我来说,单元是系统的功能部分。因此,它必须提供一些有价值的东西(例如,不是一个字符串解析的方法,而是一个HtmlSanitizer)

集成测试是下一步,它采用一个或多个组件,并确保它们按应有的方式协同工作。。然后,您就不必担心组件如何单独工作了,但是当您将html输入到HtmlEditControl中时,它会神奇地知道它是否有效

不过这是一条可移动的线。。我更愿意把重点放在让该死的代码正常工作上。句号是一种测试方法,可以验证源代码的各个单元是否正常工作

是软件测试的一个阶段,在该阶段中,单个软件模块作为一个组进行组合和测试

将单位定义为s
public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}
Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for
public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
  return someResults;
}