欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android 使用Robotium自动化测试

程序员文章站 2024-03-22 16:27:28
...

Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。

我这里介绍是eclipse进行黑盒测试。

1、重签名apk

把apk的后缀名改成zip,然后删掉里面META-INF这个文件夹,重新把后缀名改回apk。

复制eclipse下面默认的签名证书:

android 使用Robotium自动化测试


使用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

如果出现找不到证书链,那就是签名的别名不对

android 使用Robotium自动化测试

OsmdroidSample_news.apk成功的apk。其实重签名就是删除之前的签名,改成默认eclipse默认的调试的签名证书。

重签名之后apk,就装在真机上。

2、查看apk里面id的自带工具

在F:\adt-bundle-windows-x86_64-20140321\sdk\tools目录下有个文件uiautomatorviewer.bat ,双击这个文件

点击刚刚装的apk

在点击下图

android 使用Robotium自动化测试

相关的界面出来,在右侧能找到id。对后面写测试点击id就有用了。

切换界面了还是要点击红色箭头那个。

3、eclipse创建项目写代码了

android 使用Robotium自动化测试

下一步,填写名称,再下一步选第一个,第二个是白盒测试

android 使用Robotium自动化测试

最后就是finish了。

创建完项目之后就是配置


android 使用Robotium自动化测试


选择JUint

android 使用Robotium自动化测试

下一步,选择JUint4 finish就行了。

新建一个libs文件夹,把jar复制进行。

android 使用Robotium自动化测试


配置好了。下面可以开始写代码了。


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


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