`
zfanxu
  • 浏览: 127590 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

[转]如何控制单元测试的粒度?

TDD 
阅读更多

单元测试的粒度问题一直是软件开发社区面临的现实问题,最近,陈皓针对StackOverflow上的老问题做了总结,并发表了自己的看法,读者在随后的评论中也进行了讨论。

John Nolan在《How deep are your unit tests?》中问道:

TDD需要花时间写测试,而我们一般多少会写一些代码,而第一个测试是测试我的构造函数有没有把这个类的变量都设置对了,这会不会太过分了?那么,我们写单元测试的这个单元的粒度到底是什么样的?并且,是不是我们的测试测试得多了点?

最佳答案是:

老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常地小心。当在一个团队中,我会非常小心的测试那些会让团队容易出错的代码。

最让人意外的是,这个答案是由XP和TDD的创造者Kent Beck给出的! 难怪有人评论说:

只是要地球人都不会觉得Kent Beck会这么说啊!我们有大堆程序员在忠实的追求着100%的代码测试覆盖率,因为这些程序员觉得Kent Beck也会这么干!我告诉过很多人,你在你的XP的书里说过,你并不总是支持“宗教信仰式的Test First”,但是今天Kent这么说,我还是很惊讶!

陈皓则是非常同意Kent的回答:“怎么合适怎么搞,爱怎么测试就怎么测试,只要自己和团队有信心就可以了。没有必要就一定要写测试,一定要测试先行。”

其他排名靠前的答案包括:

Dominic Rodger

为可能会出错的地方和边界情况编写单元测试。另外,单元测试应该跟着缺陷报告走,在修补缺陷之前编写好单元测试。开发人员就会对代码充满自信:一是bug已经修补,二是bug不会重现。

kitofr

关于TDD最大的误解之一就是第一个字母——测试(T)。这也是BDD出现的原因。因为大家没有真正理解第一个D(驱动)的重要性。我们总是倾向于对测试关注更多,而对设计的驱动关注太少。我想这是一个模糊的回答,但是你应该考虑如何驱动你的代码,而不是测试什么,这是覆盖率工具该做的事情。设计是一个很大而且问题更多的问题。

最后,陈皓表达了自己的观点:

  • 目前的国内教育模式让我们习惯于标准答案,习惯于教条,从而不会思考!敏捷开发中的若干东西似乎都成了软件开发中对某种标准答案的教条,实在是悲哀!
  • 软件开发是一种脑力劳动,是一种知识密集型的工作,就像艺术作品一样,创作过程和成品是没有标准答案的。
  • 软件的质量不是测试出来的,而是设计和维护出来的。就像工匠们在一点一点地雕琢他们的作品一样。

许多读者在原文的评论中表达了自己的看法

  • 对于要做多细,我的经验就是:当我不在的时候,如果同事打电话说有Bug,询问是否会是我的问题,而我可以很自信的回答No的时候,就可以啦! 所以最享受的就是大家加班,而我在放心玩乐的时刻。这让我想起了一件事情,有位同行朋友学车,一开始总想让师傅告诉他,需要“打点方向”的时候到底是多少度? 需要“加点油”的时候到底是加到每小时多少公里? 后来知道了,没人会告诉你,你得自己Do!
  • 其实我觉得在现今大型企业的团队中, 开发人员的职责就是开发和保证代码正确的实现 至于测试则基本是交给测试的人员来做,而测试人员又拿着测试的工资,他们不会考虑开发人员的水平,而是循规蹈矩的去完成整个测试流程。
  • 关于StackOverflow上出现的大量排斥TDD的观点,我尝试这样来解释:占主流群体的底层程序员在没有监督的情况下缺乏责任心只求应付工作......到了工作岗位上也是如此,领导在不在大不一样。总结下来就是,大多数人在没有监督的情况下容易慵懒应付。这应该是人的天性。后来工厂出现的流水线,应该就是对付这种情况的。把工作流程标准化、流水线化,让整个流水线上的人都没机会偷懒。我想这也是TDD的目标之一。如果没有足够的测试用例,你怎么确认某个模块是功能完整的无明显缺陷的?如果原作者离职了,后来的维护者修改了先前的代码,又如何保证不影响以前的功能?要知道,你修改一个新bug,很可能会把以前的多个旧bug放出来,有经验的开发者应该明白我说的什么意思。于是软件越来越难于维护,维护者也越来越排斥修改代码,一潭死水无人敢碰,软件提前寿终正寝。我最终的结论就是,TDD要由项目管理者推动实施,而不能征求下面程序员的意见,——他们虽然人数众多,但就像面对老师的学生一样,总是要求玩耍而不是学习,这对项目本身是无益的。
  • 说白了还是看你怎么用,TDD也只不过是个方法罢了,工具而已,又不是思想或者本质之类的。我个人开发就很不TDD,即使需要写测试也是针对公开的接口或者某些特定的调用去做测试程序,这样的好处是达到测试代码的目的,同时又有了一个测试程序。缺点是这个测试程序不带好集成到发布过程。但换言之,好的程序员写的代码自然质量较高,差的程序员有没有单元测试一样差,甚至于无法保证差的程序员写的测试单元没有BUG,如果有BUG那不是更悲剧?
分享到:
评论

相关推荐

    cc++单元测试理论精要.doc.rar

    《C/C++单元测试理论精要》 在软件开发过程中,单元测试是保障代码质量、降低维护成本的重要手段。尤其在C/C++这样的底层编程语言中,单元测试更显得至关重要。本文将深入探讨C/C++的单元测试理论,旨在帮助开发者...

    SpringBoot使用Junit进行单元测试

    此注解可以加载整个应用上下文,或者通过其属性(如`classes`或`webEnvironment`)进行更细粒度的控制。 例如: ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.context....

    JavaScript对象封装与单元测试.pdf

    JavaScript对象封装与单元测试 JavaScript对象封装是指将JavaScript代码组织成一个对象的形式,以便于测试和维护。单元测试是软件测试的一种,目标是确保每个单元的正确性。在JavaScript开发中,单元测试是非常...

    示例4 如何编排几个细粒度服务形成粗粒度服务

    而粗粒度服务(Coarse-grained Services)则是相对较大的服务单元,通常包含多个细粒度服务的功能,旨在减少接口数量和通信开销。 在实际操作中,编排细粒度服务形成粗粒度服务主要涉及以下几个步骤: 1. **识别...

    单元测试中PowerMock常用方法.

    在单元测试领域,PowerMock是一个强大的工具,它扩展了诸如Mockito等模拟框架的功能,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器等。这一工具对于测试那些难以或者无法正常...

    中山大学软件测试之集成、确认测试

    与单元测试相比,集成测试可以确定模块间接口信息内容的正确性以及模块之间的相互调用关系是否符合设计要求,这是单元测试所无法提供的。与系统测试相比,集成测试用例从程序结构出发,其目的性、针对性更强,发现...

    单元测试_pytest_editby xbc.pdf

    2. 支持参数化测试,允许细粒度控制测试用例。 3. 能够支持从简单的单元测试到复杂的功能测试,包括自动化测试如selenium/appnium,以及接口自动化测试(pytest+requests)。 4. 提供丰富的第三方插件支持,可以...

    白盒测试方法介绍

    JOEL测试是一种评价软件开发团队效率的方法,它包括了几个关键指标,如版本控制系统、自动化构建、单元测试等。这些指标与持续集成密切相关,体现了持续集成的重要性。 **3.2 持续集成不是XP专有实践** 虽然持续...

    java各种测试jar包

    JUnit4是Java领域最常用的单元测试框架,由Ernst von Reith和Kent Beck共同开发。它提供了注解(annotations)功能,使得编写测试更加简洁和灵活。例如,`@Test`用于标记测试方法,`@Before`和`@After`用于定义在每...

    微程序控制器实验总结报告

    微程序控制器的核心思想是将机器指令分解为一系列更细粒度的微指令(Microinstructions),这些微指令在控制存储器(Control Memory)中以微程序的形式存储。微程序由一条或多条微指令组成,每条微指令包含若干微...

    IOS APP自动化测试环境搭建

    对于iOS应用,主要的自动化测试类型包括单元测试、集成测试和UI测试。 **单元测试**: 1. **XCTest**: Apple提供的一套内置测试框架,它与Xcode紧密集成,可以用于编写单元测试。每个测试用例都是一个继承自`...

    软件测试理论:测试分类、测试模型、测试用例设计等等

    3. 单元测试:针对代码模块进行的最小粒度测试,确保每个模块独立运行无误。 4. 集成测试:多个模块组合后进行的测试,验证模块间的接口和交互。 5. 系统测试:整体系统层面的测试,检查整个系统是否满足业务需求。 ...

    android 粒度、瀑布案例开发

    例如,在需求分析阶段明确应用功能,设计阶段完成架构和界面设计,编码阶段实现功能,测试阶段进行单元测试和集成测试,最后是维护阶段。 5. **版本控制**:在瀑布模型中,版本控制工具如Git非常重要,它们可以帮助...

    接口测试学习入门教程.docx

    接口测试的意义在于,相比于单元测试,它的投入较少,技术难度较低,但能覆盖较粗粒度的接口层面,保证子系统或模块在不同场景下的正确调用。接口测试的持续集成特性使其能够在开发过程中快速反馈问题,实现快速迭代...

    上课的时候老师给的软件测试资料

    1. 单元测试:针对代码模块进行的最小粒度测试,验证每个独立部分是否能正常工作。 2. 集成测试:多个模块组合在一起进行的测试,确保各模块间接口的正确性。 3. 系统测试:验证整个系统是否满足功能和非功能需求,...

    敏捷测试的必由之路分层测试.pdf

    在实际应用中,测试粒度可根据服务、包、作业等不同组件进行划分,同时进行风险分析,对于简单逻辑、复杂逻辑或配置文件等,分别制定相应的测试策略。视图解析器和视图(*.jsp)也是测试的重要组成部分,确保用户...

    软件测试实战项目.zip

    - 单元测试:针对程序模块进行的最小粒度测试,检查其功能是否符合设计要求。 - 集成测试:在单元测试基础上,将多个模块组合进行的测试,验证模块间的接口和交互。 - 系统测试:对整个系统进行全面的测试,包括...

    软件测试管理及其应用重点.pdf

    单元测试主要关注模块接口、算法逻辑、数据结构以及边界条件等,以确保代码在最小粒度上的正确性。集成测试则是将这些独立模块组合起来进行测试,以发现模块间接口的问题。系统测试则是在更全面的视角下验证软件系统...

Global site tag (gtag.js) - Google Analytics