代码是如何工作的?首先,指派 getalltests.py 获取一组要执行的 Test 类。然后,使用 Jython API 将这个列表从 Python 运行时环境中提取出来。然后使用 Java Reflection API 构建在表示 Test 类名的列表中的 String 对象的类实例。最后,用 JUnit API 将 Test 添加到 TestSuite 中。这四个库的相互配合可以实现您的目标:动态构建的 TestSuite 可以像静态定义的那样运行。
/** * @return TestSuite A test suite containing all our tests (as found by Python script) */ private TestSuite getTestSuite() { TestSuite suite = new TestSuite(); // get Iterator to class names we're going to add to our Suite Iterator testClassNames = getClassNamesViaJython().iterator(); while( testClassNames.hasNext() ) { String classname = testClassNames.next().toString(); try { // construct a Class object given the test case class name Class testClass = Class.forName( classname ); // add to our suite suite.addTestSuite( testClass ); System.out.println( "Added: " + classname ); } catch( ClassNotFoundException e ) { StringBuffer warning = new StringBuffer(); warning.append( "Warning: Class '" ).append( classname ).append( "' not found." ); System.out.println( warning.toString() ); } } return suite; }
/** * Get list of tests we're going to add to our suite * @return List A List of String objects, each representing class name of a TestCase */ private List getClassNamesViaJython() { // run python script interpreter.execfile( getPathToScript() ); // extract out Python object named PYTHON_OBJECT_NAME PyObject allTestsAsPythonObject = interpreter.get( PYTHON_OBJECT_NAME ); // convert the Python object to a String[] String[] allTests = (String[]) allTestsAsPythonObject.__tojava__( String[].class ); // add all elements of array to a List List testList = new ArrayList(); testList.addAll( Arrays.asList( allTests ) ); return testList; }
按 Ctrl+Shift+T并在 Choose Type 输入字段键入 DynamicTestSuite 。
从文件菜单栏选择 Run,然后选择 Debug...。
选择 JUnit配置。
单击 New按钮。将会创建一个新的 JUnit 目标, DynamicTestSuite 应当预填入 Test Class 字段。
选择 Arguments选项卡。
在 VM 参数文本框中键入 -Dpython.home=<path where you installed Jython> 。
单击 Debug按钮。
变!现在就有了一个具体的 JUnit TestCase 类,可以像静态定义的包那样处理它。设置边界并进行调试!不需要修改 Test 类,装具模块将构建一个包,就像您显式将每一个 Class 对象编写到包中一样。如要执行测试,可以通过喜爱的调试器、编译工具(如 Ant 或 CruiseControl),或者一个 JUnit 内含的 test runner 调用这个装具模块。
在 Matt Chapman 的 Ant 全面介绍“ Apache Ant 101: Make Java builds a snap”(2003 年 12 月)中,介绍了编写简单 Java 项目的编译文件所涉及的步骤,并分析了 Ant 的其他一些有用的功能,包括文件系统操作和样式匹配。在文章最后读者要编写自己的、扩展 Ant 的功能的 Java 类。