`
ihuashao
  • 浏览: 4546522 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java单元测试的两点注意事项

阅读更多

介绍
开发人员编写单元测试来检查他们的代码。单元测试不同于集成测试和验收测试。集成测试保证各组件
的协同工作,验收测试保证程序满足客户期望。单元测试只是对代码的一个单元进行测试。在Java中,
一个单元通常指代一个类。
单元测试要求全自动,无人工交互,非成功既失败。所以,当你运行代码,再检查他的输出是否正确,
这个过程并不是单元测试。单元测试要求写一些测试来驱动你的代码,而你可以查看工作的结果。
一直以来,单元测试一直停留在嘴上说说的境地,不过现在它终于成为Java开发者的专业工具。成为一个大师级别的Java程序员还不足够。现在你要懂得怎样正确的测试你的代码,这样可以引领你写出高质量的代码而且具有高效率,低维护成本。
在本章中,主要讨论两点,当Java程序员作单元测试时,一直被这这两点困扰。是否要以便利于测试的方式设计系统,怎样测试不确定性的代码。

不要为了测试而牺牲设计
单元测试和它要测试系统之间的关系是一个很常见的问题.所以先讨论这一点。当你写单元测试的时候,有时会被迫改变代码以适应测试。尤其是当你想测试一个私有方法或属性的时候。如果你把私有方法改为公有方法纯粹是出于测试的目的,那么不要这样做。测试意味着提升代码的质量,而不是降低。
话是这么说,有时候设计系统的时候使其便于测试还是很必要的。如果你要加入一个设计支持测试,一定要保证它会增强系统的整体质量。如果不是这样,你只是为了测试才这么设计,那么我必须要强调,这很不好。
例如,你有一个连接数据库的系统。如果你的系统连接测试数据库和正是开发数据库一样便利,那么这样很好。
如果你把它设计成允许数据库可配置,这样方便了测试。同时你也加强了设计的质量,因为这样你的系统就更具有灵活性(你可以不用改变代码就连接到产品数据库上)。这种设计使系统和测试都受益,所以是个好决定。
你的类只能通过工厂方法实例化。你需要测试一个类的对象,但出于某种原因,你无法调用工厂。它可能需要一些资源作为参数传入,但是你的测试环境中没有。那么是否能够将该类的默认构造方法改为公有,这样就可以在测试中实例化该类。这样做消减了系统设计的质量,允许任何人都可以访问这个构造方法。在这种情况下,程序员需要提供必需的资源,从工厂中实例化该类(可以通过使用Mock Object)。
现在,讨论完这个问题,我们检查一些常见测试问题的解决方案。第一个问题是怎样具有测试不确定性的代码。

为不确定性的代码编写具有统计性的测试
有的代码具有不确定性。也就是说,影响一个方法的具体结果的因素并不仅限于此方法内的代码。System.currentTimeMillis()的返回值就是一个最简单的例子。
确切的结果不是取决于代码而是底层的硬件。它返回的值是基于系统时钟,每次代码运行的时候都会有不同的返回结果。
另一个例子是测试消息从服务端传送到浏览器的耗时。要构建一个可以预测的模型需要太多的变数。在细粒度层次上,网络是不确定的甚至是混乱的。然而,
在细粒度层次上不可预测并不表明全面行为不可预测。如果你把大量的细粒结果收集起来,你可以得到对期望值得有效预测。
例如,你的需求是90%的网络业务要在1/100秒钟完成。简单的方法是你可以反复运行代码,保存通过和失败的数目。如果90%失败了,那么测试液就失败了。
如下的代码要确保业务的性能在一个合理的范围内:
private int doPerformanceTest(int numberOfRuns, int
requiredTimeInMilliseconds) {
int passed = 0;
Fragment fragment = new Fragment();

for(int i = 0; i < numberOfRuns; i++) {
long startTime = System.currentTimeMillis();
fragment.doTransaction();
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
if(runTime < requiredTimeInMilliseconds) passed++;
}
return passed;
}

使用这个方法的测试应该用断言来负责验证:
public void testPerformanceStatistics () {
double percentageRequired = 90.0;
int numberOfRuns = 1000;
int passed = doPerformanceTest(numberOfRuns, 100);
double percentagePassed = passed / numberOfRuns;
assertTrue("percentagePassed = " + percentagePassed,
percentagePassed >= percentageRequired);
}
这种可统计的测试技术对于定位很多问题都很有用。尤其是测试那些结果基于日期,时间或者随机数的方法。测试性能和代码的非确定性属性是也是很有价值的。


单元测试对于程序员是很重要的工具。Java方面有很多的工具帮助进行测试用例的开发。在你的项目中,都会需要这些工具。编写单元测试相当容易,而且很有效。也不会花费太多的时间来运行。

分享到:
评论

相关推荐

    peerchat:具有Java加密功能的点对点多聊天应用程序

    java PeerChatClient in terminal (启动的客户端) 再次输入java PeerChatClient ,以便现在有两个客户端连接到服务器##注意事项在运行客户端之前,请确保PeerChatServer已启动。 该软件仅在Ubuntu / Linux中经过...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    4锁的优化及注意事项 4.1有助于提高锁性能的几点建议 4.2java虚拟机对锁优化所做的努力 4.3人手一支笔:threadlocal 4.4无锁 4.5有关死锁的问题 4.2Java虚拟机对锁优化所做的努力 4.3人手一支笔:ThreadLocal 4.4...

    程序员简历模板+Java+本科毕业生

    下面我提几点写建立是要注意的事项,希望对大家有所帮助。 1简历模板要简洁美观,字体和样式要统一,避免过多的花哨和华丽1。可以选择使用Word版、在线版、Markdown版或LaTeX版等格式,根据个人喜好和投递渠道选择...

    JSP 在线学习系统myeclipse开发mysql数据库web结构java编程

    三、注意事项 1、管理员账号:admin密码:admin 数据库配置文件DBO.java 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为mysql5.0,使用java语言开发。 3、数据库文件名是jspolstudy.sql ,系统名称olstudy 4、...

    springmybatis

    1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用如下方式建立,鼠标右键点击 JavaResource. 2. 设置mybatis 配置文件:Configuration.xml, 在src_user目录下建立此文件,内容如下: 程序代码 程序...

    JSTL详细标签库介绍

    能够让系统在出现异常的情况下恢复过来的程序使用异常处理情况:异常诊断与异常处理不在同一个位置下时使用异常处理程序(若用户一直通过键盘与程序通话,那么就不能使用处理键盘输入处理)使用异常的注意事项:&lt;BR&gt;...

    分辨率修改工具

    软件使用的小技巧和注意事项:ChMobileKey无法修改JM改过的文件或者已经支持触屏的文件,但是JM可以修改ChMobileKey改过的文件,所以,有些使用ChMobileKey修改但无法使用的游戏,可以试试再用JM转换,没准就能运行...

    blake3:具有AVX2和SSE4.1加速功能的BLAKE3的Pure Go实现

    注意事项 该库做出的设计决策与围绕内部缓冲的上游Rust板条箱不同。 特别是,由于它不针对嵌入式系统空间,也不支持多线程,因此选择执行自己的内部缓冲。 这意味着用户不必担心会提供足够大的缓冲区来获得最佳性能...

    精通正则表达式~~~

    Java测试... 235 VB.NET测试... 237 Ruby测试... 238 Python测试... 238 Tcl测试... 239 常见优化措施... 240 有得必有失... 240 优化各有不同... 241 正则表达式的应用原理... 241 应用之前的优化措施......

    个人网站与博客,基于SpringBoot、React、NextJS(SSR) 的前后端分离网站+源代码+文档说明

    ## 注意事项 后端的主键ID一般为 Long 类型,在 Java 中是 64位整数型,而在 JavaScript 中数字是 64位浮点数,这就造成了精度不一致! 所以,在 JavaScript 中要使用字符串来处理后端的 Long 类型数字,否则会出现...

    ergodox-vim-ubuntu:针对Vim和Ubuntu使用进行了优化的Ergodox EZ布局

    时间(天) 打字速度(wpm) 相对表现+1 8 18% +7 22 49% +14 35 78% +28 47 105% +56 58 129%注意事项这种布局是为Vim用户设计的,还包含一些映射,以便于我经常使用的Ubuntu工作区轻松导航。 我主要使用Java...

    asp.net知识库

    .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库 SQL Server数据库安全规划全攻略 .net通用数据库访问组件SQL Artisan应用简介1 在Framework1.0下...

    精通ANDROID 3(中文版)1/2

    14.5.6 从两个位置控制唤醒锁  14.5.7 长期运行的服务的实现  14.5.8 测试长期运行的服务  14.6 代码编译说明  14.6.1 从ZIP文件创建项目  14.6.2 通过代码清单创建项目  14.7 参考资料  14.8 小结 ...

    精通Android 3 (中文版)2/2

    14.5.6 从两个位置控制唤醒锁  14.5.7 长期运行的服务的实现  14.5.8 测试长期运行的服务  14.6 代码编译说明  14.6.1 从ZIP文件创建项目  14.6.2 通过代码清单创建项目  14.7 参考资料  14.8 小结 ...

    EditPlus 2整理信箱的工具

    【6】 软件技巧——键盘记录的注意事项 【7】 软件技巧——关闭文档标签的便捷方法 【8】 软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 【9】 软件技巧——提示找不到语法文件的解决办法 【10...

    Editplus 3[1].0

    【6】 软件技巧——键盘记录的注意事项 【7】 软件技巧——关闭文档标签的便捷方法 【8】 软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 【9】 软件技巧——提示找不到语法文件的解决办法 【10...

    editplus 代码编辑器html c++ jsp css

    【6】 软件技巧——键盘记录的注意事项 【7】 软件技巧——关闭文档标签的便捷方法 【8】 软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 【9】 软件技巧——提示找不到语法文件的解决办法 【10】...

    PLSQLDeveloper下载

    PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL ...

    网管教程 从入门到精通软件篇.txt

    Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    首先有两点是需要肯定的:  第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会;  第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高...

Global site tag (gtag.js) - Google Analytics