什么是unit testing,你是怎么做到的?

完全重复的很多post:

什么是unit testing?
什么是一个好的unit testing?
unit testing新手
unit testing – 定义
学习unit testing
如何正确地模拟和unit testing
unit testing:初学者的问题
还有很多 …
另外,谷歌网站:stackoverflow.com“你好”unit testing

我已经阅读了关于unit testing的一些问题,但我不完全知道它是什么,或者你是如何做的。 我希望如果有人能告诉我以下几点:

  • 什么是unit testing? 它是内置于代码中还是作为单独的程序运行? 或者是其他东西?
  • 你怎么做呢?
  • 什么时候该做? 有没有时间或项目不这样做? 一切都可以unit testing吗?

非常感谢您的帮助。

unit testing包括将程序分解成几部分,并对每个部分进行一系列testing。

通常,testing是作为单独的程序运行的,但testing方法因语言和软件types(GUI,命令行,库)而异。

大多数语言都有unit testing框架 ,你应该看一下你的。

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

什么是unit testing?

unit testing只是validation单个代码单元(主要是函数)按预期工作。 通常你自己写testing用例,但有些可以自动生成。

testing的输出可以像控制台输出一样简单,在NUnit这样的GUI或者不同的特定于语言的框架中可以是“ 绿灯 ”。

执行unit testing的目的很简单,通常testing是以函数的forms编写的,这些函数将确定返回的值是否等于您编写函数时期望的值(或者是最终编写时的值 -当您首先编写testing时,这称为testing驱动开发 )。

你如何执行unit testing?

想象一下你想testing一个非常简单的函数:

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

unit testing代码看起来像这样:

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

当你运行testing时,你会被告知这些testing已经通过。 现在您已经构build并运行了testing,您知道这个特定的function或单元将按照您的预期执行。

现在想象另一个开发人员出现并改​​变CombineNumbers()函数的性能或其他原因:

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

当开发人员运行为这个非常简单的函数创build的testing时,他们会看到第一个Assert失败,并且他们现在知道构build已经损坏。

你应该什么时候进行unit testing?

他们应该尽可能经常做。 当您将testing作为开发过程的一部分进行时,您的代码将自动更好地devise,而不仅仅是编写函数,然后继续前进。 此外, dependency injection等概念将自然演变为您的代码。

最明显的好处是要知道如果通过了testing,改变的时候没有其他单独的代码单元受到影响。

什么…

一种自动testing代码的方法,针对一系列testing,旨在强制实现预期结果和pipe理变更。

在这个意义上,“单位”是代码中最小的primefaces组件,通常是一些类的方法。 这个过程的一部分是build立存根对象(或“嘲笑”),它允许你作为一个独立的对象使用一个单位。

怎么样…

几乎总是将unit testing的过程内置到IDE中(或通过扩展),以便每次编译都执行testing。 存在一些协助创buildunit testing(实际上是模拟对象)的框架,通常被命名为foo Unit(参见jUnit,xUnit,nUnit)。 这些框架提供了一种forms化的方式来创buildtesting。

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

什么时候…

几乎总是。 非常小的一次性项目可能不值得,但只有当你确信它们真的是一掷千金。 从理论上讲,每个面向对象的程序都是unit testing的,但是一些devise方法使得这个过程很困难。 众所周知,单例模式是有问题的,相反,dependency injection框架是非常多的unit testing导向的。

我发现最简单的方法来说明它是看一些代码。 在NUnit网站上的入门页面是一个很好的介绍什么和如何

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

一切都可以testing吗? 一般情况下,如果它计算的东西是的 UI代码是需要处理的另一个问题,因为模拟用户点击button是非常棘手的。

你应该testing什么? 我倾向于围绕我所知道的将会非常棘手的事情写testing。 复杂的状态转换,业务关键计算等等。 一般来说,我不太担心testing基本的input/输出的东西,虽然纯粹主义者无疑会说我在这方面是错误的, 所有的东西都应该被testing。 像其他许多事情一样,没有正确的答案!

什么是unit testing? 定义很困难。 在技​​术层面上,您可以构build调用代码库中的函数并validation结果的函数。 基本上,你会得到一些诸如“assert(5 + 3)== 8”之类的东西,就像在DataLayer(MockDatabase())。getUser()。name ==“Dilbert”)中一样复杂。 在工具视图级别上,如果一切仍然正常工作,您可以添加一个自动的,特定于项目的检查。 如果您重构并且实现了复杂的algorithm,这非常有用。 结果通常是一堆文档和很less的错误,因为代码的行为是固定的。

我构build了所有边界案例的testing用例,并运行它们,类似于世代垃圾收集器的工作方式。 当我实现一个类时,我只运行涉及这个类的testing用例。 一旦我完成了这个class级的工作,我就运行所有的unit testing,看看是否一切正常。

你应该尽可能的testing,只要testing代码很容易保持未经testing。 鉴于此,不,并非所有事情都可以以一种理智的方式进行testing。 认为用户界面。 认为一个航天飞机或核弹的驱动程序(至less不是纯粹的JUnittesting;))。 但是,很多代码是可testing的。 数据结构是。 algorithm是。 大多数的Applicationlogic类是。 所以testing一下!

HTH。 tetha

什么是unit testing? 它是内置于代码中还是作为单独的程序运行? 或者是其他东西?

从MSDN开始 :unit testing的主要目标是在应用程序中使用最小的可testing软件,将其与代码的其余部分分离,并确定其行为是否与您期望的完全相同。

从本质上讲,您正在编写一小段代码来testing代码的各个位。 在.net世界中,你可以使用类似于NUnit或MBunit的代码运行这些小部分代码,甚至可以使用visual studio中的内置testing工具。 在Java中,您可以使用JUnit。 本质上,testing运行者将build立你的项目,加载和执行unit testing,然后让你知道他们通过或失败。

你怎么做呢?

那么说unit testing说起来容易。 善于练习需要相当多的练习。 您需要以易于unit testing的方式来组织代码,以使testing更有效。

什么时候该做? 有没有时间或项目不这样做? 一切都可以unit testing吗?

你应该在有意义的地方做到这一点。 并非所有的东西都适合于unit testing。 例如UI代码对于unit testing是非常困难的,而且你通常从中得到的好处很less。 然而,业务层代码通常非常适合testing,而这正是大多数unit testing的重点。

unit testing是一个巨大的话题,为了充分理解它是如何最好地利用你的,我build议你拿一本关于unit testing的书,例如“ Test Driven Development by Example ”,它会让你很好地理解概念以及如何将它们应用于您的代码。

在“如何做”部分:

我认为ScalaTest的介绍很好地说明了不同风格的unit testing。

在“何时做”部分:

unit testing不仅仅是testing。 通过进行unit testing,您也可以将软件的devise强制为unit testing的东西。 许多人认为,不pipetesting的其他好处如何,这个devise大部分都是Good Design(TM)。

所以做unit testing的一个原因就是强迫你的devise成为一个希望更容易维护的东西,它会让你没有为unit testingdevise它。