返回首页


当人们谈论关于自动化测试,单元测试,得到的方方面面。阿尔法爱好者做他们所有的时间,鲍勃叔叔马丁对他们的博客,奥普拉邀请他们到她的节目,总统先生......好,你的想法。当有人提到的集成测试,它一样,"你应该是一个不错的男孩/女孩写集成测试,或你会punishedquot。那些刚开始自动化测试你可能想,"OK这些集成测试必须是真实的屁股疼痛,欧莱雅真的scaredquot。这个职位将减轻你的恐惧,我答应!有什么区别呢?
当我们来看看这两种类型的测试更接近,我们发现它们之间有没有明显的区别。人们往往认为,单元测试是那些只测试一个类。但1 quot; unitquot;有时可以由几个紧密相关的类服务于同一目的。有些人甚至不敢说,不管什么测试,包括在你的单元测试数据库(通过NHibernate的)互动。夫妇的几年前,你会被禁止从社会等叛逆报表!
集成测试是为了检查有多好几个单位可以作为一个团队一起工作。 (也有quot; functionalquot;和quot; acceptancequot。做同样的测试,一些人甚至声称为{A})人们害怕写集成测试,因为他们认为他们将有测试系统中的所有从输入画面的数据库,或另一个屏幕,或调用外部服务的方式。飘柔,"因为你的恐惧中解放出来遐!
如果你不喜欢写你的UI测试,挑了一个测试框架,可以很容易(如{A2的}),或开始测试只是一个水平低于UI。虽然第一个选项会让你相信,你的UI正确地与其他系统集成,其他人会帮助你隔离代码的用户界面,提高了系统的设计。这是一般规则:走向集成测试给你更多的信心,而单元测试有助于改善您的设计。
正如你所看到的,你可以包括任意数量的类,在您的测试,有时甚至是外部服务,并根据目前的趋势,它可以被称为什么。比方说,一些测试更多quot;单位yquot;然后别人,但两者之间没有明显的区别,只是一个连续谱。对于这个职位的目的,让我们来谈谈关于quot; smallerquot;和quot; biggerquot;测试。单元测试有光泽
有人说,懒惰推动全人类的进步。当你写一个单元测试,你要真的是懒惰。你要做出巨大的努力,以尽可能少的代码编写。和你应该成为编写代码不是必要的严格测试此功能的特定过敏。你开始问自己:我真的要创建所有这些对象,并将它们保存到数据库中,为了测试一个简单的字符串属性?或者我可以做一个快捷方式吗?我有写很多的代码,只是计算出的价值,我需要检查吗?也许我只是通过财产公开呢?
的那一刻,你让你的懒惰,影响你的代码是巨大的。所有程序员神的微笑,所有的Alt.Net怪才NODD赞许,所有的拉拉队开始跳舞。此外,你的代码变得更容易使用,修复,改善,有时甚至要了解。为什么会这样 - 是一个很大的谜,也为今后的博客文章的主题。但基本的想法是简单的理解,当您尝试写一个小的测试,你就会与被测类小。
单元测试的一个额外的好处是,它打破了,你知道哪些系统的一部分,不能正常工作,因为测试占地只有一小部分功能。
一个小的测试文件系统的功能?有时是(你给它一个明确的名称),但只有一小部分。一个小的测试文件系统的使用情况?是的,但大多是在图书馆。虽然最终到终端系统通常是通过UI使用,图书馆通过代码,单元测试提供了一些异国情调的情况下,使用示例。单元测试可以提供一个安全网,对回归的错误?只有它的一部分:如预期的工作的所有单位,您可以重新连接的方式,打破系统,同时保持你的所有单元测试通过。集成测试是强大的
虽然所有的开发者倾向于选择单元测试,新手往往写集成测试,实际上不知道它。尽管共同的信念,集成测试,有时更容易编写。您只需按照用户的故事。例如,如果您有以下要求:
如果一个客户有quot; Preferredquot;状态(即,她已为3个以上的订单,总金额3500奥斯曼毕阿士特上个月),她应该收到一封电子邮件,大约每销售。
测试将是非常简单:创建一个客户端,具有足够的总添加一些订单,然后开始销售,并确认发送电子邮件(后者并非如此简单,但我们可以用{A3的}为了检查)。一个新的用户将阅读测试,并知道究竟发生在这里。如果你懒得命名根据测试功能的测试类和它的方法,她甚至不会有看测试代码。我很困惑,你不只是做一个简单的比较吗?
,如果你想让它......
驱动设计:单元测试,它是最好的。他们协助你个人的责任提取到单独的类,重点实施一个单一的东西,并且容易更换。集成测试不开车你在所有的设计。
提供安全网,对回归错误:保证单元测试(或多或少),个别单位如预期般运作。他们不保证该系统的工作作为一个整体预期。更糟的是,单元测试往往给你误报:您可以更改特定功能的执行情况,以及一些单元测试可能会失败,虽然系统实际工作正常。这是因为单元测试,经常测试系统的行为,而不是实施细节。集成测试,确认该系统作为一个整体,实施独立工作。可以,但是,他们失败,如果他们接触外部系统,这是出于某种原因无法使用。
Maintainablilty:单元测试是超级易于维护。 ,因为它们的功能涵盖了一小块,当一个测试失败,这是明确系统的哪一部分应该是固定的。 集成测试是很难维持的。集成测试失败时,你最好有单元测试所涵盖的功能,或者你提前调试会话。
记录系统:单元测试的一些努力,小件,文件,应用程序的工作流程,大多数用户不感兴趣。这是有用的,当你想在的定制FactoryShmactory(一个单元测试,将提供一个例子)落实和堵塞的东西,或只需了解系统的内部细节。集成测试文件系统的主要特点。他们演示结束到最终用户的行动和他们的输出。这是一些枯燥的理论,给我一个例子!
让我们开始从一个用户的故事:
我有一个数据库的小猫,并希望能够搜索他们的名字。
测试搜索过程中,至少对我来说,最简单的方法是创建两个实例,一个满足搜索条件,其他没有,申请thenbsp;搜索到这两个集合。如果我们得到了quot; goodquot;,但不quot; badquot;之一,我们可以假设我们的搜寻工作正常。
我们将开始与集成测试,在我们测试整个场景:保存我们两个小猫到数据库,然后执行数据库搜索(不用担心,这个职位是SQL)。假设我们使用NHibernate的数据库访问,以及我们的Io​​C容器StructureMap。姑且称之为SearchQuery类,我们试图试驾。我们的想法是,我们创建了一个API,可以很容易地编写一个测试。最简单的方法是创建名为JustGimmeAllKittiesNamedOptimusPrimeNow方法,但很有意义引入一个搜索参数, 我们的测试,可能看起来像这样:

