`
shannon977
  • 浏览: 20183 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

谈谈单元测试中的测试桩实践 (1)

阅读更多

写程序的时候,有时可能遇到这样的情况。比如我们开发了一个数据处理模块,被处理的数据需要调用其他模块(由其他团队开发,或者是第三方提供,总之测试的责任不在你),从数据库或者文件或者通过网络从其他进程中获取。为了对该数据处理模块进行单元测试,我们通常得相应的配置起一个数据库或者文件系统,甚至是相关进程,以求正常的得到数据,但这样做的代价往往较大。

这里想讨论一种我以前曾经使用过的简化单元测试的思路。通过接口来封装对外部模块的调用,在单元测试时,用调试实现代替外部实现。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文件)

分享到:
评论
3 楼 shannon977 2009-06-11  
我觉得我写得还可以......虽然被集体评为新手帖,让我有些气馁!不过没关系,我觉得不把自己的想法贴出来让大家看,就不能知道自己的浅薄,更不能学到很多有用的东西。
我想把我这几天写的,都贴到入门讨论版来。
2 楼 shannon977 2009-06-11  
谢谢,受教了!我去改一下。

在这里发贴收获不小的。
1 楼 myworkfirst 2009-06-11  
    面对这种情况,一般都会写一个简的测试桩,就解决测试功能的问题

相关推荐

    新利用驱动程序和桩程序进行单元测试

    总结来说,驱动程序和桩程序是单元测试中不可或缺的组成部分,它们帮助我们创建可重复、可控的测试环境,确保代码的质量和稳定性。在Java软件测试中,熟练运用这些工具和策略,可以大大提高开发效率和软件的可靠性。

    用java写的socket服务器测试桩

    测试桩的作用是在实际服务不可用时,模拟其行为,以便进行单元测试或集成测试。Java Socket服务器测试桩应具备以下特性: 1. 可配置性:允许设置不同的响应策略,如返回固定数据、模拟延迟等。 2. 可扩展性:方便...

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

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

    jetty测试桩

    标题中的"jetty测试桩"指的是使用Jetty服务器作为测试环境中的模拟服务,它能够帮助开发者在实际接口未开发或不可用时进行测试。Jetty是一个轻量级、高性能的开源HTTP服务器和Servlet容器,常用于快速搭建测试环境...

    测试桩HTTP

    测试桩HTTP测试桩HTTP 测试桩HTTP 测试桩HTTP

    接口测试的go测试桩

    go语言测试桩,用于模拟接口测试,也可做性能测试桩,哈哈

    SMGP 测试桩(测试专用)

    在IT领域,测试桩(Test Stub)是一种软件组件,它模拟了系统中的某个部分,通常是为了在孤立环境下测试其他组件。在这个场景中,"SMGP测试桩"是专为SMGP协议设计的测试工具,用于接收消息并实现实时跟踪功能。SMGP...

    基于RTRT单元测试

    **单元测试**是在软件开发过程中的一项基础性测试活动,它的主要目的是确保软件中的各个最小可测试单元(通常指一个单独的功能模块)能够按照预期正确运行。这种测试方式有助于尽早发现并修复软件缺陷,提高软件质量...

    Testbed单元测试指导书(补充版).docx

    1. 安装:本部分详细介绍了Testbed单元测试的安装过程,包括设置IE安全选项、安装Testbed单元测试软件、安装相应的编译环境等步骤。 1.1 设置IE安全选项:为确保Testbed单元测试软件的正确安装,需要在IE浏览器中...

    单元测试十大难题及解决思路

    然而,在实践中,单元测试常常遇到各种难题,以下是十大难题及解决思路: 一、代码的可测性 单元测试的难题之一是代码的可测性问题。代码通常各部分都是互相关联的,但单元测试却是需要把代码单元跟别的代码分开...

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

    在进行单元测试时,需要将桩函数返回值映射到测试用例中,以便于Testbed工具正确地执行测试用例。桩函数返回值是指软件中的桩函数返回值,需要正确地映射,以便于软件正确地执行。 #### 3.3.7 运行测试用例 在进行...

    单元测试的流程详细介绍

    单元测试是一种软件开发过程中的重要环节,用于验证代码的各个独立单元是否按预期工作。它主要关注单个函数、方法或类的行为,确保它们在独立环境中正确执行其职责。以下是对单元测试流程的详细说明: 1. **理解...

    .NET单元测试艺术 中文版 PDF版

    第1章 单元测试的基本知识 3 第2章 第一个单元测试 21 第ii部分 核 心 技 术 第3章 使用桩对象解除依赖 49 第4章 用模拟对象做交互测试 83 第5章 隔离(模拟对象)框架 101 第iii部分 测试的代码 第6章 测试...

Global site tag (gtag.js) - Google Analytics