自动化单元测试 - 为什么?什么?哪一个?

San*_*box 34 c# unit-testing winforms

我是一名C#winforms开发人员,拥有大约一年的经验.到目前为止,我一直在进行的唯一单元测试是手动的.我有一段时间考虑过以下事情:

  • 为什么我们需要进行自动化单元测试?效果如何?
  • 如果我想开始进行自动化单元测试.我应该从哪里开始?(听说过nunit)
  • 在设计课程时是否需要记住任何事情以促进自动化单元测试?
  • C#是否具有自动单元测试的内置支持?
  • 我们还可以使用自动化单元测试来测试GUI,还是只是业务逻辑?
  • 听说过嘲笑框架.它们也用于单元测试吗?

Mar*_*ann 72

为什么我们需要进行自动化单元测试?效果如何?

自动化单元测试首先是非常有价值的,因为它是可自动化的(通常,我们只在自动化时将其视为"单元测试" ).随着应用程序的大小增加,手动测试整个应用程序可能需要数小时甚至数周.即使仅测试应用程序的一小部分也需要时间并且容易出错.除非您是自闭症患者,否则如果您不得不重复几十次,您将无法专注于100%正确执行每项手动测试.

在敏捷开发中,我们采用快速反馈的概念:您越早得到关于您所做的是对还是错的反馈,您就越有效.我们都犯了错误,但是在制造错误三十秒之后发现并修复错误的成本远低于几天或几周.这就是自动化测试如此重要的原因.

虽然您可以在许多级别上进行自动化测试,但单元测试是最有效的实现类型.它可能是最难理解和掌握的测试学科,但它比任何其他类型的测试都强大得多.

如果我想开始进行自动化单元测试.我应该从哪里开始?(听说过nunit)

首先,您需要学习一些单元测试基础知识.Roy Osherove的书" The Unit of Unit Testing"是一本很好的介绍.

说到框架,NUnit已经存在了很长时间,但它有一些固有的问题.

如果您已经拥有Visual Studio Professional或Team System,那么就有一个内置的单元测试框架,通常称为MSTest.大多数人不喜欢这个框架,但就个人而言,我发现它非常适合.IDE集成运行良好,但API可能更好.

如果您正在寻找一个免费的开源单元测试框架,我会推荐xUnit.net,这是一个更现代的框架.

在设计课程时是否需要记住任何事情以促进自动化单元测试?

是的,每个班级都应该可以单独使用.这可能很难通过预先设计来实现,或者如果您尝试将单元测试改进到现有代码上,但如果您采用测试驱动开发(TDD),则应该或多或少地自然而然.

C#是否具有自动单元测试的内置支持?

不,C#只是一种语言,但正如我上面提到的,Visual Studio的某些版本具有MSTest.

我们还可以使用自动化单元测试来测试GUI,还是只是业务逻辑?

单元测试GUI往往非常脆弱(即测试维护非常高),因此通常不是一个好主意.

但是,有许多设计模式可以帮助您将所有GUI逻辑提取到可测试的类中:Modev-View-Controller,Model-View-Presenter,Application Controller,Model-View-ViewModel等.

您可以通过此类接口执行整个应用程序的自动测试,仅绕过GUI呈现部分.这些测试称为皮下测试,但被认为是集成测试,而不是单元测试.

听说过嘲笑框架.它们也用于单元测试吗?

动态模拟库用于单元测试.

一些好的和受欢迎的是

  • 哇...这是2014年,这是我在搜索中发现的最好的内容,可以帮助像我这样的新手.谢谢你,先生. (5认同)
  • 综合答案. (4认同)

Kev*_*che 8

  • 为什么我们需要进行自动化单元测试?效果如何?

隔离程序的某些部分并显示它们是"正确的".如果您想了解如何运行代码,它们就是合约.有了这个,他们可以快速,经常地告诉您代码是否正常运行.

单元测试使程序员能够更轻松地更改代码,更有信心,副作用更少.它促进/启用代码的重构,没有单元测试可能是危险的.考虑到这一切,我发现单元测试将使您的代码更好.

我发现它们有效但会承认这是学习曲线的一部分.直到你真的很擅长它(我仍然是一个初学者),你经常会错过任何东西,但我发现它仍然比我做了太久的手动测试更好.我发现单元测试几乎立竿见影.在我的第一个项目中,我发现我节省了大量的时间,因为我不需要手动测试附近那么多,当我正在处理的代码导致测试失败时,我实际上不止一次惊喜.我甚至都没想过要手动重新测试.

  • 如果我想开始进行自动化单元测试.我应该从哪里开始?(听说过nunit)

