PicoContainer(Ioc容器)在测试用例中的应用(一)

PicoContainer是一个轻量级Ioc(Inversion of Control)容器, 最重要的特征是它的尺寸,它没有拦截器、AOP 或相似类型的服务,但它具有完整的依赖注入容器。 PicoContainer 支持 Java 配置技术,而不支持
XML 配置技术,也就是说容器内各组件的依赖规则都是通过java程序来配置的。

为什么要使用ioc容器

话说第一天我们要完成一个数据库的读测试,读的行为分别为顺序和随机。按照传统的做法我们会写两个case分别实现顺序读和随机读过程,很简单我们一会就完成了。第二天我们需要完成一个写测试,同样有两个行为:顺序、随机。我们用同样的方法写了顺序写和随机写两个case。第三天我们要完成一个读写混合测试,老板要求顺序随机的行为都需要覆盖到,悲催得我们难道要把读写行为来个排列组合?现实就是这样,随着读写场景的越来越复杂我们发现我们把同样的准备数据、写入数据、读取数据、删除数据这个过程完成n遍。case越来越多越来越复杂,突然有一天开发把读写接口重构了=。=!……

显然,做为一个立志不做2青年的同学,我们有很多办法来避免这种情况的发生。其中就有我们的PicoContainer。下面笔者就一步一步介绍它是怎么来帮我们的做到的。

PicoContainer有什么用

Ioc的概念大家都很清楚,下面笔者用读写的这个实例来介绍下使用Ioc容器如何来构建我们的测试用例。

1、分析测试用例
回到上面那个场景,经过我们的分析发现不管是怎样的读写行为用例的要完成过程都是一样:准备环境、写入数据、读取数据、判断结果、清理环境。于是我们把这个过程抽象出来,先不要管他具体需要怎么的读写行为,先把过程完成了。

2、抽象接口
有了过程的抽象,我们发现很有必要创建两个接口Reader和Writer,有了这两个接口,我们就可以完成我们的case脚本。

public interface Reader {
  public void read();
}

public interface Writer {
  public void write();
}

public class TestWriteAndRead extends TestCase {
  protected Writer writer;
  protected Reader reader;
  public void setUp() {
    // 准备环境
  }

  public void test() {
    // 写入数据
    writer.write();
    // 读取数据
    reader.read();
    // 判断结果
  }

  public void tearDown() {
    // 清理环境
  }
}

3、实现接口
要想测试脚本能够运行,还必须有具体的读写行为。于是我们还需要实现Reader和Writer接口,于是我们完成了RandomRead和RandomWrite两个具体的读写类。

