什么是单元测试? 如何进行单元测试?

许多职位的精确重复:

什么是单元测试?
什么是好的单元测试?
单元测试新手
单元测试-定义
学习单元测试
如何正确地进行模拟和单元测试
单元测试: 初级问题
还有更多..。
此外,谷歌的单元测试 stackoverflow.com 为“ how do you”

我读过一些关于单元测试的问题,但是我不知道它是什么,也不知道你是怎么做到的。我希望有人能告诉我:

  • 单元测试到底是什么? 它是内置在代码中还是作为单独的程序运行? 或者其他什么东西?
  • 你是怎么做到的?
  • 什么时候应该完成? 是否有时间或者项目不需要完成? 是否所有的事情都是单元测试的?

非常感谢你的帮助。

219034 次浏览

单元测试包括将程序分成若干个部分,并对每个部分进行一系列测试。

通常测试是作为单独的程序运行的,但是测试的方法是不同的,这取决于语言和软件类型(GUI、命令行、库)。

大多数语言都有 单元测试框架,你应该找一个适合你的。

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

单元测试到底是什么 内置到代码中或以独立方式运行 程序? 还是别的什么?

来自 MSDN : 单元测试的主要目标是获取应用程序中可测试软件的最小部分,将其与代码的其余部分隔离开来,并确定它的行为是否完全符合您的预期。

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

你是怎么做到的?

单元测试说起来容易做起来难。需要不少练习才能做好。您需要将代码的结构设计成易于进行单元测试的方式,从而使您的测试有效。

什么时候应该做? 是否有时间或项目不做? 是 所有东西都可以单元测试吗?

你应该在合理的地方做。并非所有东西都适合单元测试。例如,UI 代码很难进行单元测试,这样做通常没有什么好处。然而,业务层代码通常非常适合于测试,这也是大多数单元测试的重点。

单元测试是一个庞大的话题,为了充分理解它如何能够最大限度地为您带来好处,我建议您找到一本关于单元测试的书,比如《 实例测试驱动开发》 ,它会让您很好地掌握这些概念,以及如何将它们应用到您的代码中。

什么是单元测试?这很难定义。在技术层面上,可以构建调用代码库中的函数并验证结果的函数。基本上,您会得到一堆类似于“断言(5 + 3) = = 8”的东西,只是更复杂一些(如 DataLayer (MockDatabase ())。GetUser ().Name = = “ Dilbert”)。 在工具视图级别,您添加了一个自动的、特定于项目的检查,以确保一切仍然像您假设的那样工作。如果您重构并实现复杂的算法,这将非常非常有帮助。 结果通常是一堆文档和更少的 bug,因为代码的行为被固定住了。

我为所有边缘用例构建测试用例,并运行它们,类似于分代垃圾收集器的工作方式。当我实现一个类时,我只运行涉及该类的测试用例。一旦我完成了这个类的工作,我就会运行所有的单元测试,看看是否所有的东西都能正常工作。

您应该尽可能多地进行测试,只要测试代码足够容易保持未测试状态。考虑到这一点,不,不是所有的东西都可以以一种理智的方式进行测试。想想用户界面。想想航天飞机或核弹的驾驶员(至少不是纯粹的 JUnit 测试;)。然而,大量的代码是可测试的。数据结构是。算法是。大多数应用程序逻辑类都是。那就试试!

HTH tetha

我发现演示它的最简单方法是查看一些代码。NUnit 站点上的这个入门页面是关于“什么”和“如何”的一个很好的介绍

Http://www.nunit.org/index.php?p=quickstart&r=2.5

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

你应该测试什么?我倾向于围绕我知道会很棘手的事情编写测试。复杂的状态转换,业务关键计算,诸如此类。一般来说,我不太担心测试基本的输入/输出的东西,虽然纯粹主义者无疑会说,我在这方面是错误的和 一切应该测试。就像很多其他事情一样,没有正确的答案!

关于“怎么做”那部分:

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

关于“什么时候做”那部分:

单元测试不仅仅是为了测试。通过进行单元测试,您还可以强制软件设计成可单元测试的内容。许多人认为,这种设计在大多数情况下都是好的设计(商标) ,而不考虑测试带来的其他好处。

因此,进行单元测试的一个原因是,强迫您的设计进行某种有希望更容易维护的东西,而不是为单元测试而设计。

什么..。

一种针对一系列测试自动测试代码的方法,旨在强制执行期望的结果和管理更改。

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

怎么..。

几乎总是将单元测试过程内置到 IDE 中(或通过扩展) ,以便在每次编译时执行测试。有许多框架可以帮助创建单元测试(实际上是模拟对象) ,它们通常被命名为 Unit (比如 jUnit、 xUnit、 nUnit)。这些框架提供了一种正式的方式来创建测试。

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

当..。

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

什么是单元测试?

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

测试的输出可以是控制台输出,也可以是 GUI (如 NUnit)中的“ 绿灯”,或者是其他特定于语言的框架。

执行单元测试被设计得非常简单,通常测试是以函数的形式编写的,这些函数将决定返回的值是否等于你编写函数时所期望的值(或者当你 最终编写它时的值 会期待——当你首先编写测试时,这个值称为 测试驱动开发)。

如何执行单元测试?

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

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;
}

当开发人员运行您为这个非常简单的函数创建的测试时,他们将看到第一个 Assert失败,并且他们现在知道构建已经失败。

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

他们应该尽可能经常这样做。当您将测试作为开发过程的一部分来执行时,您的代码将自动比只编写函数然后继续执行的代码设计得更好。此外,诸如 依赖注入之类的概念将自然地演变成您的代码。

最明显的好处是知道在进行更改时,如果所有代码都通过了测试,那么其他单独的代码单元就不会受到影响。