7.1 使用junit-report生成报告

这个是参考网上的:http://www.xuebuyuan.com/2148574.html,经我个人验证是可行的方法,网上写的挺详细的,不过有些不太清楚明白的地方,鉴于网上说的有点迷茫,所以下面我再细化一下。

(1)下载junit-report包

这个包是我们生成报告的基础,所以先下载这个包,下载地址如下:https://github.com/jsankey/android-junit-report

(2)创建Robotium测试用例

创建好我们的Robotium测试用例,并且根据需要组织好测试用例。现在我们测试用例是针对众筹网的,只有一个登录测试用例,如图7.1.1所示:

图7.1.1准备好测试用例

(3)添加junit-report包到工程中

将刚刚下载的android-junit-report-1.5.8.jar包,添加到项目中。通过右击项目—>”Build path”à”Configure build path…”,在打开的对话框中“Libraries”à”Add External JARs…”,将包附加进来。

如图7.1.2所示:

图7.1.2 添加junit-report包

同时,选择“Order and Export”选项卡,将刚刚添加进来的包选择,单击“OK”按钮,完成包的添加。

(4)修改AndroidManifest.xml文件

修改AndroidManifest.xml文件如下,使用JUnitReportTestRunner运行测试用例。

将下面两句:

android:targetPackage="com.subject.zhongchou" />

修改成:

android:targetPackage="com.subject.zhongchou" />

(5)修改Run Configurations配置

当我们修改了xml文件后,还需要修改一下Run Configurations配置。右击项目,选择“Run as”à“Run Configurations…”,在打开的窗口中左侧的“Andriod JUnit Test”下选择要设置的项目,如“AllTests”。然后在右侧选择“Run all tests in the selected project or package”,单击“Instrumention runner”后面的下拉框,就可以看到我们在Xml文件中填写的“com.zutubi.android.junitreport.JUnitReportTestRunner”,然后单击“run”按钮,则测试用例就会在我们的测试机上运行起来。如图7.1.3所示:

图7.1.3 配置RunConfiguration

(6)查看测试报告

经过上面的配置,通过JUnitReportTestRunner运行测试用例后,会在手机上/data/data/com.subject.zhongchou/files下生成测试报告文件junit-report.xml。如果你用的是其他的App,则com.subject.zhongchou会不同,找到你自己的App名称即可。如图7.1.4所示:

图7.1.4 在手机上生成测试报告

注:用junit-report在手机上生成报告是有一个前提的,你的手机必须已经Root,并且给/data/data文件夹设置了777权限。否则我们无法将测试报告写到系统数据文件夹下,也没有办法查看文件。

(7)取出测试报告

测试用例是在手机上运行的,所以产生的测试也在手机中。虽然我们可以直接用手机查看报告,可是还是不如在电脑上查看的方便。现在我们在测试工程中创建文件夹“test-output”,使用下面的命令将测试报告拉取到这个文件夹中:

C:\adb pull /data/data/com.subject.zhongchou/files/junit-report.xmlD:\robotiumautotest\ZhongChouDemo\test-output\

然后在打开测试报告文件,内容如下:

(8)总结

这个junit-report是官方提供的包,使用起来比较方便。但是测试机必须先root。测试报告是Xml格式的,不方便阅读,网上说在jenkins中任务构建完成后即可使用Publish JUnit test result report插件分析得出单元测试报告。由于时间问题,我还没有尝试一下jenkins能否分析,不过后面我们会有自己的办法分析xml报告。

7.2使用testuntils生成报告

Testunitils和junit-report类似,也是借助于第三方的包,产生测试报告的,除了产生的测试报告文件名为TEST-all.xml外,使用步骤和产生报告的路径也完全一样。怎么说这也是另一种方法,多学习一点儿也没有坏处的同,下面我们讲解一下这个方法。

(1)下载testuntils包

当然在使用第三方的包之前,要下载对应的包。Testuntils包的下载地址是:http://code.google.com/p/nbandroid-utils/

(2)创建Robotium测试用例

创建好我们的Robotium测试用例,并且根据需要组织好测试用例。同样我们使用上面创建的测试用例文件,结构如图7.1.1所示。

(3)添加Testuntils包到工程

将刚刚下载的testutils.jar包,添加到项目中。通过右击项目—>”Build path”à”Configure build path…”,在打开的对话框中“Libraries”à”Add External JARs…”,将包附加进来。

如图7.2.1所示:

图7.2.1 添加testutils

同时,选择“Order and Export”选项卡,将刚刚添加进来的包选择,单击“OK”按钮,完成包的添加。

(4)修改AndroidManifest.xml配置

修改AndroidManifest.xml文件如下,使用testutils运行测试用例。

将下面两句:

android:targetPackage="com.subject.zhongchou" />

修改成:

