测试的基本概念

首先解释两个概念:黑盒测试、白盒测试
所谓的黑盒测试就是针对应用的apk进行的测试,并不是基于应用源码进行的测试;白盒测试的概念则与之相反!

测试准备

对安卓应用进行测试当然必不可少的就是测试工具和测试环境的配置、测试工具准备。

测试环境和工具的搭建

1)JDK 环境搭建
2)安卓的SDK环境的搭建
3)Eclipse安装,配置ADTSDK

我想对jdk的环境搭建很简单了。
sdk的配置活儿,或许对于非安卓移动开发人员来讲,是一个难点!
但是也不要捉急,首先下载eclipse,而最方便的也是adt-bundle
链接: https://pan.baidu.com/s/1TgkFk6q7nqSaCzx0QjLVAQ 密码: uqsq
当然你也可以不使用这里的adt-bundle中的eclipse、adt和sdk,使用你之前安卓开发中安装配置过的也是ok的。。。。。但是,有可能你会遇到很多的坑,各式各样,因为我就是这么倔强,这么过来的!
当前,先依照我的正确方式走,看下我的正确便准配置(目前这个IDE在我的配置下使用是没有问题的)
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
那么有了这个adt-bundle,可查看这里进行配置
由于在配置adt和sdk过程有些地方需要注意,所以我这里就专门提醒下,防止掉坑!

ADT安装

多截取了几张图,希望能够更加清除明了
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
ADT的安装过程第6步、第5步,按照上面的勾选处理,避免浪费我们的宝贵时间。

SDK安装

安装sdk,基于国内网络安装基本无效,需要"科学上网"才行,或者配置下国内的专门跨域的代理。然后我就找到了可用的可用的代理服务
HTTP Proxy Server : mirrors.neusoft.edu.cn
HTTP Proxy Port   : 80
由于对sdk的安装是非常耗时间的,所以建议晚上下载,或许不会影响使用,也许第二天就下载完了呢!
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试

这里可能会有朋友遇到这种问题?? 为什么我点击 SDK Manager.exe 并不能看到象上图一样展示那么多的Android API版本!!
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
原因就是你和我一样好奇,勾选了不该勾选的选项,哈哈。
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
这里在配置代理的时候,这个Use downlaod cache 的选项是不能够勾选的,不然在你执行 SDK Manager.exe的时候,一直会使用已有的版本,而不去拉取并展示更多的API版本。
多一嘴,当SDK安装完成之后,不要忘记添加到系统环境变量中进行配置哦。

测试工具robotium.jar

对于测试工具嘛,这是使用的是Robotium进行的测试工作。所以呢,点击这里进行Robotium和Junit4的jar包下载
当然也可以抛弃使用re-sign.jar对apk进行重签名,操作方式则是使用命令行执行!简单飘一个我的执行命令

//重签名
jarsigner -keystore C:\Users\YJH\.android\debug.keystore -storepass android -keypass android D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid.apk androiddebugkey

//重新打包
zipalign 4 D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid.apk D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid-debug.apk

//安装
adb install D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid-debug.apk

测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试

然后就能够愉快的写测试代码了!!!
你错了,问题仍然会接连不断的出现。。。。。。。。。。

问题在线

Eclipse中创建Android Application Project 无法运行

右击项目,执行Run As/Android Application错误回现
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
错误日志是这样的

[2018-09-29 16:50:54 - Dex Loader] Failed to load D:\Android-Testing\sdk-test\android-sdk_r24.3.2-windows\android-sdk-windows\build-tools\28.0.3\lib\dx.jar
[2018-09-29 16:50:54 - SampAndroid] Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

提示的错误,就是在向我解释,ta不能够再我的sdk路径..\build-tools\28.0.3\lib下面找到 dx.jar ?!
错误原因,在project.properties文件中未指定buildtools版本,导致项目调用了buildtools的最高版本,但是我所使用的buildtools版本最高是25.0.0,固然是找不到的啦。
解决方案,在项目的project.properties文件中添加配置

project.properties 文件中配置
target=android-21
sdk.buildtools=25.0.0

Eclipse中创建Android Test Project 无法运行

右击项目,执行Run As/Android Junit Test错误回现
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
错误日志是这样的