[Test]

public void QueryByNameReturnsTheMatchingKittiesFromTheDb() {

	//Arrange

	var session = ObjectFactory.GetInstance<ISession>();

	var optimus = new Kitty {Name = "Optimus Prime"};

	session.Save(optimus);

	var tron = new Kitty {Name = "Megatron"};

	session.Save(tron);

 

	var query = ObjectFactory.GetInstance<SearchQuery>();

 

	//Act

	IQueryable<Kitty> result = query.FindByName("Optimus Prime");

 

	//Assert

	Assert.AreEqual(1, result.Count());

	Assert.AreEqual("Optimus Prime", result.First().Name);

}

最明智的开发商将确认这是一个集成测试,因为它涉及到一个数据库。 (附注:一如既往地与集成测试,你应该格外小心,在离开前测试系统在相同的状态,我通常通过创建一个内存中的SQLite数据库实例的新鲜实现,但是这出。这篇文章的范围。作为一个结果),我们班加上NHibernate的,这意味着我们不能使用NoSQL数据库或其他数据源(有机会,我们永远需要的)。
积极的一面,我们的测试验证,该系统作为一个整体运作正常。
现在让我们尝试将在quot; unitquot;方向。我们的TDD书上说,你不可触碰你的数据库,手拿开!但我们如何测试数据库检索,而不触及数据库本身?容易,让的使用IQuerable接口。在我们的测试中,我们将quot; fakequot;使用IQuerablelt的数据库; Kittygt;我们的查询源。在我们的生产代码,我们会代替它与quot; realquot数据库中的数据。{C}
SearchByNameSpecification是我们这里试驾。这个类是不耦合的数据库,它可以过滤任何IQuerablelt; Kittygt;源。因为它有较少的责任,这是更容易维护。测试本身更容易保持,因为我们没有设置数据库。结束语
已成为这个职位已经太大,所以我想,我宁愿离开,没有任何结论。但是,如果你觉得你知道更多的东西,关于整合,或单位,测试,或者你要开始了激烈的辩论,欢迎您贡献的意见。并且不要忘记检查} {A4纸的其他职位!

回答

评论会员: 时间:2
M