解决Jenkins Email Extension Plugin发送邮件失败

昨天用来测试的虚拟机不知道怎么回事,Firefox自动升级到8.0。结果就是我的WebDriver PythonBindings 在FF8下面是用不了的。现象就是,实例化一个Firefox Driver,然后 driver.get(‘http://www.google.com’),立刻返回,浏览器没有做任何响应。这个问题我自己不知道怎么解决,外面的世界貌似也没人遇到这个问题,究竟是没人碰到这个问题呢,还是很少用人PythonBinding?

恢复了VM镜像,然后让Jenkins重新跑起来,但是之后就遇到一个问题,发邮件一直失败。错误是

ERROR: Could not send email as a part of the post-build publishers.
javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 553-5.1.2 We weren’t able to find the recipient domain. Please check for any
553-5.1.2 spelling errors, and make sure you didn’t enter any spaces, periods,
553 5.1.2 or other punctuation after the recipient’s email address. i6sm163233obl.2

搜了一下,应该是Jenkins标准的邮件插件是用空格来做多个邮件地址的分隔符,而Email Extension Plugin使用逗号分隔多个邮件地址的。但是这应该是一个很早之前的问题,已经被fix了。

傻傻地build了好多个以后,我想起来,恢复VM以后我是直接把之前的config.xml拷贝回去那个任务的文件夹里面的。进去打开那个config.xml,找到这一行:

<recipientList>$PROJECT_DEFAULT_RECIPIENTS</recipientList>

删掉。就好了。

Hudson保存WebDriver测试执行失败的截图

之前一篇文章介绍了如何把remote driver出错时候的截图保存下来,今天分享一下在Hudson下如何把这些截图保存下来。

用Hudson来跑自动化测试,其实就是把运行自动化测试看作是构建一个软件。在Hudson里面有一个功能叫“Archive the artifacts”,可以把构建的产物(就是所谓的artifacts)打包。具体做法就是

  1. 在Build的最后添加一个步骤,把所有测试过程中生成的.png文件,拷贝到workspace。并且记得删掉原图,要不然下一次测试还是会把之前出错的截图也一起打包
  2. 勾上“Archive the artifacts”
  3. 在“Files to archive”里面填“*.png”
如果你的测试每次都有异常,那么恭喜你(What???),这个build会跑的很顺利。因为每次都有一些.png文件生成,每次打包都能找到一些.png。但是如果有一天,你的自动化测试或者被测系统变得健康起来了,没有错误了,那就会遇到一些麻烦。
作为一个持续构建工具,Hudson会认为,所有build都是理所当然地有一些artifacts。如果没有任何artifacts生成,那做这个build干吗?当测试都顺利跑过,没有生成错误截图的.png文件的时候,这个build也会fail,因为打包的时候没有找到任何文件。这个时候可以这样做。
  • 在Build的最后一步再加一个步骤,在workspace目录中随便生成一个.png文件,例如“touch pass.png”
  • 直接在Ant脚本里面添加一个任务,<touch file=”pass.png”>

Hudson + WebDriver 组织自动化测试

之前介绍过如何使用TestNG来驱动WebDriver用Ant来自动化运行测试。今天分享一下如何把这些东西都放到HudsonJenkins也行)里面呢?

Hudson是一个比较流行都持续集成工具。用Hudson来驱动自动化测试的好处有以下这些:

  • 类似crontab的自动任务管理
  • 丰富的插件支持
  • 支持分布式任务
  • 容易部署

其实整个过程很简单,把Hudson跑起来,新建一个Job,配置一下Ant任务就好了。这里只分享一下我遇到的一些坑。

是否使用Source Code Management获取最新的测试代码?

如果每次测试都拉最新的代码,好处就是保证测试代码是最新的。但是也会带来一些问题,测试代码本身也是代码,怎么保证最新的测试代码没有问题呢?我个人认为,如果团队比较小,可以直接拉最新的代码;如果团队大,需要控制。

如果不用SCM插件,怎么样更新自动化测试代码?

我想到的一种办法就是,在Hudson里面建立一个构建自动化测试代码的Job,这个Job的产物就是自动化测试的包,譬如说如果用WebDriver或者Selenium,就把测试代码build成一个或者若干个jar包,然后建立一个latest的软链接指向最新的jar包;在运行自动化测试的Job里面做好配置,运行测试的目标jar包就指向latest.jar就OK了。

TestNG的结果如何跟Hudson整合

Hudson插件很多,可以用testng-plugin来完成这个任务。配置比较简单,在Ant脚本里面配置好TestNG的result output,然后在Hudson里面把测试报告的模式填好。我直接填的TestNG的默认结果文件“testng-results.xml”。build.xml节点配置的一个例子:

    
        
            
        
        
    

首先在testng节点指定outputdir属性,然后测试运行完成以后把结果文件移动到Hudson的workspace

怎么样把Ant的参数传递给TestNG

很多时候我们会希望通过ant把一些参数传递给testng.xml,从而使得测试更加灵活。例如传递不用的base_url可以测试不同的站点。还有配置不同的浏览器。虽然之前这篇文章已经介绍了如何把Ant的参数传递给TestNG,但是那个方法有个缺点,如果在测试方法A里面调用了测试方法B,测试方法B是不能拿到Ant传进去的参数的。我的办法比较土,就是首先写好一个testng_base.xml的模板文件,把一些可能经常改变的数值替换成参数,然后用Ant的replace任务做字符串替换。