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