【AndroidTest】利用注解测试重复代码

AndroidTest利用注解测试重复代码

AndroidTest利用注解测试重复代码

在 Android 中,插桩测试和单元测试都让我们无需重复写代码,即可为类中的每个测试设置相同的配置。

例如,假设我们有一个包含 10 个按钮的 fragment。点击每个按钮都会转到一个唯一的 fragment。

如果我们遵循上述测试中的模式,则必须为 10 项测试中的每一项重复写类似如下的代码(请注意,此代码只是一个示例,不会在我们在此 Codelab 中使用的应用中进行编译):

val navController = TestNavHostController(
    ApplicationProvider.getApplicationContext()
)

val exampleFragmentScenario = launchFragmentInContainer<ExampleFragment>(themeResId =
R.style.Theme_Example)

exampleFragmentScenario.onFragment { fragment ->

   navController.setGraph(R.navigation.example_nav_graph)

   Navigation.setViewNavController(fragment.requireView(), navController)
}

这需要将大量代码重复写 10 次。不过,在这种情况下,我们可以使用 JUnit 提供的 @Before 注解来节省时间。为此,我们需要为一个方法添加注解,然后向该方法提供设置测试所需的代码。我们可以随意命名该方法,但应取一个相关的名称。我们无需设置同一 fragment 10 次,而只需编写一次设置代码,如下所示:

lateinit var navController: TestNavHostController

lateinit var exampleFragmentScenario: FragmentScenario<ExampleFragment>

@Before
fun setup(){
    navController = TestNavHostController(
        ApplicationProvider.getApplicationContext()
    )

    exampleFragmentScenario =  launchFragmentInContainer(themeResId=R.style.Theme_Example)

    exampleFragmentScenario.onFragment { fragment ->

       navController.setGraph(R.navigation.example_nav_graph)

       Navigation.setViewNavController(fragment.requireView(),  navController)
    }
}

现在即可在我们在此类中编写的每个测试中运行此方法,并且可以从其中的任意一个测试访问必要的变量。

同样,如果有在每次测试后都需要执行的代码,我们可以使用 @After 注解。例如,@After 可用于清理用于测试的资源,或者用于插桩测试,用来将设备恢复到特定状态。

JUnit 还提供 @BeforeClass@AfterClass 注解。这里的区别在于,带有此注解的方法只会执行一次,但执行过的代码仍会应用到每个方法。如果您的设置或拆解方法包含成本高昂的操作,则最好改为使用这些注解。带有 @BeforeClass@AfterClass 注解的方法必须放置在伴生对象中,并带有 @JvmStatic 注解。为了演示这些注解的执行顺序,我们来看以下代码:

5157ab00a9b7fb84.png

请注意,@BeforeClass 针对类运行,@Before 在函数之前运行,@After 在函数之后运行,@AfterClass 针对类运行。您能预测到此运行的输出将会是什么样子吗?

39c04aa2ba7b8348.png

这些函数的执行顺序是 setupClass()setupFunction()test_a()tearDownFunction()setupFunction()test_b()tearDownFunction()setupFunction()test_c()tearDownFunction()tearDownClass()。这是合理的,因为 @Before@After 分别会在每个方法之前和之后运行。@BeforeClass 会在该类中的任何内容运行之前运行一次,@AfterClass 则会在该类中的所有内容运行完毕之后运行一次。

摘录自google codelab

猜你喜欢

转载自blog.csdn.net/weixin_42473228/article/details/131536441