基于UIAutomator+Jenkins Android自动化测试 实现

来源:互联网 发布:日本包装设计网站知乎 编辑:程序博客网 时间:2024/05/01 00:05

基于UIAutomator+Jenkins自动化测试框架实现


一.            UIAutomator之原始Report:

如您所见,当你执行完毕UIAutomator测试脚本后,会有形如如下的反馈:

 

众所周知,图中的信息是在UIAutomator工具已定义规范:



二.            如何将UIA Report(Txt)转换为Junit Report(Xml)

首先我们看看Junit Report的样子(ant+junit):

       <properties>涉及你的环境变量,项目配置,执行环境,编译环境等等信息。我们真正需要关心的是<testsuite>和<testcase>。然后对比UIA Report,你应该会发觉UIA Report和Junit Report的<testcase>信息是多么的相似,是的,它们应该相似。好吧,然后我们要做的就是将这相似的信息进行转换。如下你将明白其实这是多么多么简单的事情,仅仅是将txt(键值对)转换为xml而已。

         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界面:

 

好了,就这样了!

最后,感谢您的阅读!

欢迎并感谢您提出见解!同时也欢迎您对该文斧正!


注:转之:http://blog.csdn.net/stonree/article/details/25404125

0 0
原创粉丝点击