Android Studio单元测试的编码过程

Android Studio单元测试的编码过程

admin
2021-08-13 / 1 评论 / 195 阅读 / 正在检测是否收录...

Android Studio单元测试的编码过程

前言

本次单元测试过程中遇到了很多很多很多很多问题,技术更新迭代速度实在是太快了,网上搜到的很多东西都过时了,这里找到了一个五年前印度小哥的教学录屏[1]......本来英语不好的我听着蹩脚的印度英语,实在是折磨QAQ....
不过总体上按照他的步骤是可行的,期间遇到的各种问题也用过搜索解决了,最终磕磕绊绊完成了简单的单元测试编写。于是有了这篇技术总结。

  1. 设置测试环境

在测试开始前,首先添加 AndroidX Test API[2],以及为项目配置 Android 测试依赖项。

最终的在应用的顶级 build.gradle 文件中,依赖项如下:

dependencies {
    androidTestImplementation "org.mockito:mockito-core:2.18.0"
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'androidx.test:rules:1.4.0'
    androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
}

同时确保

    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
  1. 使用Android Studio生成测试类

    1. 鼠标标记要生成的类,按Alt+Enter,选择第一个。
      image-20210813054049548.png
    2. 在创建测试类窗口中,测试库我们选择JUnit4。类名可以自定义,建议不要改。父类不选,目标包就是项目包名,勾选setUp和tearDown。最后在要测试的方法前打勾。点击OK。
      image-20210813054312658.png
    3. 随即弹出窗口提示我们选择测试类类型,我们选Android的测试类。
      image-20210813054643013.png
    4. 由此我们得到了一个测试类,按Shift+Ctrl+T可在测试类与Activity间切换,这里创建rule并实例化。

          @Rule
          public ActivityTestRule<FirstActivity> mainActivityActivityTestRule = new ActivityTestRule<FirstActivity>(FirstActivity.class);
          private FirstActivity firstActivity = null;
      
          @Before
          public void setUp() throws Exception {
              firstActivity = mainActivityActivityTestRule.getActivity();
      
          }
    5. 这样我们就可以通过实例化的rule来获取页面元素。
      a Simple Example: 测试文本是否为空。

      1. UT代码:
      TextView t = firstActivity.findViewById(R.id.textView10);
              assertNull(t.getText());
  2. 点击测试方法左边的绿三角即可开始测试。
     ![image-20210813060836192.png][4]
  1. 以我的程序为例,来测试LED小灯的点亮功能。

    @Test
    public void light() {
        firstActivity.power = true;
        TextView[] leds = {firstActivity.findViewById(R.id.textView4), firstActivity.findViewById(R.id.textView6),
          firstActivity.findViewById(R.id.textView5), firstActivity.findViewById(R.id.textView7)};
        int[] ledStatus = {1, 1, 0, 0};
    
        final Drawable.ConstantState drawable = leds[0].getBackground().getConstantState();
        final Drawable.ConstantState drawable2 = leds[1].getBackground().getConstantState();
    
        firstActivity.light(ledStatus,leds);
    
        final Drawable.ConstantState drawable1 = leds[0].getBackground().getConstantState();
        final Drawable.ConstantState drawable3 = leds[1].getBackground().getConstantState();
    
        assertEquals(drawable,drawable1);
        assertNotEquals(drawable2,drawable3);
    }
  我的Activity部分。
public void light(int[] b, TextView[] t) {

    for (int i = 0; i < 4; i++) {
        switch (i) {
            case 0:
                if (b[i]==1) {
                    if (power) {
                        t[i].setBackgroundResource(R.drawable.lightred);
                    }
                } else if (b[i]==-1){
                    break;
                }else {
                    t[i].setBackgroundResource(R.drawable.light);
                }
                ;
                break;
            case 1:
                if (b[i]==1) {
                    if (power) {
                        t[i].setBackgroundResource(R.drawable.lightgreen);
                    }
                } else if (b[i]==-1){
                    break;
                } else {
                    t[i].setBackgroundResource(R.drawable.light);
                }
                ;
                break;
            case 2:
                if (b[i]==1) {
                    if (power) {
                        t[i].setBackgroundResource(R.drawable.lightblue);
                    }
                } else if (b[i]==-1){
                    break;
                } else {
                    t[i].setBackgroundResource(R.drawable.light);
                }
                ;
                break;
            case 3:
                if (b[i]==1) {
                    if (power) {
                        t[i].setBackgroundResource(R.drawable.lightup);
                    }
                } else if (b[i]==-1){
                    break;
                } else {
                    t[i].setBackgroundResource(R.drawable.light);
                }
                ;
                break;
            default:
                break;
        }
    }
    
}
  1. 点击测试类左边的双绿三角可开始测试类中全部测试方法的测试。
    image-20210813061040974.png

    我的测试结果:

    image-20210813062300328.png

参考文献

  1. Android app development for beginners - 26 - Android - Unit test for Activity - Activity Test Rule: https://www.youtube.com/watch?v=_TR6QcRozAg
  2. Set up project for AndroidX Test: https://developer.android.com/training/testing/set-up-project
  3. Build instrumented unit tests: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests#java
  4. Android单元测试(二):Mockito框架的使用: https://blog.csdn.net/qq_17766199/article/details/78450007
  5. Q&A on stackoverflow: https://stackoverflow.com/questions/13621407/getting-the-current-background-id-of-a-view
  6. Android单元测试-对Activity的测试: https://blog.csdn.net/Double2hao/article/details/77160950
0

评论 (1)

取消
  1. 头像
    赵洋
    Ubuntu · FireFox

    回复