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
注解。为了演示这些注解的执行顺序,我们来看以下代码:
请注意,@BeforeClass 针对类运行,@Before 在函数之前运行,@After 在函数之后运行,@AfterClass 针对类运行。您能预测到此运行的输出将会是什么样子吗?
这些函数的执行顺序是 setupClass()
、setupFunction()
、test_a()
、tearDownFunction()
、setupFunction()
、test_b()
、tearDownFunction()
、setupFunction()
、test_c()
、tearDownFunction()
、tearDownClass()
。这是合理的,因为 @Before
和 @After
分别会在每个方法之前和之后运行。@BeforeClass
会在该类中的任何内容运行之前运行一次,@AfterClass
则会在该类中的所有内容运行完毕之后运行一次。
摘录自google codelab