使用TDD和良好的测试覆盖率编写的应用程序的真实示例?[关闭]


17

是否有任何使用测试驱动的开发开发的开源应用程序可以作为良好的单元测试应该如何工作的模型?

我更喜欢在C#和.NET中查看示例。(请注意,我提到的是应用程序,而不仅仅是库。)

我是一个中层程序员,他真的想相信并实践TDD。我在日常工作中使用的应用程序非常复杂-大约一百万行代码-我很想介绍更多的单元测试。我们已经进行了一些单元测试,但是我在TDD上所做的工作以及已经在测试中的代码的工作都没有令人鼓舞。

以我公认的有限经验,TDD似乎以去耦的名义鼓励了很多复杂性。应用程序中难以测试的部分(巧合地往往很关键)被推向外围,进入了可能会或可能永远不会编写的集成测试领域。(我在这里想到了通常的可疑对象,文件系统访问,从数据库中添加对象,异步Web调用等)

被测试的代码往往涉及对象之间的大量协作,也许还涉及一些简单的流逻辑,所有这些都发生在内存中,并且如果不必完全分离所有对象,则可以用更简单,更易理解的方式编写供测试用。

我了解模拟依赖项等的技巧,但是根据我的经验,大量使用模拟会导致非常脆弱的测试。如果我看到许多测试变成红色的第一个直觉是:“好,现在我必须修复所有模拟程序”,那么我的测试就成了阻力,而不是安全网。

我正在努力克服这一精神障碍,在其中,我正在阅读Michael Feathers的书《有效地使用Legacy Code》。我希望它能告诉我一些我所缺少的东西。

我还想研究一些具有良好代码覆盖率的.NET应用程序,例如内容管理系统或CRUD应用程序。Bob叔叔谈论的FitNesse测试框架是我可能要看的东西,但是很高兴看到用我最熟悉的语言编写的东西。

任何建议或智慧的话,将不胜感激。



2
不太...我对查看现实世界中的示例感兴趣。该帖子中接受的答案推荐了一个测试框架。我之前已经看过一些框架和库的示例,但这并不能解决我的问题。
乔什·厄尔

@JoshEarl -我同意。我不认为会低于我的回答一直相关的其他职位
hanzolo

Answers:


14

我不知道是否使用了TDD,但是一个很好的测试示例是sqlite,它具有出色的100%分支覆盖率,并且测试代码和脚本比产品代码多1000倍。


4
如果他们的代码与测试代码的比率如此之高,这听起来像是极大的努力浪费
Ryathal 2012年

6
@Ryathal:失败的代价决定了测试的工作量,而不是测试代码的长度。如果在足够关键的方法中有足够的用途,那么测试可能是值得的。不过,我不确定SQLite是否不会过度使用它。
thiton

3
对于许多人来说,sqlite绝对是关键任务。您可能会惊讶于它的使用频率(例如OSX,iOS,Android OS)。您必须意识到,许多测试代码和数据行可能是机器生成的。工业实力数据库具有很多优势。
布莱恩·奥克利

10
SQLite是这个星球上最广泛使用的SQL数据库,它的安装基础是数量级比MySQL和PostgreSQL,SQL服务器,Oracle,DB2更大的顺序组合。它可能是最广泛使用的软件之一。如果SQLite中存在错误,则地球上的每个智能手机都将停止工作。我认为这有点偏执。
约尔格W¯¯米塔格

@JörgWMittag哇,我从不知道SQLite。有趣。谢谢。但是测试代码要多1000倍。这是令人难以置信。
迈克·


0

许多第三方的开放源代码库都是TDD。开发人员使用XUnit作为单元测试框架对Rhinos的休眠库(如RhinoMocks和NHibernate)进行了TDD。

现在,使用OSS,您通常不能保证产品中的所有内容均已开发。社区可能有包括该实践在内的标准,他们甚至可以使用执行代码覆盖率指标的构建机器人,但是TDD是开发人员必须接受的一种心态,并且广大公众都可以承诺开放-源VCS干线(例如GitHub上的VCS干线),任何人都可以在不进行任何测试覆盖范围的情况下进行任何更改(或者如果需要覆盖,则可以在事实之后编写测试,这违反了TDD的精神,但实际上并没有一种在提交时捕获它的好方法)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.