什么是单元测试,你是如何做到的? [重复]

许多帖子的完全重复:

What is unit testing?
What Makes a Good Unit Test?
New to Unit Testing
Unit Testing - definitions
Learning Unit Testing
How to properly mock and unit test
Unit Testing: Beginner Questions
And many more ...
此外,谷歌site:stackoverflow.com "how do you" unit-test

我已经阅读了一些关于单元测试的问题,但我并不确切知道它是什么或者你是如何做到的 . 我希望有人能告诉我以下内容:

  • IS单元测试究竟是什么?它是内置到代码中还是作为单独的程序运行?或者是其他东西?

  • 你是怎么做到的?

  • 应该什么时候完成?是否有时间或项目不这样做?一切都是单元可测试的吗?

非常感谢您的帮助 .

回答(7)

2 years ago

单元测试涉及将程序分解成碎片,并对每个部分进行一系列测试 .

通常,测试作为单独的程序运行,但测试方法因语言和软件类型(GUI,命令行,库)而异 .

大多数语言都有unit testing frameworks,你应该为你看一个 .

测试通常定期运行,通常在每次更改源代码后运行 . 越多越好,因为你越早发现问题 .

2 years ago

什么是单元测试?

单元测试只是验证各个代码单元(主要是函数)是否按预期工作 . 通常您自己编写测试用例,但有些可以自动生成 .

测试的输出可以像控制台输出一样简单,也可以是GUI中的“green light”,例如NUnit,或者是不同的语言特定框架 .

执行单元测试的目的很简单,通常测试是以函数的形式编写的,这些函数将确定返回值是否等于您编写函数时所期望的值(或者当您最终编写函数时所期望的值 - 当你首先编写测试时,这称为Test Driven Development .

如何进行单元测试?

想象一下你想要测试一个非常简单的函数:

int CombineNumbers(int a, int b) {
    return a+b;
}

单元测试代码看起来像这样:

void TestCombineNumbers() {
    Assert.IsEqual(CombineNumbers(5, 10), 15); // Assert is an object that is part of your test framework
    Assert.IsEqual(CombineNumbers(1000, -100), 900);
}

运行测试时,将通知您这些测试已通过 . 现在您已经构建并运行了测试,您知道这个特定的功能或单元将按预期执行 .

现在想象另一个开发人员出现并更改 CombineNumbers() 函数以获得性能,或者其他一些原因:

int CombineNumbers(int a, int b) {
    return a * b;
}

当开发人员运行您为这个非常简单的函数创建的测试时,他们会看到第一个_2774247失败,他们现在知道构建被破坏了 .

什么时候应该进行单元测试?

它们应该尽可能频繁地完成 . 当您在开发过程中执行测试时,您的代码将自动设计得比您刚编写函数然后继续进行设计更好 . 此外,诸如Dependency Injection之类的概念将自然地演变为您的代码 .

最明显的好处是知道在进行更改时,如果它们都通过了测试,则没有其他单独的代码单元受其影响 .

2 years ago

What...

一种针对一系列测试自动测试代码的方法,旨在实施预期结果并管理变更 .

在这个意义上,“单元”是代码中最小的原子组件,对测试有意义,通常是某些类的方法 . 此过程的一部分是构建存根对象(或“模拟”),这些对象允许您将单元作为独立对象使用 .

How...

几乎总是,单元测试的过程内置于IDE(或通过扩展),以便它在每次编译时执行测试 . 存在许多框架用于帮助创建单元测试(实际上是模拟对象),通常命名为fooUnit(参见jUnit,xUnit,nUnit) . 这些框架提供了一种创建测试的形式化方法 .

作为一个过程,测试驱动开发(TDD)通常是单元测试的动机(但是单元测试不需要TDD),假设测试是规范定义的一部分,因此要求首先使用代码编写它们 . 只写“解决”这些测试 .

When...

几乎总是 . 非常小的一次性项目可能不值得,但只有当你确定它们真的是一次性的时候 . 理论上,每个面向对象的程序都是可单元测试的,但是一些设计模式使这很困难 . 众所周知,单例模式存在问题,相反,依赖性注入框架非常以单元测试为导向 .

2 years ago

什么是单元测试?定义很棘手 . 在技术层面,您可以构建调用代码库中的函数并验证结果的函数 . 基本上,你得到一些像“assert(5 3)== 8”这样的东西,只是更复杂(如DataLayer(MockDatabase()) . getUser() . name ==“Dilbert”) . 在工具视图级别,您可以添加一个自动的,特定于项目的检查,如果所有内容仍然像您认为的那样有效 . 如果您重构并且实现复杂的算法,这非常非常有用 . 结果通常是一堆文档和更少的错误,因为代码的行为被固定下来 .

我为所有边缘情况构建测试用例并运行它们类似于世代垃圾收集器的工作方式 . 当我实现一个类时,我只运行涉及该类的测试用例 . 完成该课程后,我会运行所有单元测试,以查看是否一切仍然有效 .

只要测试代码很容易保持未经测试,您应该尽可能地进行测试 . 鉴于此,不,并非所有事情都能以理智的方式进行测试 . 想想用户界面 . 想想一个航天飞机或核弹的驱动程序(至少不是纯粹的JUnit测试;)) . 但是,很多代码都是可测试的 . 数据结构是 . 算法是 . 大多数Applicationlogic类都是 . 所以测试吧!