android:targetPackage="com.subject.zhongchou" />

(5)修改Run Configurations配置

当我们修改了xml文件后,还需要修改一下Run Configurations配置。右击项目,选择“Run as”à“Run Configurations…”,在打开的窗口中左侧的“Andriod JUnit Test”下选择要设置的项目,如“AllTests”。然后在右侧选择“Run all tests in the selected project or package”,单击“Instrumention runner”后面的下拉框,就可以看到我们在Xml文件中填写的“com.neenbedankt.android.test.InstrumentationTestRunner”,然后单击“run”按钮,则测试用例就会在我们的测试机上运行起来。如图7.2.2所示:

图7.2.2 配置RunConfiguration

(6)查看测试报告

经过上面的配置,通过InstrumentationTestRunner运行测试用例后,会在手机上/data/data/com.subject.zhongchou/files下生成测试报告文件TEST-all.xml。如果你用的是其他的App,则com.subject.zhongchou会不同,找到你自己的App名称即可。如图7.2.3所示:

图7.2.3 在手机上生成测试报告

注:和junit-report一样,用Testuntils在手机上生成报告是有一个前提的,你的手机必须已经Root,并且给/data/data文件夹设置了777权限。否则我们无法将测试报告写到系统数据文件夹下,也没有办法查看文件。

(7)取出测试报告

测试用例是在手机上运行的,所以产生的测试也在手机中。虽然我们可以直接用手机查看报告,可是还是不如在电脑上查看的方便。现在我们在测试工程中创建文件夹“test-output”,使用下面的命令将测试报告拉取到这个文件夹中:

C:\adb pull /data/data/com.subject.zhongchou/files/TEST-all.xmlD:\robotiumautotest\ZhongChouDemo\test-output\

然后在打开测试报告文件,内容如下:

(8)总结

Testuntils和Junit-report是完全一样的两个第三方包,只是生成的报告文件名不同,使用方法等都类似,它们之间的区别我没有深入去研究,不过使用这两个包都可以生成手机测试报告。

7.3 重写InstrumentationTestRunner类生成报告