Nunit很好,MbUnit很好.要开始,请阅读并阅读读数中的练习.关于单元测试,测试驱动开发(TDD)和重构的网站和博客.Object Mentor在TDD上有一个很好的系列.然后在某个时候选择一些代码并尝试一下.

我建议的书籍 - 测试驱动开发实例,测试驱动开发,实用指南,单元测试艺术,重构(Martin Fowler),重构工作簿,重构模式,清洁代码,我相信还有其他.

我在列表中重构了书籍,因为我已经找到了通过单元测试重构工作的技巧.

  • 在设计课程时是否需要记住任何事情以促进自动化单元测试?

我提到的很多书都会讨论这个问题.答案是肯定的,不是.通常,具有较少依赖性的更好设计的类更容易测试.这只是一个很好的设计,但它恰好使测试更容易.关于是否应该更改代码以使其更易于测试,存在一些争论.我倾向于你.在这一点上对我来说,我过去的代码没有包含很多"好设计"的想法,所以对我来说,开始这个TDD之旅就是提高我的代码意识和良好设计水平,部分原因是想要做TDD.

  • C#是否具有自动单元测试的内置支持?

如果你有VS 2008专业版,是的,或团队系统,但我自然认为你没有.

  • 我们还可以使用自动化单元测试来测试GUI,还是只是业务逻辑?

是的,那里有几种工具.Watin是一个浮现在脑海中的人.

  • 听说过嘲笑框架.它们也用于单元测试吗?

是.它们允许模拟/测试非常复杂的对象,这些对象无法轻松进行单元测试.

在我沿着TDD路径前进的过程中,我故意忽略了一开始的嘲笑.对我来说,我希望能够更好地理解为什么需要它们以及如何在没有它的情况下使用它们,并在我编码的地方看到自己会被传统的TDD技术所困扰.

我发现的另一本书很有用,虽然它让我的大脑受到了影响,但它正在有效地使用遗留代码.它真的向你展示了未经训练的代码看似无辜的代码如何让生活变得非常艰难.

  • +1谢谢.另一个全面的答案 (2认同)

PVi*_*itt 6

要点1)它可以让您不断了解工作情况和工作情况.一旦更改了一个简单的函数,如果此更改中断了任何内容,则会得到结果.此外,您可以稍后重构您的整个应用程序,并且只要您的单元测试全部变为绿色,一切正常.这一点非常重要.或者你有没有做过一个永远不会被重构的项目?

要点2)NUnit是一个很好的起点,但还有其他几个单元测试框架.另外我建议看看CruiseControl或其他持续集成工具,这些工具需要开发人员的大量工作.

要点3)嗯,肯定有人可以告诉你时间和工作时间做什么和不做什么.至于我的单元测试背景仅限于将其用于嵌入式设备,我们还有其他很多困难.

要点4)C#是一种编程语言,而不是测试框架..Net至少有一个可以在单元测试期间提供帮助的属性,即InternalsVisibleTo-Attribute,可以使一个特定类型的内部类和方法公开.

要点5)如果你有一个设计良好的应用程序,你不必测试你的gui.想一想:你的gui没有代码.用户可以按下的每个按钮都映射到控制器.用户可以提供的每个输入都被传递给控制器​​.那么你需要在你的gui中测试什么?您所要做的就是让您的控制器经过测试并运行良好.通过这个MVVM/MVC/WhatElseArchitecture,您可以一方面使用设计良好的应用程序,另一方面可以使用易于测试的应用程序.


Pre*_*gha 5

  • 为什么我们需要进行自动化单元测试?效果如何?

非常.

  • 如果我想开始进行自动化单元测试.我应该从哪里开始?(听说过nunit)从nunit开始 - 非常简单

  • 在设计课程时是否需要记住任何事情以促进自动化单元测试?如果你擅长单元测试,那么你会想要.

  • C#是否具有自动单元测试的内置支持?不 - 但Visual Studio确实 - 但我不建议使用它

  • 我们还可以使用自动化单元测试来测试GUI,还是只是业务逻辑?任何东西都可以自动化,这只是它的难易程度.

  • 听说过嘲笑框架.它们也用于单元测试吗?是.

阅读Roy Osherove的单元测试艺术.