最近在负责一个小项目,因为时间比较宽松,想到能否尝试一下CI(持续集成)工具。反正5月份还要考系分,说不定正好碰上敏捷开发的题目,哈哈(YY一下)
下载了相应的软件,去图书馆找了一本罗时飞的《敏捷持续集成【cruisecontrol版】》,按照上面的步骤搭建了CI服务器,然后从该书的论坛上下载了SpringFramework提供的一个示例代码:PetClinic,并且将相应的jar包copy到位,兴冲冲的运行build,结果一片红色,失败了
静下心来仔细分析一下error log,结果让我哭笑不得:clover的授权过期了。clover是一个代码覆盖度工具,用来显示你的测试代码对基代码是否测试完全。上clover的官网一查,原来这东西是收费的。你也可以注册后获得一个30天的试用授权。而老罗的书中提供的源代码中包含的licence早就过期了(30天,书还没运过来估计就过期了吧)。不过还好,可以选择另一款开源的codecoverage软件,叫做cobertura
Spring提供的PetClinic项目同时包含了cobertura的ant build文件,只是默认没有包含进来。只要改动一下项目根目录下的build.xml,以及CruiseControl根目录下的config.xml。于是满怀希望再次build,终于绿色了!
很兴奋的查看build artifacts,嗯,该有的东西貌似都有了,于是随手点开生成的codecoverage报告,傻眼了:0% 也就是一行代码都没有被测试到,这当然不可能,肯定是cobertura出问题了
但是log中没有报告任何错误,而且所有的单元测试也pass了,百般无奈只好一行行查看cc的输出结果,简直大海捞针,终于在cobertura的部分看到一个异常
junit] Exception in thread "Thread-0" java.lang.ExceptionInInitializerError
[junit] at java.io.File.deleteOnExit(File.java:939)
[junit] at net.sourceforge.cobertura.util.FileLocker.<init>(FileLocker.j
ava:80)
[junit] at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobal
ProjectData(ProjectData.java:230)
[junit] at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTime
r.java:31)
[junit] at java.lang.Thread.run(Thread.java:619)
[junit] Caused by: java.lang.IllegalStateException: Shutdown in progress
[junit] at java.lang.Shutdown.add(Shutdown.java:62)
[junit] at java.lang.System$2.registerShutdownHook(System.java:1146)
[junit] at java.io.DeleteOnExitHook.<clinit>(DeleteOnExitHook.java:20)
[junit] ... 5 more
这是个很古怪的问题,Google之,还好我不是第一个遇到的,国外某论坛上有高人指出:这是旧版本的 cobertura 在 jdk1.6u14以上版本会出现的问题。而我的jdk就是jdk1.6u18 的,真是点背不能怨社会啊
赶紧去cobertura 官网把最新的版本下回来,这下应该没问题了吧
cc的运行结果依旧是绿色,看上去很美,然而这次连 0% 都没有——直接一片空白。。。。。
深呼吸一口气,继续看cobertura 的log,这次的异常更多,净是一些 addInstrumentationToSingleClass, Unable
to instrument file 之类的错误,看起来cobertura 没能够把自己植入到被测试类的字节码中
伟大的Google再次拯救了我,原来这是cobertura 使用的asm库的版本问题,看来用开源的东西有时就是麻烦多多
不过,按照网上牛人的说法,asm3.0的版本会导致以上问题。我下载的cobertura 1.9.4 同时附带了asm2.x和3.0的库,我删掉3.0的库问题依旧,反而把asm2.x删了就正常了!开源的东西,真是很神奇
不管怎样,cobertura 总算生成了期待中的漂亮的报表,里面还注明了哪行代码没有被测试到,真不错。继续看其他的报表,jdepend ,functiontest ,javadoc 都没问题了,偏偏最后一个loadtest环节挂了——全部都是http 404错误
看来是tomcat的问题,重新build,然后查看CruiseControl运行时输出的内容。发现到了“waiting for deploy...”便停住了,等了快两分钟才继续。
原来如此,在PetClinic的build.property中定义的tomcat路径和我安装的tomcat路径不一样,自然无法正确部署了,也就谈不上后续的loadtest,赶紧改了tomcat的路径,终于看到了完美的结果,很酷很专业
最后附带说一句,如果机器上同时装了Oracle和tomcat,记得看看Oracle XDB有没有占用8080端口。具体的解决方法网上很多,不赘述了