技术开发 频道

谈谈单元测试中的测试桩实践

  【IT168 技术文档】

  写程序的时候,有时可能遇到这样的情况。比如我们开发了一个数据处理模块,被处理

  的数据需要调用其他模块(由其他团队开发,或者是第三方提供,总之测试的责任不在你),

  从数据库或者文件或者通过网络从其他进程中获取。为了对该数据处理模块进行单元测试,

  我们通常得相应的配置起一个数据库或者文件系统,甚至是相关进程,以求正常的得到数据,

  但这样做的代价往往较大。

  这里想讨论一种我以前曾经使用过的简化单元测试的思路。通过接口来封装对外部模块

  的调用,在单元测试时,用调试实现代替外部实现。受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;

  /**

  * SystemTimeSynchronizer 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;

  }

  http://www.51testing.com

  }

  }

  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;

  /**

  * NtpClock 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.");

  }

  }

0
相关文章