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吧。


这就是黑盒测试,比较简单,成本还好。如果是白盒测试,那就成本要高了。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值