技术开发 频道

Jacks:Java兼容性测试,开放源码之路

【IT168 技术文章】

  什么是 Jacks?

  Jacks 测试套件检查 Java 编译器是否符合 JLS(Java 语言规范)。它由大量小测试案例组成,每个测试都侧重于 JLS 中特定的部分。Eric Blake 为 Jacks 项目作出了很大贡献,他从面向细节领域描述了这种类型测试的好处。“通过生成带有指定编译行为的小测试案例,然后将每个案例的执行自动化,编译器作者或调试者可以快速找出 Java 源码到字节码转换中存在的问题。”

  开发 Jacks 背后的概念是要简化对多编译器或多编译器配置所运行的测试(例如,对上两个发行版的 Jikes 和 Javac 的 JDK 1.3 发行版所进行的一组测试)。如果手工进行,您必须重复地设置环境变量,然后根据所期望的结果来检查测试结果。而通过使用 Jacks,只需要更改到存放测试的目录, 调用 Jacks 框架,然后表明应该使用哪个编译器配置。

  Sun 没有履行对 Java 开发者所做的承诺激发了 Jikes 小组对 Jacks 项目的设置和运行。Sun 再三声明它会把 Java、JCK(Java Compatibility Kit)和相关 Java 技术交到一个标准主体的手中。但因为这还没有实现,从事 Java 项目的开发者就不能使用 JCK 来对日常的开发进行回归测试。当面对由于不合理的许可证限制而导致的代码人为不足时,他们倾向于用新的更完善的系统来替换旧系统。这就是发生在 Jacks 上的故事。(尽管 Jacks 由 developerWorks 主持,它受 GPL 而非 IBM Public License 约束。)

  使用 Jacks

  Jacks 是以 Tcl 编写的,因此需要确保拥有 Tcl 8.3。(需要版本 8.3 来确保具有 tcltest 扩展和 Unicode 支持,这两者都是 Jacks 所必需的)。可以下载用于 Windows 的安装程序和用于 Red Hat x86 的 RPM,也可以更方便地从源代码中构建。如果您不知道到什么地方下载,请参阅本文稍后的 参考资料 部分;如果使用的是 Red Hat 7,很可能已安装了 Tcl 8.3。

  安装了 Tcl 后,需要从 CVS 取出 Jacks。然后通过将编译器路径名包括在要测试的编译器的 Jacks _setup 配置文件中来配置 Jacks。对于每个希望支持的配置都需要一个 _setup 文件。例如,Jacks 带有 javac_setup 文件。需要编辑该文件来为 javac 设置路径。Eric Blake 说,“最困难的部分是断定如何测试 Jikes,因为我在环境中已设置了 JIKESPATH。但我想出了要在 jikes_setup 配置文件中更改什么内容,一切都很顺利。”

  从 CVS 模块中取出 Jacks 源代码

setenv CVSROOT :pserver:anoncvs@oss.software.ibm.com:/usr/cvs/jikes
cvs login

paswsd anoncvs

cvs checkout jacks
 


  可以对数量不限的编译器或编译器配置使用 Jacks。要除去某一编译器的配置,只需要删除其 _setup 文件。

  从 CVS 中取出源代码后,就需要在路径中包括顶层 Jacks 目录,这样才能运行 Jacks shell 脚本。为谨慎起见,最初运行 shell 脚本时应该不带任何自变量,以确保每项都经过正确配置。

% jacks


  如果一切正常,将看到 Jacks 脚本所接受的命令行选项的清单。如果收到错误,请检查在路径中是否能找到可执行文件 tclsh8.3。Windows 用户需要直接运行 tclsh83,并将 jacks.tcl 自变量在一般标志之前传递给它。还应该考虑安装 Cygwin UNIX 兼容性层,这样,象 Unix 用户一样,您就可以使用提供的 shell 脚本来运行 Jacks 了。下面的指令假设您使用的是 shell 脚本。

  对于测试示例,需要使用 Jikes 编译器来运行给定子目录中的所有测试,命令如下:

% cd tests/jls/packages/package-declarations/unnamed-packages

% jacks jikes
 


  开发新的回归测试

  开发新的 Jacks 测试案例非常简便。照 Eric Blakes 的话说,“基本上,您设计一个简单的源文件来测试问题,将它放在特定的 Jacks 格式中,然后运行 Jacks。如果编译器结果与所期望的结果不一样,它打印出错误。”这里是 Jacks 主页上教程中有关添加新测试案例的一例:

// File SynchronizedInterface.java
public synchronized interface SynchronizedInterface {}
 


  使用 Jikes 编译时,生成以下错误:

% jikes SynchronizedInterface.java

Found 1 semantic error compiling "SynchronizedInterface.java":

3. public synchronized interface SynchronizedInterface {}

<---------->

*** Error: synchronized is not a valid interface modifier.

 
  如果很快看一下 JLS 的第 9.1.1 节,会发现 synchronized 在该上下文中不是合法的修饰符。如果尝试使用早期发行版 JDK 中的 Javac 编译器来编译相同的类,则不会生成错误(该错误在稍后的发行版中得到修正)。

% javac SynchronizedInterface.java


  现在既然问题得以重现,可以通过以下步骤来对 Jacks 测试套件添加回归测试案例:

  了解应该将测试案例放在哪个目录中

0
相关文章