HTH . tetha

2 years ago

我发现说明它的最简单方法是查看一些代码 . NUnit网站上的这个入门页面是对内容和方式的一个很好的介绍

http://www.nunit.org/index.php?p=quickStart&r=2.5

一切都可以测试吗?通常,如果它计算的东西然后是 . UI代码是另一个需要处理的问题,因为模拟用户点击按钮很棘手 .

你应该测试什么?我倾向于围绕我知道会变得棘手的事情编写测试 . 复杂的状态转换,业务关键计算,这类事情 . 通常我在前面错了,所有东西都应该进行测试 . 像其他很多东西一样,没有正确的答案!

2 years ago

究竟什么是IS单元测试?它是内置到代码中还是作为单独的程序运行?或者是其他东西?

From MSDN:单元测试的主要目标是在应用程序中使用最小的可测试软件,将其与代码的其余部分隔离,并确定它是否完全符合您的预期 .

从本质上讲,您正在编写一小段代码来测试代码的各个位 . 在.net世界中,您可以使用NUnit或MBunit等内容运行这些小代码,甚至可以使用Visual Studio中的内置测试工具 . 在Java中,您可以使用JUnit . 基本上,测试运行者将构建您的项目,加载并执行单元测试,然后让您知道它们是否通过 .

你是怎么做到的?

那么单元测试说起来容易做起来难 . 要善于完成它需要相当多的练习 . 您需要以便于单元测试以使测试有效的方式构建代码 .

什么时候应该这样做?是否有时间或项目不这样做?一切都是单元可测试的吗?

你应该在有意义的地方做 . 并非所有东西都适合单元测试 . 例如,UI代码非常难以进行单元测试,您通常无法从中获益 . 然而,业务层代码通常非常适合于测试,而且大多数单元测试都是针对测试的 .

单元测试是一个很大的主题,为了充分了解它如何最有利于你,我建议你拿一本关于单元测试的书,比如“Test Driven Development by Example”,它会让你很好地掌握这些概念以及你如何能够将它们应用于您的代码 .

2 years ago

关于“如何做”部分:

我认为ScalaTest的介绍很好地说明了不同风格的单元测试 .

关于“何时去做”部分:

单元测试不仅用于测试 . 通过单元测试,您还可以将软件设计强制为可单元测试的 . 许多人认为,无论测试的其他好处如何,这种设计大部分都是Good Design(TM) .

所以进行单元测试的一个原因是强迫你的设计成为一种有希望更容易维护的东西,即你没有为单元测试设计的东西 .