Android Test 学习基础
2016年03月26日 星期六, 发表于 上海
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
开发安卓也有很长一段时间了,但是很少用到测试框架, 平时写用都靠打 log 进行调试和测试, 运行的对不对,异常情况的处理,边界条件的处理,全靠自己的想象,写出来的代码和应用健壮性可想而知!
所以学习测试框架是很有必要的一件事,虽然在公司可能很少会用到,因为你可能没有时间去写一个测试案例! 其工作量不亚于实现一个应用功能, 但是我觉得测试是对自己所写代码的一种负责!
基础
Android 的测试种类:
- Unit Test (单元测试)
-
JUnit Test
这个只能用来测试无关Android平台的功能代码, 只能在本地运行
-
Instrumentation Unit Test
这种单元测试运行在 Android 系统中, 这些测试可以获取到测试应用的上下文信息,用来测试有 Android API 的代码
-
- Integration Tests (集成测试)
-
Components within your app only
这种类型的测试用来验证当用户进行了一个特定的操作或者特定的输入,目标应用的行为是否和预期一样。 像
这种UI测试框架就能允许你模拟用户的动作,能测试复杂的应用交互1
Espresso
-
Cross-app Components
这种测试就是用来验证多个不同的应用间或者 应用和系统应用间的正确交互
-
配置测试 (Android Studio/Java/Kotlin)
在 Android Studio 中 Junit Test 的默认的测试文件夹在
, Instrumentation Test 的文件夹在1
src/test/java
也可以再 buid.gradle 里面重新设置目录,或者加入新的目录, 比如我想用 kotlin 来写单元测试1
src/androidTest/java
1 2 3 4 5 6 7 | android { sourceSets { main.java.srcDirs += 'src/main/kotlin' test.java.srcDirs += 'src/test/kotlin' androidTest.java.srcDirs += 'src/androidTest/kotlin' } } |
JUnit Tests
JUnit Test 测试配置比较简单, 他的依赖只有一个, 使用的是 JUnit4
1 2 3 | dependencies { testCompile 'junit:junit:4.12' } |
然后在
新建一个 MainUnitTest.kt(名字随意)1
src/test/xx.xx.xx/
1 2 3 4 5 6 | class MainUnitTest { @Test fun testSample() { println("hello") } } |
然后在菜单里点击
-> 1
buid
, 在弹出的面板里面,选择1
select build variants
为 1
Test Artifact
,1
Unit Tests
然后再 Project 面板里面,鼠标右击 MainUnitTest.kt, 在弹出的菜单中选择 run MainUnitTest, 就可以运行MainUnitTest 里面所有的 @Test 声明的方法
Instrumentation Tests
Instrumentation Tests 所需要依赖的东西就比较多一点
1 2 3 4 5 6 7 8 9 10 11 | dependencies { androidTestCompile 'com.android.support.test:runner:0.4' androidTestCompile 'com.android.support.test:rules:0.4' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' // 这个需要应用的 api > 18, 所以低api可以把它注释掉 androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' // 如果出现 (Warning:Conflict with dependency 'com.android.support:support-annotations'...) // 这种警告可以添加这一条, androidTestCompile 'com.android.support:support-annotations:23.1.0' } |
设置
作为默认的 test instrumentation runner, 配置 build.gradle1
AndroidJUnitRunner
1 2 3 4 5 | android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } } |
在
下添加 MainActivtyTest.kt1
src/androidTest/XX.XX.XX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class MainActivityTest : ActivityInstrumentationTestCase2<MainActivity>(MainActivity::class.java) { @Before public override fun setUp() { super.setUp(); // Injecting the Instrumentation instance is required // for your test to run with AndroidJUnitRunner. injectInstrumentation(InstrumentationRegistry.getInstrumentation()); } @Test fun pressBackTwice() { activity // getActivity() // 测试连续两次点击返回是否退出应用 Espresso.pressBack() Thread.sleep(1000) Espresso.pressBack() } @After public override fun tearDown(){ super.tearDown(); } } |
然后在菜单里点击
-> 1
buid
, 在弹出的面板里面,选择1
select build variants
为 1
Test Artifact
,1
Android Instrumentation Tests
然后再 Project 面板里面,鼠标右击 MainUnitTest.kt, 在弹出的菜单中选择 run MainUnitTest, 就可以运行MainUnitTest 里面所有的 @Test 声明的方法
其他
有一个简便的添加单元测试类的方法, 就是打开需要测试的类,在文件里面点击右键选择
-> 1
Go To
在弹出的对话框中选择 Junit4, 其他的选择随意,点击确定即可创建单元测试类,1
Test Subject
注意创建的单元测试类的位置是根据 build variants面板中所选择的 Test Artifact 来定的, 即如果选择的 Unit Tests,则文件位置为 src/test/XX 下, 如果选择的 Instrumentation Tests 则位置为 src/androidTest/XX 下