My Avatar

GuilinDev

If you don't read your codes for more than 6 months, it will be like someone else writing it when you read it again.

Android Test Basics

03-26-2018 Monday, 发表于 Boston, USA

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)

I developed Android for a while, but rarely used the test framework, instead generally used log for debugging and testing.. The right operation, the handling of abnormal conditions, the processing of boundary conditions, all rely on their own imagination, the code and application robustness can be imagined!

So it is necessary learning test framework, although it may be rarely used in the company, because you may not have time to write a test case. The workload of writing a test case is no less than an application function, but I still think the test is necessary for coding.

Basics

Android tests including:

配置测试 (Android Studio/Java/Kotlin)

在 Android Studio 中 Junit Test 的默认的测试文件夹在

1
src/test/java
, Instrumentation Test 的文件夹在
1
src/androidTest/java
也可以再 buid.gradle 里面重新设置目录,或者加入新的目录, 比如我想用 kotlin 来写单元测试

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'
}

然后在

1
src/test/xx.xx.xx/
新建一个 MainUnitTest.kt(名字随意)

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'
}

设置

1
AndroidJUnitRunner
作为默认的 test instrumentation runner, 配置 build.gradle

1
2
3
4
5
android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

1
src/androidTest/XX.XX.XX
下添加 MainActivtyTest.kt

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();
    }
}

then click

1
buid
->
1
select build variants
, 在弹出的面板里面,选择
1
Test Artifact
1
Android Instrumentation Tests
,

然后再 Project 面板里面,鼠标右击 MainUnitTest.kt, 在弹出的菜单中选择 run MainUnitTest, 就可以运行MainUnitTest 里面所有的 @Test 声明的方法

其他

有一个简便的添加单元测试类的方法, 就是打开需要测试的类,在文件里面点击右键选择

1
Go To
->
1
Test Subject
在弹出的对话框中选择 Junit4, 其他的选择随意,点击确定即可创建单元测试类,

注意创建的单元测试类的位置是根据 build variants面板中所选择的 Test Artifact 来定的, 即如果选择的 Unit Tests,则文件位置为 src/test/XX 下, 如果选择的 Instrumentation Tests 则位置为 src/androidTest/XX 下