Android Unit Test
Posted simplify20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Unit Test相关的知识,希望对你有一定的参考价值。
android Unit Test
测试框架
测试基础
概念:
- 继承JUnit,
- 通过测试包组织测试用例,
- 使用InstrumentationTestRunner或其子类运行测试,
- 使用Android Tool自动构建测试项目,
- 组件测试+特殊测试
测试框架结构:
测试包:
组件测试:
With Android instrumentation, though, you can invoke callback methods in your test code. This allows you to run through the lifecycle of a component step by step, as if you were debugging the component. The following test code snippet demonstrates how to use this to test that an Activity saves and restores its state.
// Start the main activity of the application under test mActivity = getActivity(); // Get a handle to the Activity object's main UI widget, a Spinner mSpinner = (Spinner)mActivity.findViewById(com.android.example.spinner.R.id.Spinner01); // Set the Spinner to a known position mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION); // Stop the activity - The onDestroy() method should save the state of the Spinner mActivity.finish(); // Re-start the Activity - the onResume() method should restore the state of the Spinner mActivity = getActivity(); // Get the Spinner's current position int currentPosition = mActivity.getSpinnerPosition(); // Assert that the current position is the same as the starting position assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);
AndroidTestCase
- Provider
- Application
- Service
InstrumentationTestCase
- ActivityTestCase
- TestCase2
- UnitTest
Assert
- MoreAsserts
- ViewAsserts
配置测试执行器:testInstrumentationRunner(gradle or manifest)
测试包的命名和测试类的命名Activity测试:
ActivityInstrumentationTestCase2- 不支持Mock Context以及Mock Application
- 支持Mock Intents (call setActivityIntent before getActivity)
- 可以自动创建Activity
- 不能和系统独立
ActivityUnitTestCase
- 支持Mock Context以及Mock Application
- 能和系统独立
- 不可以自动创建Activity
- 不支持Mock Intents
测神马? - View的状态
- 事件(系统事件&用户事件)
- 对Intent的响应
- 配置的改变
- 屏幕大小和分辨率
Tips on ui thread test
@UiThreadTest
方法级,问题appActivity.runOnUiThread()
块级- 一些方法只能在测试线程中调用,不能再UI线程调用
- 在setup中Turning off touch mode
ActivityInstrumentationTestCase2.setActivityTouchMode(false)
- 禁用锁屏
manifest:<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
activities:
mKeyGuardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); mLock = mKeyGuardManager.newKeyguardLock("activity_classname"); mLock.disableKeyguard();
Service测试:
主角:ServiceTestCase- 设置 setApplication,setContext(mock)
- 启动 startService,bindService
- mock application,extends MockApplication
- mock Context
IsolatedContext
RenamingDelegatingContext
测神马?
- 在某个action下,生命周期方法是否被正确的调用
- 测试Service实现的业务逻辑
ContentProvider测试
重点是独立测试环境
主角:ProviderTestCase2- 在构造器中初始化Mock Object:
IsolatedContext
&MockContentResolver
- 返回ContentProvider
- 与系统相隔离的测试环境
测神马?
- ContentResolver
- Provider中暴露的常量
- 测试增删改查
- 测试业务逻辑
第三方
uiautomator-自动化UI测试工具。<未完待续>
以上是关于Android Unit Test的主要内容,如果未能解决你的问题,请参考以下文章
About Unit Test In Android(安卓单元测试研究,附技术分享ppt)
About Unit Test In Android(安卓单元测试研究,附技术分享ppt)
为什么官方文档中的Android Instrumented Test示例不起作用?