`
yzd
  • 浏览: 1826936 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

单元测试之关键问题解答

 
阅读更多
<p style="text-indent: 21pt;">近来特别关注单元测试的应用。大家可能会笑了,单元测试都N年前提出的了,您老怎么现在才来做呢。是的,单元测试几乎人人都在提,但是真正做好的没几个。</p>
<p style="text-indent: 21pt;">我们几个同事在讨论这个的时候,发现这里面有很多因素。相信大家也在实践过程中都遇到过。</p>
<h3>单元测试测什么</h3>
<p style="text-indent: 21pt;">这是最经常被提到的问题。往往有三个答案:</p>
<ol>
<li>
    <div style="text-indent: 21pt;">针对代码测试,往往也被称为针对类进行测试。</div>
    </li>
    <li>
    <div style="text-indent: 21pt;">针对模块接口进行测试。这种模块往往是没有界面性质的。</div>
    </li>
    <li>
    <div style="text-indent: 21pt;">针对业务功能进行测试。类似于模拟需求测试。</div>
    </li>
</ol>
<p style="text-indent: 21pt;">在回答这个问题之前,我们都回顾一下,《测试驱动开发》中,强调的是Story的概念。Story就是一个应用场景。用程序的语言的来翻译的话,就是将需求实例化。</p>
<p style="text-indent: 21pt;">但是KENT BECK显然没有将这个概念明确化。这样难怪,业务模型,是基于不同层次来说的。如果你只是设计一个类,那么这个类本身也是有需求的。那么这个类的需求和整个软件的需求是不是一致对待呢?</p>
<p style="text-indent: 21pt;">个人倾向于第三类的测试,一二为补充。</p>
<p style="text-indent: 21pt;">不过这里重点说一下业务功能的测试难点,那就是模态窗体的测试。这个难点的罪魁祸首是Windows的消息机制决定的。每一个模态窗体都有自己的消息循环(死循环)在处理消息,当从一个模态窗体切换到另一个模态窗体的时候,测试代码就不能继续下去。</p>
<p style="text-indent: 21pt;">针对这个问题,我的处理方式,就是“解铃还须系铃人”。通过Windows的消息循环就可以穿透这种切换的休克。当然了,处理方式还是比较复杂的。</p>
<h3>单元测试代码不能工作了</h3>
<p style="text-indent: 21pt;">这往往是单元测试不能继续的借口。应该说,很多人还是热衷于进行单元测试的。可是你在后期询问单元测试的作用的时候,他们就会非常遗憾地告诉你,由于需求变更太频繁,单元测试代码已经不能工作了。</p>
<p style="text-indent: 21pt;">如果你有相似经验,你会非常赞同这个原因。因为,毕竟单元测试侧重的是软件质量,可是我们往往直接面对的是软件进度。没有人会告诉你面对质量和进度,应该选择什么。但是你知道,你只有选择进度。</p>
<p style="text-indent: 21pt;">几乎所有的程序员都能明白,前期的质量,会节省后期的进度。但是好像老板不知道。至少,很多程序员都相信这点。</p>
<p style="text-indent: 21pt;">不管怎么说,单元测试代码真的就这么放弃了吗?其实很简单,在你的考核体系中,加上单元测试代码失败的惩罚。因为选择一个技术,只是一个决策问题。而保障一个技术,那就是管理问题了。</p>
<p style="text-indent: 21pt;">不过,要注意的是,永远忘记单元测试必须时刻进行运行。每一次代码签入的时候,必须运行一次。必须认识到,有了这个自动机制,才能保障你的单元测试持续工作下去。</p>
<h3>单元测试需要设计</h3>
<p style="text-indent: 21pt;">非常多的人都认为,一个系统如果不针对单元测试进行设计,那么其可测试性就会降低,以至于不可以继续下去。</p>
<p style="text-indent: 21pt;">我并不怀疑设计的必要性,但这个说法最让我不得不怀疑另一个看上去毫不相干的观点:尝试和执行单元测试,需要的是勇气和决心。</p>
<p style="text-indent: 21pt;">这点其实KENT BECK在XP开发方式的介绍中,就说明了这个问题。作为执行的主体,人的性格很可能影响最终执行结果。</p>
<h3>小结</h3>
<p style="text-indent: 21pt;">软件工程中有很多新的工具,但我们往往发现叫好不叫座,而原因往往也是使用中国的一句古话就是:具体问题具体分析。但是回过头来分析一下,其实很多具体问题都是可以有办法解决的。将这些总结贡献出来,希望我们中国的软件技术走得更快点。</p>
分享到:
评论

相关推荐

    如何实施单元测试之关键问题解答

    如何实施单元测试之关键问题解答!近来特别关注单元测试的应用。大家可能会笑了,单元测试都N年前提出的了,您老怎么现在才来做呢。是的,单元测试几乎人人都在提,但是真正做好的没几个。我们几个同事在讨论这个的...

    单元测试之组织保障

    前几天发的一篇《单元测试之关键问题解答》主要写的是我在实践过程中,针对我遇到的一些非技术问题的思考。后来我看到一篇和我博文一样标题的文章《单元 单元测试之组织保障 软件测试 这几天一直都在思考新项目中...

    Python unittest单元测试openpyxl实现过程解析

    关键是单元测试一般是开发或者测试开发做的。 测试一般会在集成、系统、验收进行测试 4)unittest的注意事项: 1.模块名需要以 test_ 开头 2.类名:以 Test 开头 3.测试用例的方法名称以 test_ 开头 4.单元测试写入...

    福建省2019年中考数学总复习第五单元四边形单元测试练习

    本资源摘要信息是福建省2019年中考数学总复习第五单元四边形单元测试练习,共包含选择题、填空题和解答题三部分。 选择题部分包含8道题目,涵盖了四边形的性质、菱形和矩形的性质、对角线的性质等知识点。这些题目...

    pyjvm:在Nintendo Switch上运行Java字节码(.class文件)!

    Python中的JVM实现 python-jvm-interpreter是Python中Java虚拟机的实现。... 即使您没有碰到任何关键问题,每次更改后运行单元测试始终是一个好主意。 这样可以确保一切都不会中断,如果中断了,您将立即知道为

    Spring.3.x企业应用开发实战(完整版).part2

    16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建...

    Spring3.x企业应用开发实战(完整版) part1

    16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 JUnit 4生命周期 16.2.3 使用JUnit 16.3 模拟利器Mockito 16.3.1 模拟测试概述 16.3.2 创建...

    Hadoop实战(第2版)

    在关键问题领域对基础概念和实战方法做了权衡,例如导入导出、序列化,以及LZO压缩。你将会学习到每个技术的细节,以及当遇到一个具体问题时能够给出对应的解决方案。本书提供了结构良好且易于理解的例子,可用于...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    技术点79 MapReduce 函数、作业和管道的单元测试 13.1.3 LocalJobRunner 技术点80 用LocalJobRunner 进行重量级的作业测试 13.1.4 集成和QA 测试 13.2 调试用户空间的问题 13.2.1 访问任务日志 技术点...

    python cookbook(第3版)

    14.2 在单元测试中给对象打补丁 14.3 在单元测试中测试异常情况 14.4 将测试输出用日志记录到文件中 14.5 忽略或者期望测试失败 14.6 处理多个异常 14.7 捕获所有异常 14.8 创建自定义异常 14.9 捕获异常后...

    The-Java-Workshop:一种新的交互式Java学习方法

    您将学到什么编写易于维护的简洁注释的Java代码调试Java程序中的逻辑错误并处理异常实施面向对象和...解析响应数据使用加密和加密保护您的数据编写单元测试以使用JUnit验证您的代码相关工作坊如果您发现此存储库很有用...

    play框架手册

    单元测试 - 106 - 功能性测试 - 106 - Selenium test用例测试 - 107 - Fixtures固定值 - 108 - 运行测试 - 110 - 陆续集成,并自动运行测试 - 111 - 16.安全指南 - 112 - Sessions - 112 - 守住你的安全…安全 - 112 ...

    play framework 框架手册 word 版

    单元测试 - 106 - 功能性测试 - 106 - Selenium test用例测试 - 107 - Fixtures固定值 - 108 - 运行测试 - 110 - 陆续集成,并自动运行测试 - 111 - 16.安全指南 - 112 - Sessions - 112 - 守住你的安全…安全 - 112 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. ...

    Spring中文帮助文档

    8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. 通用目标 8.3.4. JDBC测试支持 8.3.5. 常用注解 8.3.6. JUnit 3.8遗留支持 8.3.7. Spring TestContext Framework 8.3.8....

    Spring API

    8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. 通用目标 8.3.4. JDBC测试支持 8.3.5. 常用注解 8.3.6. JUnit 3.8遗留支持 8.3.7. Spring TestContext Framework 8.3.8....

    Spring 2.0 开发参考手册

    8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务...

    spring chm文档

    8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务...

Global site tag (gtag.js) - Google Analytics