An internal error occurred during: "Launching SampTest".
org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees.visitTreeEntry(Lorg/eclipse/jdt/internal/junit/runner/ITestIdentifier;ZI)V

这个问题目前我使用百度、google,在国内、国外网站浏览,依然不得解决!
经过我的各种尝试、反复的安装、删除。终究让我找到了解决方案,激战三天,I was the winner.
错误原因,由于使用的IDE版本问题导致。博客上文我就已经提早说过,我很倔强,没有使用adt-bundle的内容。使用的是我本机上早已经安装过的,用来做j2ee后台开发的eclipse。以及从安卓开发中的sdk环境和单独下载的adt包。所以让我一步步体验并验证了和解决了该问题。
解决方案,换IDE
我的解决方式,更换eclipse版本从
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
到eclipse版本
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试

Robotium 黑盒测试

eclipse 编写Android Application Project

new /project .../ Android /Android Application Project
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
在创建安卓项目的时候有两点需要注意,
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
这里特别说明下第二处,对于no.2处的填写,要更多的依照自己已经安装下载的sdk和android api版本进行填写。否则可能会出现你意想不到的结果。
安卓的项目创建完之后,要配置引入Robotium.jar。通过Build Path 进行配置!
测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试
Java Build Path 目录下Libraries目录下,点击Add External JARs… 添加Robotium.jar
Java Build Path 目录下Libraries目录下,点击Add Library… 添加Junit4
至此,安卓的一个普通项目创建完毕!
我是做安卓开发滴,所以写个安卓功能会很快哦!接下来简单实现一个功能,打开app进入主页,页面从上到下有三个view(TextView、Button、Button)。点击第一个Button,TextView显示一行文字;点击第二个Button,弹出Toast提示。

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final TextView tvDisplay = (TextView) findViewById(R.id.tvDisplay);
		findViewById(R.id.btnDisplay).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				tvDisplay.setText("public class MainActivity extends Activity");
			}

		});
		
		findViewById(R.id.btnToast).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(v.getContext(), "吃糖 吃糖", Toast.LENGTH_LONG).show();
			}
		});
	}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ztman.androidtest.MainActivity" >

    <TextView
        android:id="@+id/tvDisplay"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <Button 
        android:id="@+id/btnDisplay"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/tvDisplay"
        android:layout_marginTop="20dp"
        android:layout_width="100dp"
        android:layout_height="43dp"
        android:text="点击显示"
        android:textSize="15sp"
        android:gravity="center"
        />
    
    <Button 
        android:id="@+id/btnToast"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/btnDisplay"
        android:layout_marginTop="20dp"
        android:layout_width="150dp"
        android:layout_height="43dp"
        android:text="点击弹出Toast"
        android:textSize="15sp"
        android:gravity="center"
        />

</RelativeLayout>

eclipse 编写Android Text Project

创建测试项目Android Text Project,过程于创建被测试项目过程是相似的,只是在new project创建时选择Android Text Project
贴下测试代码

public class TestAPK extends ActivityInstrumentationTestCase2{

	private Solo solo;
	private static final String MainActivity="com.example.sampandroid.MainActivity";
	private static Class launchActivityClass;
	
	static {
		try {
			launchActivityClass=Class.forName(MainActivity);
		}catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}
	
	public TestAPK() throws ClassNotFoundException{
		super(launchActivityClass);
	}
	
	
	
	@Override
	protected void setUp() throws Exception{
		super.setUp();
		solo = new Solo(getInstrumentation(), getActivity());
		
	}
	
	public void testButton() {
		Activity act = solo.getCurrentActivity();
		int btnId = act.getResources().getIdentifier("btnDisplay", "id",act.getPackageName());
		solo.waitForView(btnId);
		solo.clickOnButton("点击显示");
		solo.clickOnButton(0);
		
//		TextView outMsg = (TextView)solo.getView(R.id.tvDisplay);
//		assertEquals("public class MainActivity extends Activity", outMsg.getText().toString());
	}
	
	
	
	@Override
	protected void tearDown() throws Exception{
		//销毁动作
		solo.finishOpenedActivities();
	}
	
}

点击查看源码

eclipse 执行测试

apk 重签名

成功执行效果欣赏

测试前奏 之 Robotium使用Eclipse和ADT对apk进行黑盒测试

可以看到手机中的apk被起,并自动执行测试!

相关文章: