介绍
开发人员编写单元测试来检查他们的代码。单元测试不同于集成测试和验收测试。集成测试保证各组件
的协同工作,验收测试保证程序满足客户期望。单元测试只是对代码的一个单元进行测试。在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方面有很多的工具帮助进行测试用例的开发。在你的项目中,都会需要这些工具。编写单元测试相当容易,而且很有效。也不会花费太多的时间来运行。
分享到:
相关推荐
### Java个性测试知识点总结 #### 一、个性测试概述 - **定义**: 个性测试是一种评估个体性格特征、兴趣偏好及行为模式的心理测量工具。它通过一系列精心设计的问题来了解被测试者的个性特点。 - **目的**: 主要...
10. **README.txt**:这个文件可能包含项目的说明、安装步骤、使用指南或开发者注意事项,是理解项目的重要文档。 11. **test**:这可能是一个测试目录,包含了测试类或者测试用例,用于验证代码的正确性,通常使用...
本文档详细介绍了Java程序测试环境的配置方法,包括Rational软件的安装注意事项、JDK版本的选择与环境变量的配置、Rational PurifyPlus工具的使用技巧等。通过遵循上述步骤,可以有效地构建一个稳定、高效的Java程序...
在项目单元测试方案中,"说明"部分通常用于提供额外的测试指南、注意事项或特殊情况的处理方式,以确保所有相关人员对测试流程有清晰的理解。 以上知识点构成了一个全面的项目单元测试方案,它不仅关注代码的功能...
### 注意事项 - 防火墙设置:确保客户端的防火墙允许UDP通信。 - NAT类型:不同的NAT类型对打洞的支持程度不同,有些严格的NAT可能无法打洞。 - 稳定性:由于UDP的不可靠性,打洞后的连接可能会不稳定,需要适当机制...
### Java基础知识点详解 #### 1. JDK 1.6.0_06 软件的安装 - **安装位置**: 按照题目要求,JDK 1.6.0_06 应安装在 `C:\Java` 目录下。 - **安装步骤**: 1. 下载 JDK 1.6.0_06 的安装包。 2. 运行安装程序,选择...
**JMeter性能测试几点注意** 在进行JMeter性能测试时,有一些关键的注意事项需要牢记,以确保测试的有效性和系统的稳定性。以下是对标题和描述中提到的知识点的详细说明: 1. **内存设置与磁盘空间**: JMeter在...
- **注意事项**:转换的前提是数据类型兼容,且`boolean`类型不能与其他类型相互转换。 3. **Java变量与常量**: - **变量**:用于存储数据值,具有数据类型和名称。 - **常量**:一旦被赋值就不能更改的变量。...
### Java中关于变量的练习题及答案解析 #### 基础知识点概述 在Java编程语言中,变量是用来存储数据的容器。理解变量的基本概念及其...通过这些练习,可以帮助初学者更好地掌握Java变量的基本使用方法及其注意事项。
"Java代码"和"Java测试"是Java开发过程中的两个关键环节,它们构成了软件生命周期中的核心部分。在这个主题中,我们将深入探讨Java编程的基础、测试的重要性以及如何有效地进行Java测试。 Java代码编写涉及语法、...
《Java实现的学生信息管理系统详解》 学生信息管理系统是IT领域常见的教学与实践项目,它能够帮助学校...通过这个项目,开发者不仅可以提升技能,也能理解实际项目开发中的流程和注意事项,为今后的工作打下坚实基础。
#### 实验注意事项 - 输入程序时应严格注意大小写。 - 注意记录编译调试过程中的出错信息和改正结果。 - 爱护机器,遵守规章制度。 #### 讨论、思考题 - 结合实际测试,总结测试用例的设计方法。 - 分析实际测试...
XXTEA(Extreme eXtended TEA...以上就是关于XXTEA Java实现的一些基本知识点,包括算法原理、Java实现的步骤、可能的代码结构以及使用时的注意事项。理解这些内容可以帮助开发者在Java项目中有效地应用XXTEA加密算法。
- **注意事项**: 提供实验过程中需要注意的关键事项。 **3. 报告批改与评价** - **批改要求**: 教师需使用红色笔批改,采用百分制评分。 - **成绩评价**: 根据实验表现和报告质量给出综合评价。 通过以上的分析...
**注意事项:** 1. **重写规则:** - 返回值和参数类型必须一致。 - 访问权限不得更低。 - 捕获的异常不能更广泛。 - 不能重写`final`修饰的方法。 - 不能重写`private`方法。 2. **重载规则:** - 参数列表...
书中会介绍它们的用法和注意事项。 4. **访问控制与封装**:Java提供了public、protected、default(包访问)和private四种访问修饰符,用于控制成员的可见性,实现封装。 5. **继承与多态**:Java支持单一继承,...
IBM测试框架主要围绕着自动化测试技术展开,包括自动化测试的基本原理、测试框架的设计、扩展性以及实施过程中的注意事项等几个方面。以下是对这些核心内容的深入解析。 ### 自动化测试的工作原理 自动化测试的...
本文将详细解析在Java中使用JSON传递字符串时需要注意的一些关键点,这些注意事项可以帮助避免不必要的错误,提高代码的稳定性和可维护性。 一、JSON与字符串的关系 JSON(JavaScript Object Notation)是一种基于...
"使用更新说明.txt"可能是关于新版本的改进和注意事项,对于用户来说,及时了解这些信息能更好地利用工具。 "使用更新说明.txt"可能包含以下内容: - 更新日志:列出新版本增加的功能、修复的错误以及性能优化。 - ...
- Java源代码的编译过程及注意事项。 **详细解释:** Java程序的基本组成部分包括: - 类(Class):Java程序的基础单元,它由一系列属性和方法组成。 - 方法(Method):类中的功能函数,用于执行特定任务。 - 主...