第七章 移动自动化持续化集成(下)
--------手机自动化之Appium
(4)增加构建步骤,这是如何执行我们项目工程的命令,如:python src/TestSuites/OnlineTestSuite.py。构建的时候就会执行这个命令,执行测试用例代码,同时我们要构建后的操作,就是测试用例执行失败后的邮件通知。单击保存按钮,保存所有设置。如图7.3.4所示:
图7.3.4 增加构建操作的构建后操作
(5)运行测试用例之前,我们需要先将执行测试用例的手机连接到服务器上,通过adb devices –l能查看到手机的信息。运行appium的服务端,当服务端启动成功后,方可进行其他的操作。
(6)构建我们刚刚创建的job,返回项目首页,单击左侧的“立即构建”按钮,构建我们的工程。当然此时,Appium服务端会有日志输出,同时测试用例在我们的测试手机上开始执行。如图:7.3.5所示:
图7.3.5 构建工程
(7)构建成功后,jenkins会根据测试用例的执行情况来置相应的状态。
7.4 Jenkins接入时问题解析
细心的同学可能发现了,将我们第六章的自动化测试工程接入Jenkins中后,不管是测试用例运行是否通过,Jenkins返回都是正常的,这不科学啊?所以这里面还是存在着一些儿问题的,那我们现在就逐一解析一下。
一, 测试用例运行失败了,Jenkins不会报告,依然是成功的标志。
针对这个问题,我们要了解Jenkins的状态设置的原理。Jenkins是根据我们在构建步骤中填写的命令的执行状态来置成功或是失败的,可是这就和unittest这个框架结合起来了。我们用unittest运行测试用例的时候,它会收集测试用例的执行情况。如果成功了就是一个句号,如果失败了就是F,而unitest框架框架最后执行结束后返回的永远是0。而有Jenkins来检测的时候,0代表成功,1代表失败。
所以如果我们想要在测试用例执行有失败的情况下,Jenkins会报错的话,需要修改一下Unittest的运行,将suite文件的内容改变成下面的样子:
#-*- coding: UTF-8 -*-
'''
Created on 2015-12-18
@author: 58
'''
import unittest
import sys
import os
sys.path.append("..")
sys.path.append(os.getcwd()+"/src/")
from TestCases.LoginTest import LoginTest
from TestCases.RegViewTest import RegViewTest
from TestCases.IndexViewTest import IndexViewTest
class OnlineTestSuite():
def test(self):
if __name__ == "__main__":
#构造测试集
suite = unittest.TestSuite()
suite.addTest(LoginTest('test_login'))
suite.addTest(IndexViewTest('test_indexview'))
suite.addTest(RegViewTest('test_reg'))
runner = unittest.TextTestRunner()
result=runner.run(suite)
#如果有测试用例执行失败,则返回1
if (not result.wasSuccessful()):
exit(1)
if __name__ == '__main__':
OnlineTestSuite().test()
二,没有具体的测试报告,不能详细看到每个测试用例的执行情况。
Unittest不会产生类似于testNG那样的报告,所以我们需要借助于第三方的模块。而Python下产生测试报告的模块叫HTMLTestRunner,通过这个模块来运行测试用例就能产生报告。当然我们就需要修改TestSuite文件,用HTMLTestRunner运行测试用例,修改后的代码如下:
import unittest
import sys
import os
import HTMLTestRunner
sys.path.append("..")
sys.path.append(os.getcwd()+"/src/")
from TestCases.LoginTest import LoginTest
from TestCases.RegViewTest import RegViewTest
from TestCases.IndexViewTest import IndexViewTest
class OnlineTestSuite():
def test(self):
if __name__ == "__main__":
#构造测试集
suite = unittest.TestSuite()
suite.addTest(LoginTest('test_login'))
suite.addTest(IndexViewTest('test_indexview'))
suite.addTest(RegViewTest('test_reg'))
#定义个报告存放路径,支持相对路径。
filename='./report.html'
fp=file(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'APP Auto Test Report',description=u'App AutoTest onLine!')
result=runner.run(suite) #自动进行测试
if (not result.wasSuccessful()):
exit(1)
if __name__ == '__main__':
OnlineTestSuite().test()
运行这个TestSuite文件后,就能产生一个测试报告,测试执行样式如图7.4.1所示:
图7.4.1
测试报告
三 其他的高级应用
Jenkins可以定制很多其他应用,如定时执行job,触发式执行job,将我们的测试报告以邮件的形式发送出去等,这些儿内容我已在博文:http://blog.sina.com.cn/s/blog_68f262210102wcww.html中进行了详细的讲解,在此我们就再累述,感兴趣的同学可以去参考一下。
7.4 本章小结
在本章中我们介绍了自动化测试用例执行的策略,什么是持续化集成,还有将我们的自动化测试工程接入到Jenkins当中。最后我们可以灵活配置Jenkins,来达到我们特殊的需求。到目前为止,我们的移动自动化测试Appium+Python教程就完成了,通过这七章的学习,完全可以将自己的移动自动化持续化集成跑起来。当然后续还能做好多工作,可以结合Robot Framework来做自动化测试(参考:http://www.cnblogs.com/fnng/p/3871712.html)。当然还可以做多线程方面的,同时在多台设备上运行测试用例,有待你去研究和学习。