由于Junit-report和testuntils生成的报告都是在系统目录/data/data下面,如果手机没有Root,是没有权限生成报告的。所以我在网上看到了另一种方法,重写InstrumentationTestRunner类把报告生成到手机卡上,参考博客(http://blog.csdn.net/hunterno4/article/details/14485663)。下面我们也讲述一下这种方法:

(1)编写测试用例

在我们执行测试用例之前,已经完成了测试用例工程和具体测试用例的编写,此时我们有公用的函数类和具体的测试用例文件,上面已经介绍过结构了,此处不再累述。

(2)编写InstrumentationTestRunner类

由于我们要重写InstrumentationTestRunner类,所以在我们的测试工程公共类中,如:/src/com/zhongchou/CommonFunctions路径下创建类文件InstrumentationTestRunner.java,内容如下:

package com.zhongchou.CommonFunctions;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.Writer;

import org.xmlpull.v1.XmlPullParserFactory;

import org.xmlpull.v1.XmlSerializer;

import android.content.Context;

import android.os.Bundle;

import android.os.Environment;

publicclass InstrumentationTestRunnerextends android.test.InstrumentationTestRunner {

private Writer mWriter;

private XmlSerializer mTestSuiteSerializer;

privatelongmTestStarted;

privatestaticfinal String JUNIT_XML_FILE = "TEST-all.xml";

@Override

publicvoidonStart() {

try{

FilefileRobo = new File(getTestResultDir(getTargetContext()));

if(!fileRobo.exists()){

fileRobo.mkdir();

}

if(isSDCardAvaliable()){

FileresultFile = new File(getTestResultDir(getTargetContext()),JUNIT_XML_FILE);

startJUnitOutput(new FileWriter(resultFile));

}else{

startJUnitOutput(new FileWriter(new File(getTargetContext().getFilesDir(), JUNIT_XML_FILE)));

}

}

catch(IOException e){

thrownewRuntimeException(e);

}

super.onStart();

}

void startJUnitOutput(Writer writer) {

try {

mWriter = writer;

mTestSuiteSerializer = newSerializer(mWriter);

mTestSuiteSerializer.startDocument(null, null);

mTestSuiteSerializer.startTag(null, "testsuites");

mTestSuiteSerializer.startTag(null, "testsuite");

} catch (Exception e) {

thrownewRuntimeException(e);

}

}

privatebooleanisSDCardAvaliable(){

return Environment.getExternalStorageState()

.equals(Environment.MEDIA_MOUNTED);

}

private String getTestResultDir(Context context){

StringpackageName = "/" + "robotium";

Stringfilepath = context.getCacheDir().getPath() + packageName;

if(android.os.Build.VERSION.SDK_INT < 8){

if(isSDCardAvaliable()){

filepath= Environment.getExternalStorageDirectory().getAbsolutePath()+packageName;

}

}else{

if(isSDCardAvaliable()){

filepath= Environment.getExternalStorageDirectory().getAbsolutePath()+packageName;

}

}

return filepath;

}

private XmlSerializer newSerializer(Writer writer) {

try {

XmlPullParserFactory pf =XmlPullParserFactory.newInstance();

XmlSerializer serializer =pf.newSerializer();

serializer.setOutput(writer);

return serializer;

} catch (Exception e) {

thrownewRuntimeException(e);

}

}

@Override

publicvoidsendStatus(int resultCode, Bundle results) {

super.sendStatus(resultCode, results);

switch (resultCode) {

caseREPORT_VALUE_RESULT_ERROR:

caseREPORT_VALUE_RESULT_FAILURE:

caseREPORT_VALUE_RESULT_OK:

try {

recordTestResult(resultCode,results);

} catch (IOException e) {

thrownewRuntimeException(e);

}

break;

caseREPORT_VALUE_RESULT_START:

recordTestStart(results);

default:

break;

}

}

void recordTestStart(Bundle results) {

mTestStarted = System.currentTimeMillis();

}

void recordTestResult(int resultCode, Bundle results) throws IOException {

float time = (System.currentTimeMillis() - mTestStarted) / 1000.0f;

String className = results.getString(REPORT_KEY_NAME_CLASS);

String testMethod = results.getString(REPORT_KEY_NAME_TEST);

String stack = results.getString(REPORT_KEY_STACK);

int current = results.getInt(REPORT_KEY_NUM_CURRENT);

int total = results.getInt(REPORT_KEY_NUM_TOTAL);

mTestSuiteSerializer.startTag(null, "testcase");

mTestSuiteSerializer.attribute(null, "classname",className);

mTestSuiteSerializer.attribute(null, "name",testMethod);

if (resultCode != REPORT_VALUE_RESULT_OK) {

mTestSuiteSerializer.startTag(null, "failure");

if (stack != null) {

String reason = stack.substring(0,stack.indexOf('\n'));

String message = "";

int index = reason.indexOf(':');

if (index > -1) {

message =reason.substring(index+1);

reason =reason.substring(0, index);

}

mTestSuiteSerializer.attribute(null, "message",message);

mTestSuiteSerializer.attribute(null, "type",reason);

mTestSuiteSerializer.text(stack);

}

mTestSuiteSerializer.endTag(null, "failure");

} else {

mTestSuiteSerializer.attribute(null, "time",String.format("%.3f", time));

}

mTestSuiteSerializer.endTag(null, "testcase");

if (current == total) {

mTestSuiteSerializer.startTag(null, "system-out");

mTestSuiteSerializer.endTag(null, "system-out");

mTestSuiteSerializer.startTag(null, "system-err");

mTestSuiteSerializer.endTag(null, "system-err");

mTestSuiteSerializer.endTag(null, "testsuite");

mTestSuiteSerializer.flush();

}

}

@Override

publicvoidfinish(int resultCode, Bundle results) {

endTestSuites();

super.finish(resultCode, results);

}

void endTestSuites() {

try {

mTestSuiteSerializer.endTag(null, "testsuites");

mTestSuiteSerializer.endDocument();

mTestSuiteSerializer.flush();

mWriter.flush();

mWriter.close();

} catch (IOException e) {

thrownewRuntimeException(e);

}

}

}

代码是网上提供的,并且有相应的注释,在此就不讲解代码了。

(3)修改AndroidManifest.xml配置

修改AndroidManifest.xml文件如下,使用InstrumentationTestRunner运行测试用例。

将下面两句:

android:targetPackage="com.subject.zhongchou"
/>

修改成:

android:targetPackage="com.subject.zhongchou"
/>

(4)修改Run Configurations配置

当我们修改了xml文件后,还需要修改一下Run Configurations配置。右击项目,选择“Run as”à“Run
Configurations…”,在打开的窗口中左侧的“Andriod JUnit
Test”下选择要设置的项目,如“AllTests”。然后在右侧选择“Run all tests in the selected
project or package”,单击“Instrumention
runner”后面的下拉框,就可以看到我们在Xml文件中填写的“com.zhongchou.CommonFunctions.InstrumentationTestRunner”,然后单击“run”按钮,则测试用例就会在我们的测试机上运行起来。如图7.3.1所示:

图7.3.1 配置RunConfiguration

(5)查看测试报告

经过上面的配置,通过我们重写后的InstrumentationTestRunner运行测试用例,会在手机上/sdcard/robotuim/下生成测试报告文件TEST-all.xml。如图7.3.2所示:

图7.3.2 在手机上生成测试报告

注:和前面的两种方法不同,此方法生成的测试报告在手机卡上,所以不需要Root手机,以设置权限等操作。

(6)取出测试报告

测试用例是在手机上运行的,所以产生的测试也在手机中。虽然我们可以直接用手机查看报告,可是还是不如在电脑上查看的方便。现在我们在测试工程中创建文件夹“test-output”,使用下面的命令将测试报告拉取到这个文件夹中:

C:\adbpull /sdcard/robotium/TEST-all.xml
D:\robotiumautotest\ZhongChouDemo\test-output\

然后在打开测试报告文件,内容如下:

(7)总结

经过重写InstrumentationTestRunner后,我们可以定义测试报告保存的位置,不需要对手机进行root和对系统文件进行权限设置。相对来说限制条件少了一些儿,当然有现成的代码,我们也不需要修改什么,如果你的编码能力还可以,可以根据自己的需要,重写上面的类。

转自http://blog.csdn.net/dragonking0318/article/details/45478891

Robotium测试报告的生成方法(上)的更多相关文章

  1. Robotium测试报告的生成方法(下)

    7.4 测试报告优化 通过上面的三种方法,我们都可以得到一个Xml格式的测试报告,不过这不是我们想要的,因为这样的报告读起来很费劲,而且这样的报告发给领导们也是不行的.所以我们要美化一下才行,一般都是 ...

  2. 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

    官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...

  3. 关于python3 使用pycharm+unittest+html+HTMLTestRunner 测试用例运行正常,但却不能生成测试报告的解决方法

    关于python3 使用pycharm+unittest+html+HTMLTestRunner 测试用例运行正常,但却不能生成测试报告的解决方法 这个问题我也遇到过,以下是解决办法   该方法适用于 ...

  4. 脚本可执行,但无HTML测试报告文件生成,其造成的原因是在PyCharm的执行模式错误

    定义测试报告两种写法: 1)测试报告直接在本地绝对路径下生成 # 导入HTMLTestRunner模块 import HTMLTestRunner # 通过open()方法以二进制写模式('wb')打 ...

  5. Spring源码学习之:@async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的.    spring 在扫描be ...

  6. 细聊分布式ID生成方法

    细聊分布式ID生成方法 https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=403837240&idx=1&sn=ae9 ...

  7. 分布式环境下的id生成方法

    分布式环境下的id生成方法   前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...

  8. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  9. 分布式Unique ID的生成方法

    分布式Unique ID的生成方法 分布式的Unique ID的用途如此广泛,从业务对象Id到日志的TraceId,本文总结了林林总总的各种生成算法. 1. 发号器 我接触的最早的Unique ID, ...

