基于UIAutomator+Jenkins自动化测试框架实现
一. UIAutomator之原始Report:
如您所见,当你执行完毕UIAutomator测试脚本后,会有形如如下的反馈:
众所周知,图中的信息是在UIAutomator工具已定义规范:
二. 如何将UIA Report(Txt)转换为Junit Report(Xml)首先我们看看Junit Report的样子(ant+junit):
Java里面已经有很多Shared的Resources,你可以参考如何实现txt-xml的转换。很明显我们需要
String[]lines = txt.getContent(“UIA Report.txt”).split("\n")
这样我们就获取到UIA Report(txt)每一行信息。接着我需要过滤甄别我们(Junit Report)需要的信息并且填入到xml中,最后我发现我“重复造轮子”了,因为我在android中发现了这个“InstrumentationResultParser.java”,不要忘记UIAutomator也是基于Instrumentation的,所以,你现在可以直接拿来主义。然后Junit Report就产生了。看看又发现了什么:https://github.com/dpreussler/automator-log-converter(ReadsAndroid UI automator file outout and write a JUNIT Xml file.)。如果满足你的需求,欢迎直接使用!纪念前面的种种“徒劳”!有些浪费是很有意义也是值得的。因为,我们常常需要去修改某些code以适配我们的需求,甚至忘记或抛弃那些用到过的jar包并重新实现。
OK!我们的测试报告已经转换成了Junit Report了,而我们一无所为就完成了这些。只需要这样:“java –jar automator-log-converter.jar UIAReport.txt”然后你就会看见同级目录下UIAReport.xml出现了。
至此,我们期望的Junit风格的Report出来了。
三. 太极生两仪
凡事阴阳相随,利弊同行。UIA会有什么利弊?
首先我们对测试用例(TestCase),测试套(TestSuite),测试工程(TestProject)有个大体认识。UIA执行的对象是TC和TC的testMethon,多个TC就组成了一个TS(我们也可以粗浅地把TS当作测试任务去执行)。UIA官网指导我们可以像这样执行测试任务:
adb shelluiautomator runtest UITest.jar -c com.xxx.uitest.videoplayer.ForwardTest -c com.xxx.uitest.videoplayer.SkipQtrTest#testSkip
如上我们已经执行了一次测试活动,然后我们需要提交一份测试报告。
测试报告是测试阶段最后的文档产出物,一份详细的测试报告包含足够的信息,包括产品质量和测试过程的评价,测试报告基于测试中的数据采集以及对最终的测试结果分析。你可能觉得UIA产生的report还不能称为测试报告,准确地说应该是“测试中的数据(信息)采集”和信息加工后产生的一份执行记录。因此,要出一份真正意义的测试报告,我们还需要(UIA)做些什么呢?
1. 执行报告,已经有了UIAReport
DONE:已经有了UIAReport。
2. Bug出现了,我们该怎么办?是的我们需要收集测试对象的errInfo(debug/log)以支撑bug定位分析。
TODO:这是我们还需要完成的工作—收集errinfo日志
3. 我们习惯是执行一次测试任务(你可以认为是一个TestSuite),我们的errinfo之和上下文相关,通常我们只关心failed标记的testcase的errinfo。
TODO:这是我们还需要完成的工作—区别TC的执行结果(fail/pass/skip)
……
暂时先解决这几个问题。怎么办?
1. 测试对象android(app)的log,我们通常是这样收集
adblogcat -v timeTag>logfile.log
这样我们就得到了某个时间段的某种(tag)日志文件logfile.log
简单地做,我们需要一种”胶水”将log收集和脚本执行粘合起来并建立某种关联。
2. 标识TC的执行结果我们可以拆解TS(测试任务),分TC执行,这样既易于区分TC结果,也易于区分收集errInfo。
这样我们就需要规定执行流程(或机制)。
上面简单做了简单分析,接着我们看看我们可能需要准备(规范)些什么。
1. 测试任务:即测试用例集,我把它装在一个文件里面(testtask.txt或者xxx.task或者xxx.suite):
2. 获取上面的文件内容并装入UIA执行之
我选择用python来完成这些工作,当然有很多编程语言供你选择。
我们需要一个方法来读取并遍历testsuite:
def run_testsuit(testTask,reportPath,logPath,logTag)
再来一个方法执行testcase:
def run_testcase(testCase,reportPath)
再来一个方法收集log:
def generate_log(tag,logFilePath)
流程定义完毕,数据收集齐全。然后对输出件二次加工即转换JunitReport:
def cvt_report(jarToolPath,uiaReportPath)
大体形式如下:
run_testsuit(testTask,reportPath,logPath,logTag)
for testcase in testTask:
generate_log(tag,logFilePath)
tcReport= run_testcase(testcase,reportPath)
iftcReport.state == “pass”:
#todo:
elif tcReport.state== “fail”:
#todo:
elif tcReport.state== “skip”:
#todo:
else:
#todo:
TSReportOutput.write(tcReport.content)
cvt_report(jarToolPath,TSReportOutputFile)
在执行的时候,我们可以看见这样的一个输出显示:
四. 看一下Jenkins上的效果
控制台输出界面:
Report界面:
好了,就这样了!
最后,感谢您的阅读!
欢迎并感谢您提出见解!同时也欢迎您对该文斧正!