![]() |
1
308
对我来说,关键的区别在于 集成测试 揭示一个特性是工作的还是坏的,因为它们在接近现实的场景中强调代码。它们调用一个或多个软件方法或特性,并测试它们是否按预期工作。 相反,a 单元测试 不 假设你有这样一种方法:
毫无疑问:如果测试通过,您可以断言您正在交付一个工作特性。这叫什么 商业价值
如果要为编写单元测试
在实践中,你会做一些类似的事情:
您可以通过依赖注入、工厂方法或任何模拟框架或者仅仅扩展测试中的类来实现这一点。
假设里面有个窃听器
这个功能不起作用,因为
是的,100个功能都会失败。但是,幸运的是,100个端到端测试也失败了,暴露了问题所在。而且,是的: 他们说的是实话 .
但是,
(如果
假设这是一个类中断的系统:
一个bug会破坏几个特性,几个集成测试也会失败。
另一方面,同一个bug只会破坏一个单元测试。
现在,比较两种情况。 同一个bug只会破坏一个单元测试。
实际上,所有使用损坏特性的模块的单元测试都是绿色的,因为通过使用模拟,它们删除了依赖关系。换句话说,它们运行在一个理想的,完全虚构的世界里。这是隔离和寻找bug的唯一方法。单元测试意味着模仿。如果你没有嘲笑,你就不是单元测试。 区别集成测试表明 不起作用。但它们在 问题可能是。 正是这个错误。要绘制这些信息,它们必须在模拟环境中运行该方法,在该环境中,所有其他依赖项都应该正常工作。 这就是为什么我认为你的句子“或者它仅仅是一个跨越两个类的单元测试”在某种程度上被取代了。单元测试不应该跨越两个类。 这个回复基本上是我在这里写的总结: Unit tests lie, that's why I love them |
![]() |
2
62
当我编写单元测试时,我通过模拟依赖关系将被测试代码的范围限制到我当前正在编写的类。如果我正在写一个句子类,并且句子依赖于单词,我将使用一个模拟单词。通过模仿Word,我可以只关注它的接口,并测试我的句子类与Word接口交互时的各种行为。这样我只测试句子的行为和实现,而不是同时测试单词的实现。
|
![]() |
3
43
我总是被告知 单元测试 单元 HtmlSanitizer 也许)。 集成测试 怎样 组件单独工作,但是当您将html输入到 ,它神奇地知道它是否有效。。
|
![]() |
4
23
单元测试使用模拟
你所说的是集成测试,实际上是测试系统的整个集成。但是当你做单元测试的时候,你应该单独测试每个单元。其他一切都应该被嘲笑。所以在你的情况下
|
![]() |
5
17
我认为,当你开始考虑集成测试时,你说的更多的是物理层之间的交叉,而不是逻辑层。 例如,如果您的测试关注的是生成内容,那么这是一个单元测试:如果您的测试只关注写入磁盘,它仍然是一个单元测试,但是一旦您同时测试了I/O和文件的内容,那么您就有了一个集成测试。当您在服务中测试函数的输出时,这是一个单元测试,但是一旦您调用服务并查看函数结果是否相同,那么这就是集成测试。 从技术上讲,你不能只对一个类进行单元测试。如果你的类是由其他几个类组成的呢?这会自动成为一个集成测试吗?我不这么认为。 |
![]() |
6
13
|
![]() |
7
12
采用单一责任设计,其黑白相间。不止一个责任,这是一个集成测试。 通过duck测试(looks、quacks、waddles,它是一个duck),它只是一个包含多个新对象的单元测试。 当您进入mvc并对其进行测试时,控制器测试总是集成的,因为控制器同时包含模型单元和视图单元。在那个模型中测试逻辑,我称之为单元测试。 |
![]() |
8
10
测试的性质A 安 集成测试 在许多模块中,都有一个测试,它期望在合作中出现问题 这些模块使得单独使用单元测试很难发现这些问题。 从以下几个方面考虑测试的性质:
请记住,集成测试可能仍然是存根/伪造/模拟的 一些 这在单元测试和系统测试(最全面的集成测试,测试整个系统)之间提供了大量的中间地带。 两者兼用的语用方法因此,一种实用的方法是:尽可能灵活地依赖集成测试,并在风险太大或不方便的地方使用单元测试。 |
![]() |
9
8
在我看来,答案是“为什么这很重要?”
是因为单元测试需要快速、隔离、可重复、自验证和及时,而集成测试不应该这样吗?当然不是,所有的测试都应该是这些。 这是因为在单元测试中使用mock,而在集成测试中不使用它们?当然不是。这意味着,如果我有一个有用的集成测试,我不允许为某个部分添加一个mock,担心我不得不将我的测试重命名为“单元测试”,或者将它交给另一个程序员来处理。 是不是因为单元测试测试一个单元,集成测试测试多个单元?当然不是。这有什么实际意义?关于测试范围的理论讨论在实践中失败了,因为术语“单元”完全依赖于上下文。在类级别,单元可能是一个方法。在程序集级别,单元可能是类,而在服务级别,单元可能是组件。 甚至类也使用其他类,那么哪个是单元?
测试是重要的,F.I.R.S.T是重要的,对定义的吹毛求疵是浪费时间,只会让新手混淆测试。 |
![]() |
10
4
如果class1的单元测试是测试class1的特性,class2的单元测试是测试class1的特性,并且它们没有访问数据库,我想我还是会把几个交互类称为单元测试。 当一个测试在我的大部分堆栈中运行,甚至访问数据库时,我称之为集成测试。 我真的很喜欢这个问题,因为TDD的讨论有时对我来说有点太纯粹了,而且看到一些具体的例子对我很有好处。 |
![]() |
11
4
我也这么做——我把它们都称为单元测试,但是在某个时候,我有一个“单元测试”,它涵盖了太多的内容,我经常把它重命名为“..IntegrationTest”——只是一个名称的改变,其他什么都没有改变。
如果您的测试设置了数据,或者加载了数据库/文件等,那么它可能更像是一个集成测试(我发现集成测试使用更少的模拟和更真实的类,但这并不意味着您不能模拟一些系统)。 |
![]() |
12
4
Unit Testing 是一种测试方法,用于验证源代码的各个单元是否正常工作。 Integration Testing 是软件测试的一个阶段,在这个阶段中,单个软件模块作为一个组进行组合和测试。 Wikipedia 将单元定义为应用程序的最小可测试部分,在Java/C中是一个方法。但是在你的单词和句子类的例子中,我可能只写句子的测试,因为我可能会发现使用 mock 单词类以测试句子类。所以句子是我的单元,单词是这个单元的实现细节。 |
![]() |
13
4
集成测试:测试数据库持久性。
|
![]() |
14
3
单元测试是针对工作单元或代码块进行的测试。通常由单个开发人员执行。
因此,您需要进行单元测试以验证所构建的工作单元是否正常工作,然后集成测试将验证您添加到存储库中的任何内容都不会破坏其他内容。 |
![]() |
15
2
集成测试是同时测试多个类及其交互的测试。在这些情况下,只有一些依赖关系被伪造/模仿。
分离两种类型的测试对于在不同级别测试系统非常有用。而且,集成测试往往是长寿命的,单元测试应该是快速的。执行速度的不同意味着它们的执行方式不同。在我们的开发过程中,单元测试在签入时运行(这很好,因为它们非常快),集成测试每天运行一次/两次。我尽可能频繁地运行集成测试,但通常是撞击数据库/写入文件/使rpc/等变慢。 这引出了另一个重要的问题,单元测试应该避免影响IO(例如磁盘、网络、数据库)。否则他们会慢很多。设计出这些IO依赖关系需要一些努力——我不能承认我一直忠实于“单元测试必须很快”的规则,但是如果你是,那么在一个更大的系统上的好处很快就会显现出来。 |
![]() |
16
2
类比解释上面的例子做得很好,我不必重复了。所以我将着重用例子来帮助你理解。 集成测试检查是否一切正常。想象一下手表上有一系列齿轮在一起工作。集成测试将是:手表显示的时间是否正确?三天后它还能告诉你正确的时间吗? 它告诉你的只是整个工作是否正常。如果它失败了:它不会告诉你它到底在哪里失败。 单元测试这些都是非常特殊的测试类型。他们告诉你某件事是成功还是失败。这种测试的关键在于,它只测试一个特定的东西,同时假设其他东西都正常工作。这是关键点。 例子: 让我们用一个例子来阐述这一点:
使用存根
你看到问题了吗?你不知道什么是失败。如果使用不同的外部依赖关系,那么这10个依赖项中的每一个都可能导致问题,并且您不知道从哪里开始。这就是为什么单元测试使用存根来假设其他一切都正常工作的原因。 |
![]() |
17
1
这个问题有点学术性,不是吗?;-) 对我来说,集成测试是对整个部分的测试,而不是十有八九的两个部分在一起。 对于项目,我们有大量的单元测试。 |
![]() |
18
1
我想是的,是的。跨2个类的单元测试变成了集成测试。 您可以通过使用mock implementation-MockWord类测试语句类来避免它,当系统的这些部分足够大,可以由不同的开发人员实现时,这一点很重要。在这种情况下,单词单独进行单元测试,句子在MockWord的帮助下进行单元测试,然后句子与单词进行集成测试。 真正不同的例子如下 1) 1000000个元素的数组很容易进行单元测试,工作正常。 2) BubbleSort很容易在10个元素的模拟数组上进行单元测试,而且工作正常 3) 集成测试表明有些东西不太好。 如果这些部分是由一个人开发的,那么在对BubbleSoft进行单元测试时很可能会发现问题,因为开发人员已经有了真正的数组,而且不需要模拟实现。 |
![]() |
19
1
此外,重要的是要记住,单元测试和集成测试都可以自动化,并可以使用JUnit编写。
在JUnit集成测试中,可以使用
|
![]() |
20
0
如果您是TDD纯粹主义者,那么在编写生产代码之前先编写测试。当然,测试不会编译,所以您首先让测试编译,然后让测试通过。
|
![]() |
Alex · 从实际对象的实例返回默认模拟结果 3 年前 |
![]() |
Five · 如何使用Maven将目录从父模块复制到子模块 3 年前 |
![]() |
Zmur · 动态创建架构。Spring之前的sql上下文 7 年前 |
![]() |
Dan Bmd · 在pactdsl请求正文中使用regex 7 年前 |
![]() |
r3plica · 与的集成测试。net核心和标识框架 7 年前 |