android 使用Robotium自动化测试
Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。
我这里介绍是eclipse进行黑盒测试。
1、重签名apk
把apk的后缀名改成zip,然后删掉里面META-INF这个文件夹,重新把后缀名改回apk。
复制eclipse下面默认的签名证书:
使用cmd命令进入需要签名的目录,apk和签名证书放在一起。
重签名的命令:
jarsigner -verbose -keystore debug.keystore -storepass android -signedjar OsmdroidSample_news.apk -digestalg SHA1 -sigalg MD5withRSA OsmdroidSample.apk androiddebugkey
eclipse默认调试签名证书是debug.keystore,密码是android,别名androiddebugkey,别名的密码android
如果出现找不到证书链,那就是签名的别名不对
OsmdroidSample_news.apk成功的apk。其实重签名就是删除之前的签名,改成默认eclipse默认的调试的签名证书。
重签名之后apk,就装在真机上。
2、查看apk里面id的自带工具
在F:\adt-bundle-windows-x86_64-20140321\sdk\tools目录下有个文件uiautomatorviewer.bat ,双击这个文件
点击刚刚装的apk
在点击下图
相关的界面出来,在右侧能找到id。对后面写测试点击id就有用了。
切换界面了还是要点击红色箭头那个。
3、eclipse创建项目写代码了
下一步,填写名称,再下一步选第一个,第二个是白盒测试
最后就是finish了。
创建完项目之后就是配置
选择JUint
下一步,选择JUint4 finish就行了。
新建一个libs文件夹,把jar复制进行。
配置好了。下面可以开始写代码了。
4、写代码
manifest的配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.support.v7.appcompat.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="19" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.osmdroid.sample" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>
</manifest>
其中android:targetPackage="com.osmdroid.sample"这个就是你要测试应用程序的包名。
部分示例代码:
package com.osmdroid.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.robotium.solo.Solo;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.Button;
import android.widget.TextView;
public class OsmdroidTest extends ActivityInstrumentationTestCase2{
private static final String cls = "com.osmdroid.sample.MainActivity";
private static Class<?> target;
private Solo solo;
static {
try {
target = Class.forName(cls);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public OsmdroidTest() {
super(target);
}
@Before
protected void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
@After
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
}
@Test
public void test() {
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button1"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button3"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button4"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button5"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button6"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button7"));
solo.sleep(500);
solo.goBack();
solo.sleep(1000);
solo.clickOnView((Button) solo.getView("com.osmdroid.sample:id/"
+ "button2"));
solo.sleep(500);
solo.goBack();
// EditText earthP = (EditText) solo
// .getView("com.osmdroid.sample:id/EditTextValue_1");
// solo.clearEditText(earthP);
// solo.enterText(earthP, "804671.2996");
//
// EditText x = (EditText) solo.getView("com.osmdroid.sample:id/EditTextOutputX");
// String xValue = x.getText().toString();
// assertEquals("计算不正确", "2636657.570", xValue);
// solo.goBack();
}
}
@Before 被这个注解的方法会阻塞 @Test 注解方法,在 @Test 注解方法前执行,如果存在多个 @Before 方法,执行顺序随机。这个注解的方法主要用来执行一些测试的设置。
@After 被这个注解标志的方法,会在所有的 @Test 方法之后执行,主要用来释放资源的操作
@Test 被这个注解标志的方法,就是你的测试方法,一个单元测试类可以有多个测试方法。
@Test(timeout=) 带参数的 @Test 注解标签,如果方法在参数时间内没有成功完成,则返回失败。
@BeforeClass 被这个标签标注的方法,会在Class第一次加载调用,所以你可以在里面执行一个 static 方法,比如一些 static 方法是很费资源的,例如 JDBC 操作。
@AfterClass 对应着
@BeforeClass ,你可以进行一些 static 操作之后的资源释放。
具体的Solo 的更多用法请参考javadoc 文档。
右键Run As 选择Android Junit Test 就可以跑起来了。
5、注意事项
就是如果你在这个电脑上重签名,可能发给人家进行测试编译时候回出现:
Test run failed: Permission Denial: starting instrumentation ComponentInfo{com.osmdroid.test/android.test.InstrumentationTestRunner} from pid=8661, uid=8661 not allowed because package com.osmdroid.test does not have a signature matching the target com.osmdroid.sample
那就是签名证书不对了
还是让他重新签名,安装吧。
有些时候运行失败,重启一下eclipse吧。
这就是黑盒测试,比较简单,成本还好。如果是白盒测试,那就成本要高了。
上一篇: Jquery validate 对于多个同名控件的处理 博客分类: javascriptweb Jqueryvalidate
下一篇: Spring中正确使用Quartz和CronExpression quartzSpringlog4j企业应用Bean
推荐阅读
-
android 使用Robotium自动化测试
-
【移动App自动化测试4】---2基于Android系统的自动化测试环境
-
python 接口自动化测试框架-unittest框架的基本使用
-
Python自动化测试(unittest)使用BeautifulReport和HTMLTestRunner生成HTML测试报告
-
python unittest 极简自动化测试框架:二、 BeautifulReport的使用简解,生成漂亮的报告
-
Android单元测试(一):JUnit框架的使用
-
Android自动化单元测试(下)
-
Android和iOS 测试五个最好的开源自动化工具
-
Android和iOS 测试五个最好的开源自动化工具
-
Android App开发的自动化测试框架UI Automator使用教程