用 Jython 构建 JUnit 测试包

发表于:2007-8-01 14:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Michael Nadel    来源:网络转载

了解测试装具模块


        代码是如何工作的?首先,指派 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 类。

        清单 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 。这就是得到的对象,它包含将构成测试包的所有测试用例的类名(记住 -- PyObject 是 Python 对象的 Java 运行时对应物)。然后创建具体的 List 并用 PyObject 填充它,使用 __tojava__ 指示 PyObject 将其内容转换为一个 Java String 数组。最后,将控制返回 getTestSuite() ,在这里装载 Jython 标识的测试用例,并将它们添加到组合包(composite)中。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号