`

为啥写单元测试和工具

阅读更多

原写于2012-03-29

 

题记:新同学分享了测试驱动,第一次感觉测试驱动离自己那么近。因此开始尝试。记下自己的一小点想法。

 

1.一切从测试开始

不管在写复杂的代码,还是简单的代码,一切从测试开始。练习成自己编码的习惯。

自己的做法只能算是伪测试驱动,因为还是有详细的设计,但遵循此做法,对于需求的变更、代码存在的bug,导致编码修改的时候,心里是踏实的。

目前自己还不能感觉到对后期的维护会带来什么样的结果?

推荐《测试驱动开始》。

 

2.工具

junitmockitoemmafindbug

junit,这是大家熟知的,学到新点:a。参数化测试  bprivate方法测试(反射) crunwith & Unite,组织测试单元(实际工作中未用到)

mockito,轻量的mock工具。测试中很麻烦的一个问题是:环境依赖,比如:web中依赖容器生成request对象。mockito很好的解决大部分问题(static类与private方法未能解决)。

emma,代码覆盖率检查工具,eclipse插件。效果:红色=未测试;黄色=测试不完整,只是部分逻辑;绿色=测试完整。(注意:不能绝对的追求覆盖率,一定要记住2/8原则,将主要的精力关注主要的逻辑)。

findbug,帮助排查低级bug工具

 

3.习惯

a.代码结构,3部分:prepare(包含mock)准备数据、action执行、assert验证

b.方法命名:被测试方法名$测试目的,如:run$ParameterIsNull

c.测试A类,有两个方法run()prepare()run方法调用prepare,且prepare执行非常耗时间。想要单独测试run()方法 ?B extends A,复写prepare方法(等于是mock prepare方法),单独的测试run方法逻辑

d。持续写测试代码的习惯

 

 

-------------------------------------- 一年之后,自己整理另外一点关于单元测试 ---------------------------------------

 

 

说起单元测试mock问题,之前用过powermock框架,绝对是个利器。请允许我先唠叨3个问题:

 

1. 为什么要写单元测试

必须要承认,写单元测试会带来更多工作量。但其带来的好处也显而易见,自己体会有2点:a.假设你写的代码中有bug,若在单元测试环节发现只需1分钟可解决,若在功能测试发现可能需要5分钟,若在测试过程中发现可能需要1小时。帮助整体效率的提升;b.一个系统不可能永远都是一个人在维护,必然会有其他人参与。如何保证代码不会被别人改错(如:abcd依赖,本次日常需要改动a,如何保证a正确性;或重构),单元测试是其中一个很好的关卡。

 

2. 遵循什么原则

a) 2/8原则,不要盲目追求覆盖率:

保证覆盖核心业务逻辑。(前团队经验:WEB应用40%左右,纯服务应用不低于50%

b) 不要依赖环境

hsf服务,保证任何时候都可以运行成功

c) 粒度要小,自动校验

保证单个方法单个分支粒度,单元测试也是代码也需要维护,写的糟糕的单元测试更可怕;不能自动校验,等于没写

d) 不断运行,才能更好发挥其作用

单元测试运行要尽可能快;至少保证trunk任何一次提交都会运行单元测试

 

3. 如果你发现单元测试很难写(非技术原因),这时可考虑代码自身是否存在问题(如:单个方法包含的逻辑是否太多,能否拆分公用)

 

上面也都是我的一些yy想法,有任何问题,欢迎大家拍砖。

 

 

1. 关于mockito/jmock/esaymock等,选择哪一个?推荐mockito,原因参见http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java

 

2. 对习惯使用mockito同学,每每遇到private methodstatic method … 看着http://code.google.com/p/mockito/wiki/FAQ#What_are_the_limitations_of_Mockito,该咋办呢

powermock统统可以解决以上常见问题,且保持mockito api风格、使用习惯

 

3. 关于powermock 

详见:http://code.google.com/p/powermock/,推荐入门阅读如下部分

     - document 

        - getting started

        - motavition

     - mockito extends

        - mockito 1.8+ useage

     - faq

 

 

附件:https://gist.github.com/4110984 ,实际开发中使用到的powermock的一些特性,简化后的例子(仅为说明powermock api使用)。主要包括

 

- 修改私有域 (PrivateFieldOrMethodTest)

- 私有方法

    - 测试私有方法 (PrivateFieldOrMethodTest)

    - Verify (PrivateFieldOrMethodTest)

- Mock类部分方法,如:public a method调用private b method (MockPartialMethodTest)

- 静态方法(mockStaticMethodAndVerifyStaticMethod)

    - Mock

    - 抛出异常

    - Verify

- Mock Java core library,如:Thread (MockJavaCoreLibraryTest)

- Mock 构造器 (MockConstructionTest)

 

注:仅当遇到如上的疑难杂症时,推荐使用powermock;普通的场景,推荐使用mockito。且它们之间不会有任何冲突。

 

 

分享到:
评论

相关推荐

    JUnit单元测试原则 单元测试工具

    ### JUnit单元测试原则与工具详解 #### 一、单元测试概述 单元测试(Unit Testing)是一种软件测试方法,主要用于验证程序中的最小可测试单元(通常是单个函数或方法)是否按预期工作。对于Java这样的面向对象语言来...

    单元测试工具 C++单元测试工具 静态代码分析 代码动态测试

    C++单元测试工具 Parasoft C++ Test 简介 Parasoft C++ Test 是 Parasoft 公司... Parasoft C++ Test 是一个功能强大且实用的单元测试工具,对 C/C++源代码进行自动化单元测试,可以帮助我们提高代码的质量和可靠性。

    单元测试工具,模块测试工具

    总的来说,单元测试和模块测试工具是软件开发中不可或缺的,它们确保了代码的可靠性和可维护性。了解如何有效地使用这些工具,以及它们背后的关键概念,是提升软件质量的关键。通过持续集成和自动化测试,开发者能够...

    Testbed工具手册—单元测试方法V1.0.doc

    Testbed工具手册—单元测试方法V1.0.doc ...Testbed工具手册是一种重要的软件测试工具,旨在帮助开发者和测试工程师对软件进行单元测试。通过使用Testbed工具,可以快速地对软件进行测试,提高软件的质量和可靠性。

    单元测试架构工具包与执行跟踪工具包后续资源包.zip

    《单元测试架构工具包与执行跟踪工具包后续资源包》是一个专为LabVIEW开发者设计的补充资源集合,它旨在帮助用户深入理解和应用LabVIEW中的单元测试框架和执行跟踪工具。这个压缩包包含了与相关视频教程配套的例程和...

    软件测试小论文----单元测试及测试工具的研究与应用

    软件测试小论文----单元测试及测试工具的研究与应用 软件测试是软件生命周期中...单元测试是软件测试中的基础和关键阶段,正确熟练的使用单元测试工具,将极大地提高单元测试工作的效率和质量,提高产品的质量等级。

    单元测试工具C++Test简介

    Test简介单元测试工具C++Test简介软件测试C++Test是Parasoft公司出品的一个针对C/C++源代码进行自动化单元测试的工具。它可以对源代码进行三种测试:白盒测试、黑盒测试以及回归功测试。白盒测试C++Test对C/C++源...

    单元测试架构工具包与执行跟踪工具包.zip

    本资源“单元测试架构工具包与执行跟踪工具包.zip”提供了用于创建、管理和执行单元测试的工具,特别针对LabVIEW环境。LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是美国国家仪器公司(NI)...

    Tessy单元测试提高软件质量

    2. 单元测试的执行:使用Tessy工具或其他单元测试工具执行单元测试。 3. 单元测试的结果分析:分析单元测试的结果,检测软件中的错误和缺陷。 4. 单元测试的修复:根据单元测试的结果,修复软件中的错误和缺陷。 ...

    Tessy—嵌入式软件单元测试/集成测试工具

    在V模型开发中,Tessy主要应用在单元测试和集成测试阶段。单元测试通过运行代码检测出函数中错误,比如算法错误、接口问题等;集成测试则在单元测试的基础上验证单元之间接口的正确性。基于越早发现bug开发成本越低...

    软件单元测试报告.doc

    软件单元测试报告是软件开发过程中的一种重要文档,它记录了软件单元测试的结果和过程。下面是该报告的知识点总结: 一、软件单元测试报告的组成部分 软件单元测试报告通常由以下几个部分组成: 1. 报告标题页:...

    单元静态测试工具教学

    在"实验5 单元静态测试工具的使用"中,你可能会学习到如何配置和运行上述工具,理解其输出报告,以及如何根据报告来改进代码。实践中,你将学习到如何创建测试计划,定义测试用例,跟踪测试结果,并将这些工具整合到...

    C++单元测试、压力测试、快速测试工具

    总结起来,C++的单元测试、压力测试和快速测试工具对于保证软件质量至关重要。单元测试确保了代码的功能正确性,压力测试揭示了系统的性能边界,而快速测试则加速了开发迭代。开发者应当熟练掌握这些工具和技术,以...

    JavaScript单元测试工具Venus.zip

    通常,你会用一些库比如 Mocha 或 Jasmine,写一个单元测试,这些库可以让你定义测试用例,并提供 API 来编写判断。我们通过创建一个工具,可以让你更轻松地与现有的库一起工作。一下是 Venus 的主要好处:在你的...

    JUnit帮助文档 软件测试 测试工具 单元测试框架

    JUnit 帮助文档 软件测试 测试工具 单元测试框架 测试人员使用工具

    Nunit单元测试工具

    NUnit是一款开源的、广泛用于.NET框架的单元测试工具,它为.NET开发者提供了方便、强大的测试框架,以确保代码的质量和稳定性。NUnit不仅支持.NET Framework,还支持.NET Core和.NET Standard,这使得它在各种.NET...

Global site tag (gtag.js) - Google Analytics