把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的。
第二节讲的是脱离apk,直接在PC端截图,通过的是adb桥接的方式,调用ddmlib.jar包中的AndroidDebugBridge和IDevice的类,对其进行截屏,并保存到我想要的位置,是可以写成一个小工具的。
视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877120&courseId=712011
一、面试问题引入:
1、怎样在一个app崩溃前复现bug操作步骤?(非手工和人眼操作)
答:可以通过截图实现,在关键步骤处均进行截图操作,这样app崩溃了也能够根据之前的截图进行现场确认和步骤复现。那么如何实现截图?
可以通过:
1、monkeyrunner里面——device.takeSnapshot()
2、Robotium里面——solo.takeScreenshot(String pictureName)
面试问题:
(1)takeScreenshot的实现原理?通过哪些方法得到截图?是单线程还是多线程?得到的视图对象是单一View还是View数组?如果没有装载sdk卡,或者说想要保存在PC端,该如何处理呢?
二、Robotium实现截屏操作,及原理
具体的screenshot以及robotium在有源码的情况下的一个具体testcase类就是如下这样的示例:
复制代码
package com.li.xiami.test;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.android.robotium.solo.Solo;
import com.li.xiami.MainActivity;
import android.test.ActivityInstrumentationTestCase2;
public class ScreenShot extends ActivityInstrumentationTestCase2<MainActivity> {
//包名
static String packageName = "com.li.xiami";
//声明一个robotium的solo类
private Solo solo;
private static String tag = "xiami";
//构造方法中写好包名和类名,让ActivityInstrumentationTestCase2能够找到被测试的app
//的MainActivity
@SuppressWarnings("deprecation")
public ScreenShot(){
//super(packageName, MainActivity.class);
super(MainActivity.class);
}
@Before
protected void setUp() throws Exception {
super.setUp();
//初始化solo对象
solo = new Solo(getInstrumentation(), getActivity());
}
@After
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
}
@Test
public void test() {
solo.clickOnButton("OK");
solo.sleep(1000);
solo.takeScreenshot("123picture");
solo.sleep(3000);
}
}
复制代码
第一次运行:
但是第一次运行的时候出现了这样的问题:提示:Test Run Failed:java.lang.ClassNotFoundException
但是我该配置的都配置了(包括bulid path的配置,solo包的导入以及jnuit4的包的导入等,以及类名也检查了好几遍都是对的啊),后来才找到了问题的原因:
我的project.properties中的target=android-18,然后我的AndroidManifest.xml中配置的uses-sdk的targetSdkVersion是写的17:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
所以就出现了这个问题,把这个也修改成18之后,程序就能跑通了。。。
问题总结:
1、robotium中可能出现的Test run failed:classnotfoundexception的可能原因:
(1)jar包的导入有问题,需要确认build path的Libraries和Order and Export,都需要勾选上
(2)真的是待测的apk的MainActivity的类没找到,比如说有源码的情况,类名写错了;或者是无源码的情况,MainActivity的类名获取错误了进而也写错了导致出现的这个问题
(3)就是刚才出现的这个project.properties中的target与androidManifest.xml中配置的targetSdkVersion不匹配
所有说各种问题啊,不一定报的这个exception,就一定是你class not found。。。
第二次运行:
第二次运行好不容易跑通了,但是通过DDMS里面的File Explorer工具查看mnt/sdcard/Robotium-Screenshots目录下查看是否生成了我想要的文件,结果发现根本就没有Robotium-Screenshots文件夹,也就是说当第一次往sdk卡里面写东西的时候,竟然连文件夹都没有建立起来,那就要想到是不是权限问题?
然后就需要配置uses-permission节点:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
配置这个节点的具体位置在:manifest里面,但是在Application节点之外,而且在Application节点以上,否则会报错。。。
第二节讲的是脱离apk,直接在PC端截图,通过的是adb桥接的方式,调用ddmlib.jar包中的AndroidDebugBridge和IDevice的类,对其进行截屏,并保存到我想要的位置,是可以写成一个小工具的。
视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877120&courseId=712011
一、面试问题引入:
1、怎样在一个app崩溃前复现bug操作步骤?(非手工和人眼操作)
答:可以通过截图实现,在关键步骤处均进行截图操作,这样app崩溃了也能够根据之前的截图进行现场确认和步骤复现。那么如何实现截图?
可以通过:
1、monkeyrunner里面——device.takeSnapshot()
2、Robotium里面——solo.takeScreenshot(String pictureName)
面试问题:
(1)takeScreenshot的实现原理?通过哪些方法得到截图?是单线程还是多线程?得到的视图对象是单一View还是View数组?如果没有装载sdk卡,或者说想要保存在PC端,该如何处理呢?
二、Robotium实现截屏操作,及原理
具体的screenshot以及robotium在有源码的情况下的一个具体testcase类就是如下这样的示例:
复制代码
package com.li.xiami.test;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.android.robotium.solo.Solo;
import com.li.xiami.MainActivity;
import android.test.ActivityInstrumentationTestCase2;
public class ScreenShot extends ActivityInstrumentationTestCase2<MainActivity> {
//包名
static String packageName = "com.li.xiami";
//声明一个robotium的solo类
private Solo solo;
private static String tag = "xiami";
//构造方法中写好包名和类名,让ActivityInstrumentationTestCase2能够找到被测试的app
//的MainActivity
@SuppressWarnings("deprecation")
public ScreenShot(){
//super(packageName, MainActivity.class);
super(MainActivity.class);
}
@Before
protected void setUp() throws Exception {
super.setUp();
//初始化solo对象
solo = new Solo(getInstrumentation(), getActivity());
}
@After
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
}
@Test
public void test() {
solo.clickOnButton("OK");
solo.sleep(1000);
solo.takeScreenshot("123picture");
solo.sleep(3000);
}
}
复制代码
第一次运行:
但是第一次运行的时候出现了这样的问题:提示:Test Run Failed:java.lang.ClassNotFoundException
但是我该配置的都配置了(包括bulid path的配置,solo包的导入以及jnuit4的包的导入等,以及类名也检查了好几遍都是对的啊),后来才找到了问题的原因:
我的project.properties中的target=android-18,然后我的AndroidManifest.xml中配置的uses-sdk的targetSdkVersion是写的17:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
所以就出现了这个问题,把这个也修改成18之后,程序就能跑通了。。。
问题总结:
1、robotium中可能出现的Test run failed:classnotfoundexception的可能原因:
(1)jar包的导入有问题,需要确认build path的Libraries和Order and Export,都需要勾选上
(2)真的是待测的apk的MainActivity的类没找到,比如说有源码的情况,类名写错了;或者是无源码的情况,MainActivity的类名获取错误了进而也写错了导致出现的这个问题
(3)就是刚才出现的这个project.properties中的target与androidManifest.xml中配置的targetSdkVersion不匹配
所有说各种问题啊,不一定报的这个exception,就一定是你class not found。。。
第二次运行:
第二次运行好不容易跑通了,但是通过DDMS里面的File Explorer工具查看mnt/sdcard/Robotium-Screenshots目录下查看是否生成了我想要的文件,结果发现根本就没有Robotium-Screenshots文件夹,也就是说当第一次往sdk卡里面写东西的时候,竟然连文件夹都没有建立起来,那就要想到是不是权限问题?
然后就需要配置uses-permission节点:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
配置这个节点的具体位置在:manifest里面,但是在Application节点之外,而且在Application节点以上,否则会报错。。。