随机推荐

  1. 【extjs6学习笔记】1.13 初始: 模型

    Ext JS包括数据包Ext.data包括处理从服务器保存和检索数据的类. 以下是Ext JS 6数据包中的重要类: Model (Ext.data.Model) Store (Ext.data.St ...

  2. DB错误代码大全

    db2错误代码大全  sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引 ...

  3. 在数据绑定控件(如:Repeater)中使用if判断

    方法: target="<%# DataBinder.Eval(Container.DataItem, "数据库字段").ToString() == "t ...

  4. jQuery-安装方法(2类)

    一.下载到本地,调用本地jQuery库 下载地址:http://jquery.com/download/ 共有两个版本的 jQuery 可供下载: 1.精简版:用于实际的网站中,已被精简和压缩. 2. ...

  5. 使用Intellij IDEA 14.0.2 编译项目耗时特别长的问题

    前段时间在使用IDEA编译项目时后台编译会一直Hang在那.如图: 刚开始以为是升级将IDEA从13升级至14的问题,退回到13 问题依就.Google了下,按照相应方法还是无果,没办法 还重装了下系 ...

  6. Android(java)学习笔记153:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  7. iOS 常用正则表达式

    今天看到一个正则表达式的文章,总结的挺好的,就自己转载一下,我还会陆续加入一些我自己看到常用的正则表达式 (原地址:http://www.code4app.com/blog-721976-112.ht ...

  8. oracle安装报错[INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置)解决方法!

    最近在电脑上安装oracle12c,安装时,在执行检查环境步骤时候报错: [INS-30131]执行安装程序验证所需的初始设置失败(无法访问临时位置) 最后在网上搜索解决方法,特记录下,以防以后再用到 ...

  9. Oracle11g 主机身份证明问题

    oracle 11g的web database control中,进行一些操作需要主机身份证明,比如进行数据备份.数据的导出导入等;这样对于数据库的安全增强了一定的保证.如果我们有进行适当的配置,可以 ...

  10. css3媒体查询中device-width和width的区别

    1.device-width 定义:定义输出设备的屏幕可见宽度. 不管你的网页是在safari打开还是嵌在某个webview中,device-width都只跟你的设备有关,如果是同一个设备,那么他的值 ...