“单元测试”测试模块内部方法或类。“集成测试”测试模块间的调用。
Android官方测试文档:https://developer.android.com/training/testing/index.html
Android studio 测试文档:https://developer.android.com/studio/test
Android单元测试内容:
有复杂逻辑的类:
1、算法类。如字符串转数字、时间转换等。
2、协议类,各种通讯协议。网络、串口等。在后台或外部协议模块未完成前根据协议,编写桩模块进行测试。
3、UI控制类,依赖用户操作和外部数据来显示不同的UI状态。通常需要模拟用户输入数据和外部数据桩模块。(参考/package/app/TV/tests)
1.JUnit
2.Mock
1、不依赖android环境的单元测试对于系统代码依赖较强的代码无法测试,因为JUnit需要在IDE环境运行,运行之前需要保证代码编译无报错。对于此类型测试,可以直接使用instrumentation代替。
2、对于依赖android 环境的测试则可以使用adb instrumentation command或IDE测试。
命令行测试见:
https://developer.android.com/studio/test/command-line
Android仪器测试:
Instrumentation Test:
环境:Android7.0
1、建立测试类
package your.package.name.util;
import android.test.AndroidTestCase;
import android.util.Log;
/*继承AndroidTestCase,并实现setUp()和tearDown()方法*/
public class UtilTest extends AndroidTestCase{
private final String TAG = "UtilTest";
/**
* Called before run() is called.
* 可以做测试前的初始化动作。
* 注:每个测试方法运行前都会前执行SetUp(),测试方法执行完后,又会执行tearDown()
*/
@Override
public void setUp() throws Exception {
super.setUp();
Log.d(TAG,"setUp:");
}
/*被测试方法名要以test开头*/
public void testCase1() throws Exception {
Log.d(TAG, "testCase1:");
assertEquals(0,0);
}
public void testCase2() throws Exception {
Log.d(TAG, "testCase1:");
assertEquals(0,0);
}
/**
* Called after run() is called, even if run() threw an exception, but
* not if setUp() threw an execption.
*/
@Override
public void tearDown() throws Exception {
super.tearDown();
Log.d(TAG,"tearDown");
}
}
2、编写AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hisilicon.tvsetting.tests" >
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="21" />
<instrumentation
android:name="android.support.test.runner.AndroidJUnitRunner"
android:label="HiTvSetting Unit Tests"
android:targetPackage="your.package.name" />
<application android:label="HiTvSettingTest" >
<uses-library android:name="android.test.runner" />
</application>
</manifest>
添加instrumentation标签,targetPackage指定被测试包名。
添加库依赖
3、编写Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
# 添加测试库依赖
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test
# 签名要与被测试应用一致,这里以系统签名为例。
LOCAL_CERTIFICATE := platform
LOCAL_PACKAGE_NAME := YourAppTests
# 被测试应用名称
LOCAL_INSTRUMENTATION_FOR := YourApp
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 23 # M
include $(BUILD_PACKAGE)
4、运行测试方法
使用 adb shell am instrument 命令,使用方法见https://developer.android.com/studio/test/command-line
运行全部测试方法:
adb shell am instrument -w your.package.name.tests/android.support.test.runner.AndroidJUnitRunner
运行指定类,以UtilTest类为例:
adb shell am instrument -w -e class 'your.package.name.tests.UtilTest' your.package.name.tests/android.support.test.runner.AndroidJUnitRunner
运行执行类指定方法,以UtilTest类testCase1()为例:
adb shell am instrument -w -e class 'your.package.name.tests.UtilTest#testCase1' your.package.name.tests/android.support.test.runner.AndroidJUnitRunner
命令说明:
-w 表示等待测试运行完成,参数:<测试软件包名>/<插桩测试类名,通常是AndroidJUnitRunner>
-e 表示添加参数,如指定class