public class RandomReader implements Reader {
  public void read() { 
  // 随机读取数据 

public class RandomWriter implements Writer { 
  public void write() { 
  // 随机写入数据 

}

4、使用PicoContainer组装用例
有了读写测试过程,有了随机读写的实现,我们如何将这两者组合起来变成一个能够跑起来的用例呢?ok,我们的主角PicoContainer上场了。PicoContainer在这里的作用就像一个池子一样,我们把测试过程和测试过程中所需要使用的组件都放到这个池子里面,他们之间通过接口的实现关系自己来实现组装。于是我们可以在不同的池子中扔进去不同的组件,这些组件都可以跑在相同的测试过程中。下面我们利用PicoContainer的inject功能来实现用例。

在TestWriteAndRead类中添加PicoContainer

public class TestWriteAndRead extends TestCase {

  protected Writer writer; 
  protected Reader reader; 
  protected PicoContainer pico; 

  public void setUp() { 
    // 准备环境 
  } 

  public void test() { 
    // 写入数据 
    // 从容器中取出组件 
    writer = pico.getComponent(Writer.class);         
    writer.write(); 
     
    // 读取数据 
    reader = pico.getComponent(Reader.class); 
    reader.read(); 
     
    // 判断结果 
  } 

  public void tearDown() { 
    // 清理环境 
  } 
}

5、建立随机读写的测试脚本

public class TestRandomWriteAndRead extends TestWriteAndRead {
  public TestRandomWriteAndRead() { 
    // 建立PicoContainer容器并放入组件 
    pico = new DefaultPicoContainer(); 
    pico.addComponent(RandomReader.class); 
    pico.addComponent(RandomWriter.class); 
  } 
}

到这里用例就完成了,有了PicoContainer编写测试用例就像搭积木一样,不管有多少的读写行为我们只需要实现它并在用例中对他们进行组装就可以了。被测程序的变更也仅仅只影响到具体的实现类,维护脚本变得非常方便。

PicoContainer还有什么功能

PicoContainer提供了我们最常用依赖注入功能,比如构造函数注入、annotation注入等等,还提供了容器内类的生命周期管理,基本涵盖和满足了测试用例编写的需要。下一篇文章笔者会仔细的介绍PicoContainer常用的功能,敬请期待。

来源:http://www.taobaotest.com/blogs/2019

时间: 2024-11-02 09:26:17

PicoContainer(Ioc容器)在测试用例中的应用(一)的相关文章

Spring源代码解析(二):IOC容器在web容器中的启动

以下引用自博客:http://jiwenke-spring.blogspot.com/ 上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的. 简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系.其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象.在这个上下 文的基础上,和web MV

《Spring技术内幕》——2.4节IoC容器的依赖注入

2.4 IoC容器的依赖注入 上面对IoC容器的初始化过程进行了详细的分析,这个初始化过程完成的主要工作是在IoC容器中建立BeanDefinition数据映射.在此过程中并没有看到IoC容器对Bean依赖关系进行注入,接下来分析一下IoC容器是怎样对Bean的依赖关系进行注入的. 假设当前IoC容器已经载入了用户定义的Bean信息,开始分析依赖注入的原理.首先,注意到依赖注入的过程是用户第一次向IoC容器索要Bean时触发的,当然也有例外,也就是我们可以在BeanDefinition信息中通过

《Spring技术内幕》——2.2节IoC容器系列的设计与实现:BeanFactory和ApplicationContext

2.2 IoC容器系列的设计与实现:BeanFactory和ApplicationContext在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能:另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在.应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配.有了这两种基本的容器系列,基本上可以满足用户对IoC容器使用的大部分需求了.下面

PicoContainer(Ioc容器)在测试用例中的应用(二)

本篇主要介绍PicoContainer的一些主要特性,很简单.很容易,但是很有效.喜欢英文的盆友也可以移步官方介绍,但是有些代码在新版本并不好使,还需要自己研究=.=!. 依赖注入 PicoContainer支持很多种注入方式,比如构造器注入.setter注入.annotation注入等等很多了.我们常用的annotation注入和构造器注入就可以了. 1.annotation注入方式 public class TestRandomWriteAndRead extends TestWriteAn

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

浅析Java的Spring框架中IOC容器容器的应用_java

Spring容器是Spring框架的核心.容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期.在Spring容器使用依赖注入(DI)来管理组成应用程序的组件.这些对象被称为Spring Beans. 容器获得其上的哪些对象进行实例化,配置和组装通过阅读提供的配置元数据的说明.配置元数据可以通过XML,Java注释或Java代码来表示.下面的图是Spring如何工作的高层次图. Spring IoC容器是利用Java的POJO类和配置元数据的产生完全配置和可执行的系统或

深入理解Java的Spring框架中的IOC容器_java

Spring IOC的原型spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将更

spring声明式事务,service层必须在ioc容器中声明?

问题描述 各位,小弟在学习spring+hibernate 声明式事务时,发现一个问题, 做了两种测试1. 建立一个普通的 java projectx.y.services 包下有 applicationContext.xml, DefaultFooService.java, 在applicationContext.xml中对DefaultFooService进行声明式事务,并注入 DefaultFooService运行后成功实现事务管理2. 建立一个 web dynamic project在a

【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

[spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>spring在解析xml标签,一旦不是以<bean>开头的元素,就会走org.springframework.beans.factory.xml.BeanDefinitionParserDelegate的parseCustomElement(Element ele)方法解析自定义的标签 ===>