您的位置:首页 > 移动开发 > Android开发

android 使用Robotium自动化测试

2017-11-17 15:44 615 查看
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吧。

这就是黑盒测试,比较简单,成本还好。如果是白盒测试,那就成本要高了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: