关于这个编译代码段,您应该注意的主要事情是 <junitreport> 中 <report> 元素的 styledir 属性;它指定了用户自定义的 XSLT 文件所在的目录。为捕获日期/时间戳,您需要在 build.xml 某处的 <junit> 任务前引入 <tstamp> 任务。
回页首
让电子邮件任务自动化
Ant 有一个内建的 <mail> 任务,但不幸的是这个任务只有文本消息的性能,不能处理文件附件。 但最近,一项任务被提交到 Ant 开发组,它实现了 MIME 邮件的性能。
我和另两个积极的 Ant 开发者一起工作,改善这个最近提交的任务,这样它就可以支持 Ant 的 FileSet 特性以及抄送和暗送的邮件功能。我还添加了另一个很好的特性 ― 将文件附加到电子邮件消息正文的能力。
现代的电子邮件阅读器可以像 MIME 那样显示附带的 HTML 内容,还可以像浏览器那样解读 HTML 代码。图 1 显示了使用 <mimemail> 任务、用 Ant 发送的 JUnit 报告电子邮件样本是什么样子。
图 1. 用 Ant 发送的 JUnit 报告样本
发送电子邮件的代码如清单 3 所示。
清单 3. build.xml 中用来发送电子邮件的代码段
<target name="mail"> <taskdef name="mimemail" classname="org.apache.tools.ant.taskdefs.optional.mail.MimeMail"/> <tstamp/> <mimemail messageMimeType="text/html" messageFile="overview-summary.html" tolist="erik@eblox.com" mailhost="mail.eblox.com" subject="JUnit Test Results: ${TODAY}" from="erik@hatcher.net"> <fileset dir="."> <include name="TESTS-*.xml"/> </fileset> </mimemail> </target> |
代码注释:
<taskdef> 用来定义 <mimemail> 任务,因为现在 Ant 没有提供这个功能。以后,这个任务可能会成为 Ant 的可选任务之一;那么 <taskdef> 就会成为多余。
<tstamp> 用来创建用在电子邮件主题中的 TODAY 属性。在 build.xml 的“准备”或“初始化”阶段包含 <tstamp> 任务很常见,所以根据您的情况,它可能是多余的。
<mimemail> 具有清楚的自解释的语法。提供的代码中包含了这项任务的 Ant 风格的帮助文件(请参阅 参考资料)。不仅 HTML 报告被发送(使用 messageFile 属性以便附加到消息的正文部分),而且原始的 XML 结果文件也作为标准 MIME 附件用 <fileset> 被发送了。
<junitreport> 在前面创建了一个名叫 overview-summary.html 的文件(因为指定了“noframes” 选项)。
回页首
排障、测试和部署
我为 Ant 开发团体提供了刚才讨论的所有的代码修正,他们已经认可将其包含到以后的发行版中去。但是,因为官方的 Ant 发行版还没有包含这篇文章中使用的技巧,在让这些技巧为您服务之前还需要采取一些措施。
让代码生效
第一,这些代码的修正是基于 Ant 1.3 发行版的;这是我将推荐的用于这代码的唯一 Ant 版本。 提供的代码包含了 JUnitMail.jar 和用于生成 jar 文件的源代码。这个 jar 文件必须存在于启动 Ant 环境中的 classpath 里 ― 在 Ant 的 optional.jar 之前。
如果您是个典型的 Ant 用户,您通过 $ANT_HOME/bin 中的包装脚本之一运行 Ant。这些包装脚本在启动 Ant 前将所有 $ANT_HOME/lib 中的 jar 文件放入 classpath。在 Windows 平台下只要将 JUnitMail.jar 放入 $ANT_HOME/lib 目录,用 ant.bat 就可以处理 classpath 问题。
如果遇到过古怪的行为(例如,也许从 <junit> 捕获的额外参数没有在 XML 文件中出现),那么就调试在包装脚本中用到的 classpath(例如,ant.bat 中的 %LOCALCLASSPATH% )并修改包装脚本,确保 classpath 中 JUnitMail.jar 在 optional.jar 之前。
测试代码
在将这新的代码集成到 classpath 中以后,用 XML 格式化器测试一个简单的 JUnit 测试示例(如 清单 2所示)确保捕获了额外的 Ant 属性。
额外属性作为 <Property> 元素在 XML 格式化器中被捕获。如果,由于某种原因致使属性元素没有出现,就可能是一个 classpath 的问题。
确保修正后的 JUnit 任务正在被使用,一个保险的办法是使用我的 JUnitMail.jar 版本中提供的 JUnitTask.class 、 JUnitTest.class 、 JUnitTestRunner.class 和 XMLJUnitResultFormatter.class 来代替 optional.jar 中相应的文件。
<mimemail> 任务有两个依赖条件 ― JavaMail 和 Java 活动框架(请参阅 参考资料)。在启动 Ant 时,这两个 jar 文件必须放在 classpath 中,以便使用 <mimemail>。
定制布局
您可以通过调整 XSLT 文件定制 JUnit 结果的 HTML 布局。我通过为每个测试套件在隐藏的 <DIV> 中添加额外属性以及添加一些用于隐藏及显示该额外信息的 JavaScript 的方法修改了 Ant 的标准布局。这些 JavaScript 技巧可以在 Internet Explorer 中生效,但在 Netscape 中不起作用(它显示了所有的属性,没有隐藏)。
我添加新捕获属性的首要目的仅仅是让那些信息可用,不过将这些属性结合到 HTML 报告中的方法,还有很大的改进余地。(请记住,如果您做了任何改进,请将之提交到 Ant 开发者和用户团体,让我们大家分享!)
回页首