对基于JUnit跟Ant的测试用例执行过程使用Kieker(AspectJ)进行监控的方法

对基于JUnit和Ant的测试用例执行过程使用Kieker(AspectJ)进行监控的方法

这篇日志的目的从标题里可以看出来。这也是我们实验需要,必须总结一下,方便其他师弟师妹在这个基础上做实验。

我已经介绍了很多基于Kieker的监控方法,这里以Prefuse这个开源可视化Java框架为例,总结怎么基于JUnit和Ant实现对开源软件自带测试用例执行过程的监控。在这个链接中,选择最新的版本下载(Prefuse已经有些年头没更新了,不过这个框架确实还不错)。

解压之后用Eclipse打开其build.xml,发现这个项目的build.xml结构还比较奇葩。如果运行ant all,可以生成所有的class文件和JAR包(还得简单解决一下字符集的问题)。仔细看一下,发现确实将所有代码编译了,但是build.xml里面没有target是关于测试的。我们注意到解压后有一个test文件夹,里面确实有些测试用例。例如这里:prefuse-beta\test\test\prefuse的All_Prefuse_Tests.java,打开之后看到:import junit.framework.Test; 说明使用的是JUnit 3,随便找到一个JUnit 3的JAR包,放到lib目录下。然后我们就可以自己编译这些测试类了。

首先,我们自己在build.xml文件中增加一个target(需要对应地在build目录下建立一个testcase文件夹):

<target name="compile-testcase">
    <javac
        classpath="lib/junit.jar:build/prefuse.jar:build/demos.jar"
        srcdir="test"
        destdir="build/testcase"/>
</target>

这个target的具体配置很简单,我就不介绍了。下面我们讲讲怎么用Kieker监控这些测试用例的执行。首先,像这篇日志里讲的这样:将”kieker-1.4″下”dist”文件夹下的”kieker-1.4.jar”和”lib”文件夹下的”aspectjweaver-1.6.11.jar”和”commons-logging-1.1.1.jar”三个jar包拷贝进解压后目录中的”lib”文件夹下。我们稍晚时候再说说META-INF文件夹的位置。要实现监控其实很简单,我们新建一个target,名字随便起:

<target name="test2" depends="compile-testcase">
    <junit
        printsummary="yes"
        errorProperty="test.failed"
        failureProperty="test.failed"
        fork="true"
        haltonfailure="yes">
        <formatter type="plain"/>
        <jvmarg value="-XX:-UseSplitVerifier"/>
        <classpath path="lib/junit.jar:lib/commons-logging-1.1.1.jar:lib/kieker-1.4.jar:build/testcase:build/prefuse/classes:build/demos/classes"/>
        <jvmarg value="-javaagent:lib\aspectjweaver-1.6.11.jar"/>
        <test todir="test-results" name="test.prefuse.All_Prefuse_Tests"/>
    </junit>
    <fail message="Tests failed!" if="test.failed"/>
</target>

这里有些细节我就不讲了,其实都很简单。简单来讲,就是用aspectjweaver这个jar包做Javaagent,然后在classpath中包含kieker的jar包,以及测试类和被测试类。-XX:-UseSplitVerifier在这里使用的原因可以参看这篇日志。需要指出的是,之前那篇日志里提到的META-INF文件夹,简单来讲,放到classpath中就可以,所以其实我们放到build/demos/classes这样的文件夹下就行(因为在上面target中已经将其包含到了classpath中),问题是,我们放到build.xml文件夹下可以吗?答案是可以的。将其放到解压后根目录下,然后再建立一个test-results文件夹(和这个对应:<test todir=”test-results”),运行ant test2,就可以看到测试用例的运行结果了。我们可以看到,运行了34个测试用例,其中fail了一个,同时也可以看到生成了监控数据。

最后总结一下META-INF这个问题。实践证明:在Windows系统中,在基于Ant执行Java class的时候,会自动将build.xml目录所在目录加入classpath,但是如果通过Java命令行,则需要加入“.”来加入当前目录。

但是,我又测试了一下在Mac OS X下的结果,发现必须加入“.”来加入当前目录,另外,Windows中路径的正反斜杠在Ant中都可以,但是在Mac OS X中只能使用反斜杠“/”。这是一点题外话,总结一下。