写程序的时候,有时可能遇到这样的情况。比如我们开发了一个数据处理模块,被处理的数据需要调用其他模块(由其他团队开发,或者是第三方提供,总之测试的责任不在你),从数据库或者文件或者通过网络从其他进程中获取。为了对该数据处理模块进行单元测试,我们通常得相应的配置起一个数据库或者文件系统,甚至是相关进程,以求正常的得到数据,但这样做的代价往往较大。
这里想讨论一种我以前曾经使用过的简化单元测试的思路。通过接口来封装对外部模块的调用,在单元测试时,用调试实现代替外部实现。受myworkfirst指点,又google了一下,才知道这是单元测试里早已成熟的“测试桩”。但我仍然想把我的实践和大家分享一下。
我们用一个简单的例子来说明。比如我实现了一个SystemTimeSynchronizer类,周期性的查询NTP标准时间,和本地系统时间进行比较。
/**shannon.demo is the package for the demonstration, in which,
* there's all the codes of unit test target module.
*/
package shannon.demo;
import thirdparty.any.NtpClock;
/**
* <code>SystemTimeSynchronizer</code> is our unit test target,
* which acts as if calibrating the system time firmly in
* compliance with the standard time.
* @author Shannon Qian
*/
public class SystemTimeSynchronizer {
/**Compares the local system time with the standard time.
* @return - 1 if system time is ahead of standard time,
* 0 if it's on standard time and -1 if it's behind standard
* time.
*/
public int syncTime() {
long currentTime = new NtpClock().getTime();
long interval = System.currentTimeMillis()-currentTime;
if(interval == 0) {
return 0;
} else if(interval > 0) {
return 1;
} else {
return -1;
}
}
}
SystemTimeSynchronizer#syncTime()调用的NtpClock类,属于外部模块。NtpClock#getTime()在这里只是一个示意,说明在没有预设NTP服务器的情况下,它将抛出异常(这和我们在单元测试时实际遇到的情况类似)。但是请你想象其内部实现通过访问预设的NTP服务器获取标准时间。要让NtpClock类正常的运行起来,需要一个NTP服务器,并事先进行比较复杂的设置。
/**package thirdparty.any plays the role to contain all the codes
* as if from thrid party.
*/
package thirdparty.any;
/**
* <code>NtpClock</code> is a demenstrating class for this unit test firewall
* example. it acts as if a third-party-provided adaptor with access to the
* NTP server.
* @author Shannon Qian
*/
public class NtpClock {
/**Returns the standard time from NTP server.
* @return - the standard time from NTP server
* @throws IllegalStateException - if there's no NTP server available.
*/
public long getTime() {
//if there's no NTP server available.
throw new IllegalStateException("NTP server is not ready.");
}
}
在不配置NTP服务器的情况下,单元测试肯定会因为异常抛出而中断。为了避免麻烦,我们首先想到的是如果不调用NtpClock就好了。但如果不调用,就无法获取标准时间。这样我们只能另外造一个类,在单元测试时替代NtpClock,能够方便的提供标准时间。新的问题是SystemTimeSynchronizer需要知道在不同时机调用不同的对象-在单元测试时,调用我们自定义的类,而在正常运行时仍然调用NtpClock.
(未完待续,代码太多了,可以到我的博客里看,或者下载zip文件)
分享到:
- 2009-06-11 14:17
- 浏览 2477
- 评论(3)
- 论坛回复 / 浏览 (3 / 2734)
- 查看更多
相关推荐
在V模型开发中,Tessy主要应用在单元测试和集成测试阶段。单元测试通过运行代码检测出函数中错误,比如算法错误、接口问题等;集成测试则在单元测试的基础上验证单元之间接口的正确性。基于越早发现bug开发成本越低...
测试桩HTTP测试桩HTTP 测试桩HTTP 测试桩HTTP
go语言测试桩,用于模拟接口测试,也可做性能测试桩,哈哈
第1章 单元测试的基本知识 3 第2章 第一个单元测试 21 第ii部分 核 心 技 术 第3章 使用桩对象解除依赖 49 第4章 用模拟对象做交互测试 83 第5章 隔离(模拟对象)框架 101 第iii部分 测试的代码 第6章 测试...
新利用驱动程序和桩程序进行单元测试
1、配置测试环境:确认使用VC6.0开发环境 2、加载被测软件源代码Testrian.c 3、启动Testbed的单元测试模块(使用Unit Test only) 4、测试执行前准备:建立Sequence,配置Code Coverage,配置Test Environment。 5、...
Counter单元测试用例以及桩设计的简单描述
接口测试 桩 MOCK 接口返回文件配置json文件即可
用java写的socket服务器测试桩,运行在window电脑上
SMGP 测试桩(测试专用)用来接收消息,并且可以实时跟踪
表格驱动,无须编写测试驱动和桩代码;支持快速完成航空标准(MC/DC);程序行为可视,支持快速编写复杂代码,提升开发效率。此版本安装后可测试自带的示例,用以学习单元测试技术;申请免费试用license后,可测试...
一般使用python做接口自动化,ui自动化测试,而单元测试的资料很少,本文主要介绍python单元测试框架,教你如何搭建,执行,分析。
C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要您编写一个测试用例、测试驱动程序或桩调用。C++Test能够自动测试代码构造(白盒测试)、测试代码的功能性(黑盒测试)和维护代码的完整...
智能测试桩的结构说明以及安装和维护的注意事项.doc
阴极保护测试桩安装与测量方法技术.doc
单元测试的方法和工具使用, 5.1 什么是单元测试 5.2 单元测试的目标和任务 5.3 静态测试 5.4 驱动程序和桩程序 5.5 调试与评估 5.6 单元测试的管理 5.7 单元测试工具
充电桩和BMS通信报文解析软件,可用,可自己添加功能
包含了测试的完整框架,有测试文件,驱动文件,桩函数文件,Makefile,与测试源代码。对于初次接触单元测试的人来说可以说是一个简单易懂的学习例子。
A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括( )。A、 白盒测试 B、 功能测试C、 静态测试 D、 以上都不是 3、( )的目的是对最终软件系统进行全面的测试,确保最终软件...
stub测试桩函数库