AndroidX Test学习实践

如果你也正在学习单元测试的相关内容,请看:

  1. 单元测试入门
  2. Junit学习实践
  3. AndroidX Test学习实践
  4. Mockito学习实践

AndroidX Test 是Jetpack库的集合,可以使测试用例运行在Android APP,它同样提供了一系列工具帮忙编写测试用例。

ActivityScenarioRule


@RunWith(AndroidJUnit4::class.java)
@LargeTest
class MyClassTest {
  @get:Rule
  val activityRule = ActivityScenarioRule(MyClass::class.java)

  @Test fun myClassMethod_ReturnsTrue() {
    activityRule.scenario.onActivity { … } // Optionally, access the activity.
   }
}

ActivityScenarioRule会在测试开始时启动一个activity,测试结束时关闭activity。
调用它的getScenario方法会返回ActivityScenario。

ActivityScenario

ActivityScenario用来启动和控制activity生命周期。

Before:
  MyActivity activity = Robolectric.setupActivity(MyActivity.class);
  assertThat(activity.getSomething()).isEqualTo("something");

After:
  try(ActivityScenario<MyActivity> scenario = ActivityScenario.launch(MyActivity.class)) {
    scenario.onActivity(activity -> {
      assertThat(activity.getSomething()).isEqualTo("something");
    });
  }

Before:
  ActivityController<MyActivity> controller = Robolectric.buildActivity(MyActivity.class);
  controller.create().start().resume();  // Moves the activity state to State.RESUMED.
  controller.pause();    // Moves the activity state to State.STARTED. (ON_PAUSE is an event).
  controller.stop();     // Moves the activity state to State.CREATED. (ON_STOP is an event).
  controller.destroy();  // Moves the activity state to State.DESTROYED.

After:
  try(ActivityScenario<MyActivity> scenario = ActivityScenario.launch(MyActivity.class)) {
    scenario.moveToState(State.RESUMED);    // Moves the activity state to State.RESUMED.
    scenario.moveToState(State.STARTED);    // Moves the activity state to State.STARTED.
    scenario.moveToState(State.CREATED);    // Moves the activity state to State.CREATED.
    scenario.moveToState(State.DESTROYED);  // Moves the activity state to State.DESTROYED.
  }

它在测试结束时不会自动关闭activity,需要出发close,建议使用ActivityScenarioRule,ActivityScenarioRule在测试结束时会自动关闭activity。

FragmentScenario

FragmentScenario用来启动和管理fragment的生命周期。
添加依赖

dependencies {
    val fragment_version = "1.5.7"

    debugImplementation("androidx.fragment:fragment-testing:$fragment_version")
}

可以通过launchInContainer或launch创建fragment。

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        // The "fragmentArgs" argument is optional.
        val fragmentArgs = bundleOf(“selectedListItem” to 0)
        val scenario = launchFragmentInContainer<EventFragment>(fragmentArgs)
        ...
    }
}

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        // The "fragmentArgs" arguments are optional.
        val fragmentArgs = bundleOf("numElements" to 0)
        val scenario = launchFragment<EventFragment>(fragmentArgs)
        ...
    }
}

通过触发moveToState方法,改变fragment的生命周期

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<EventFragment>(
            initialState = Lifecycle.State.INITIALIZED
        )
        // EventFragment has gone through onAttach(), but not onCreate().
        // Verify the initial state.
        scenario.moveToState(Lifecycle.State.RESUMED)
        // EventFragment moves to CREATED -> STARTED -> RESUMED.
        ...
    }
}

ServiceTestRule

ServiceTestRule用来启动或绑定service,并在测试结束时自动关闭或解绑。它不支持IntentService测试。


@RunWith(AndroidJUnit4::class.java)
@MediumTest
class MyServiceTest {
  @get:Rule
  val serviceRule = ServiceTestRule()

  @Test fun testWithStartedService() {
    serviceRule.startService(
      Intent(ApplicationProvider.getApplicationContext<Context>(),
      MyService::class.java))
    // Add your test code here.
  }

  @Test fun testWithBoundService() {
    val binder = serviceRule.bindService(
      Intent(ApplicationProvider.getApplicationContext(),
      MyService::class.java))
    val service = (binder as MyService.LocalBinder).service
    assertThat(service.doSomethingToReturnTrue()).isTrue()
  }
}

AndroidJUnitRunner

AndroidJUnitRunner是一个Junit测试运行程序。可在Android设备上运行Junit3或Junit4型测试,包括使用 Espresso 和 UI Automator 测试框架的测试类。此测试运行程序负责将测试软件包和被测应用加载到设备上,运行测试并报告测试结果。

  • End

参考:

  1. Set up project for AndroidX Test
  2. AndroidJUnitRunner
  3. Test your fragments
  4. Fundamentals of testing Android apps
  5. Espresso
  6. UI Automator
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如果你也正在学习单元测试的相关内容,请看: 单元测试入门[https://www.jianshu.com/p/c6...
    慎独静思阅读 293评论 0 0
  • 如果你也在学单元测试,不妨看一下这几篇文章: 单元测试入门[https://www.jianshu.com/p/c...
    慎独静思阅读 585评论 0 0
  • 前言 想想接触Android也有三年多的时间了,实际开发也有两年的时间了,好像也很少接触到Android自动化测试...
    fodroid阅读 7,351评论 1 47
  • SpringBoot是什么? springBoot是整合spring技术栈的一站式框架同时也是简化技术栈的快速开发...
    wojiaoJ阅读 1,183评论 0 0
  • 什么是单元测试 单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正...
    飘漂缥阅读 254评论 0 0

友情链接更多精彩内容