专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » junit测试:用 Jython 构建 JUnit 测试包 »正文

junit测试:用 Jython 构建 JUnit 测试包

来源: 发布时间:星期四, 2009年1月8日 浏览:12次 评论:0
  本文举例源代码或素材下载

  JUnit 测试框架被越来越多开发小组所共同使用归功于各种各样测试装具模块现在可以测试构成任何 Java 应用几乎每个组件事实上几乎整个 2级市场似乎都是用围绕 Junit 建立包括 Cactus、jfcUnit、XMLUnit、DbUnit 和 HttpUnit 这样装具模块都可以免费供开发人员用于测试应用随着系统复杂程度增加并且有这么多工具可供使用没有什么理由不依靠单元测试

  不过开发人员不仅仅是我们和用户交互以修复 bug 并确定需求我们参加会议并进行电话推销我们完成些(有时全部)质量保证功能既然有这么多责任希望尽可能自动化就是自然而然团队(Team)(除了其他事情外)会进行大量测试希望自动化区别开发过程人常常会对这领域进行详细研究

  自动化单元测试

  有许多种自动化所有项目测试用例定位和执行思路方法种解决方案是联合使用 Ant junit 任务和嵌入 file 任务这样就可以包括和排除特定目录中文件(基于文件名样式)种选择是使用 Eclipse 个功能它可以指定所有测试所在和执行目录种选择提供了对运行测试进行过滤灵活性(并且由于它是个纯粹无头(headless)Java 应用可以运行在几乎所有地方)种选择可以调试“动态”包是否可以结合这两种方式强大和灵活性?

  有了 Python 编程语言 Java 平台实现 -- Jython回答是响亮“可以!”(如果不熟悉 Jython应当在继续本文的前补充这方面知识更多信息请参阅后面 参考资料)利用 Jython 强大和优雅可以维护个定位文件系统、搜索匹配某种样式类和动态编译 JUnit TestSuite 类脚本这个 TestSuite 类像所有其他静态定义可以用喜爱调试容易地调试(在本文中使用例子假定使用是 Eclipse IDE不过我在这里描述技术不用做很多修改就可以用于大多数其他 IDE)

  在进行任何设计决定时必须对所做选择和决定影响进行权衡在这里为了得到调试动态生成测试包能力必须增加额外复杂性不过这种复杂性被 Jython 自身所减轻了:Jython 经过很好测试并得到很好支持并且是开放源代码而且,Python 越来越成为面向对象、平台独立编程事实上标准出于这两种原因采用 Jython 风险很少特别是它提供了这样好处:在创建和调试动态生成 JUnit TestSuite 类方面具有无可匹敌灵活性

  如果是否采用 Jython 是主要考虑那么即使不使用它也可以在解决原来问题方面有所进展不使用 Jython 可以用个 Java Property 文件存储组类、目录和包以在包中加入或者排除测试不过如果选择使用 Jython就可以利用整个 Python 语言和运行时来解决选择执行哪些测试问题Python 脚本比 Java Property 文件灵活得多它只受限于您想像力

  利用 Jython 和 Java 平台无缝集成可以创建静态定义、然而是动态构建 TestSuite 类有大量有关 JUnit 教程不过还是看下面这两行代码作为复习清单 1 是静态构建 TestSuite 类个例子(这个例子取自 JUnit: A Cook's Tour有关它和其他 JUnit 资源链接请参阅 参考资料):

  清单 1.静态定义 TestSuite

public Test suite {
   TestSuite( MoneyTest. );
}


  清单 1 表明 TestSuite 是由 Test 类类例子组成这个装具模块完全利用了这为了分析这个工具代码应从 参考资料中下载本文举例 JAR 文件这个文档包含两个文件:DynamicTestSuite.java 和 getalltests.py前者是个用 Phthon 脚本动态生成 TestSuite JUnit 测试装具模块后者是个搜索匹配特定样式文件 Python 脚本DynamicTestSuite.java 使用 getalltests.py 构建 TestSuite 可以修改 getalltests.py 以更好地适合自己项目需要

  了解测试装具模块

  代码是如何工作?首先指派 getalltests.py 获取组要执行 Test 类然后使用 Jython API 将这个列表从 Python 运行时环境中提取出来然后使用 Java Reflection API 构建在表示 Test 类名列表中 String 对象类例子最后用 JUnit API 将 Test 添加到 TestSuite 中这 4个库相互配合可以实现您目标:动态构建 TestSuite 可以像静态定义那样运行

  看下清单 2 中 JUnit suite 清单它是个公开 public TestSuite suite 思路方法签名 TestCase 由 JUnit 框架 suite 思路方法 getTestSuite getTestSuite getClassNamesViaJython 以获取组 String 对象其中每个对象表示个作为包部分 TestCase 类

  清单 2. 动态定义 TestSuite

/**
* @ TestSuite A test suite containing all our tests (as found by Python script)
*/
private TestSuite getTestSuite {
  TestSuite suite = TestSuite;
  // get Iterator to names we're going to add to our Suite
  Iterator testClassNames = getClassNamesViaJython.iterator;
  while( testClassNames.hasNext ) {
    String name = testClassNames.next.toString;
    try {
      // construct a Class object given the test name
      Class testClass = Class.forName( name );
      // add to our suite
      suite.addTestSuite( testClass );
      .out.prln( "Added: " + name );
    }
    catch( ClassNotFoundException e ) {
      StringBuffer warning = StringBuffer;
      warning.append( "Warning: Class '" ).append( name ).append( "' not found." );
      .out.prln( warning.toString );
    }
  }
   suite;
}


  在开始时要保证设置了正确系统属性在内部Jython 将使用 python.home 属性来定位它所需要文件最终会 getClassNamesViaJython 思路方法在这里面会有些奇妙事情发生如在清单 3 中将会看到

  清单 3. 从 Python 运行时提取 Java 对象

/**
* Get list of tests we're going to add to our suite
* @ List A List of String objects, each representing name of a TestCase
*/
private List getClassNamesViaJython {
  // run python script
  erpreter.execfile( getPathToScript );
  // extract out Python object named PYTHON_OBJECT_NAME
  PyObject allTestsAsPythonObject = erpreter.get( PYTHON_OBJECT_NAME );
  // convert the Python object to a String
  String allTests = (String) allTestsAsPythonObject.__tojava__( String. );
  // add all elements of .gif' /> to a List
  List testList = ArrayList;
  testList.addAll( Arrays.asList( allTests ) );
   testList;
}


  首先对 Python 文件进行判断然后从 Python 运行时提取出个 PyObject 这就是得到对象它包含将构成测试包所有测试用例类名(记住 -- PyObject 是 Python 对象 Java 运行时对应物)然后创建具体 List 并用 PyObject 填充它使用 __tojava__ 指示 PyObject 将其内容转换为个 Java String 最后将控制返回 getTestSuite 在这里装载 Jython 标识测试用例并将它们添加到组合包(composite)中

  在开发环境中安装测试装具模块

  现在对于测试装具模块如何工作已经有了很好认识可能迫不及待要自己试试它了您将需要完成以下步骤以配置 Eclipse 来运行这个装具模块(如果使用区别 IDE应当可以容易地针对您环境修改这些步骤)

  安装 Jython 2.1如果还没安装(链接请见 参考资料)

  拷贝 getalltests.py 到主目录

  编辑 getalltests.py 第 25 行以指定到源文件根路径会搜索在这个位置下所有目录中和 org 包中 *Text.java 匹配文件名   如果有必要修改第 54 行以改变根包名(例如改为 com)

  将 DynamicTestSuite.java 拷贝到源树中

  将以下 JAR 添加到 Eclipse 项目中:   junit.jar (JUnit 框架 2进制文件下载信息请参阅 JUnit Web 网站WebSite)

  jython.jar(Jython 2进制文件位于 Jython 安装目录)

  将 DynamicTestSuite 类装载到 Eclipse Java 源文件编辑器中执行以下步骤的:   在 Package Explorer 视图中选择 DynamicTestSuite 或者

  按 Ctrl+Sht+T并在 Choose Type 输入字段键入 DynamicTestSuite

  从文件菜单栏选择 Run然后选择 Debug...

  选择 JUnit配置

  单击 New按钮将会创建个新 JUnit 目标 DynamicTestSuite 应当预填入 Test Class 字段

  选择 Arguments选项卡

  在 VM 参数文本框中键入 -Dpython.home=<path where you ed Jython>

  单击 Debug按钮

  变!现在就有了个具体 JUnit TestCase 类可以像静态定义包那样处理它设置边界并进行调试!不需要修改 Test 类装具模块将构建个包就像您显式将每个 Class 对象编写到包中如要执行测试可以通过喜爱调试器、编译工具(如 Ant 或 CruiseControl)或者个 JUnit 内含 test runner 这个装具模块



  扩展这个装具模块

  我相信您注意到了除非在运行前修改源代码否则这个装具模块只能用于个项目可以容易地扩展这个装具模块让它支持多个项目种简单方式是修改 getPathToScript 以使用指定特定于项目属性系统属性可以在自己项目中自由使用它可以不加改变地使用它也可以以它为基础进行加工不过请别忘记它 GPL 许可证



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: