个用 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 中。这四个库的相互配合可以实现您的目标:动态构建的 TestSuite 可以像静态定义的那样运行。
看一下清单 2 中的 JUnit suite 清单。它是一个公开 public static TestSuite suite() 方法签名的 TestCase 。由 JUnit 框架调用的 suite() 方法调用 getTestSuite() , getTestSuite() 又调用 getClassNamesViaJython() 以获取一组 String 对象,其中每一个对象表示一个作为包的一部分的 TestCase 类。
用Jython构建JUnit测试包(2)
时间:2011-02-04 Michael Nadel
清单 2. 动态定义 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;
}
在开始时,要保证设置了正确的系统属性。在内部,Jython 将使用 python.home 属性来定位它所需要的文件。最终会调用 getClassNamesViaJython() 方法,在这里面会有一些奇妙的事情发生,如在清单 3 中将会看到的。
清单 3. 从 Python 运行时提取 Java 对象
/**
* 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;
}
首先,对 Python 文件进行判断。然后,从 Python 运行时提取出一个 PyObject 。这就是得到的 |