看一下清單 2 中的 JUnit suite 清單。它是一個公開 public static TestSuite suite() 方法簽名的 TestCase。由 JUnit 框架調用的 suite() 方法調用 getTestSuite(), getTestSuite() 又調用 getClassNamesViaJython() 以獲取一組 String 對象,其中每一個對象表示一個作為包的一部分的 TestCase 類。
清單 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 );
文章來源于領測軟件測試網 http://www.kjueaiud.com/