创建Android基线配置文件时如何清除应用测试数据?
解决Android基线配置文件测试每次运行前清除应用数据的问题
以下是几个可行的解决方案:
1. 手动删除DataStore Preferences文件
因为问题根源是DataStore存储的初始化状态导致界面变化,直接删除对应的数据文件最直接。在测试类的@Before方法中执行删除操作,确保每次测试前数据都被清空:
@Before fun clearAppData() { val targetContext = InstrumentationRegistry.getInstrumentation().targetContext // 替换为你的DataStore名称,即创建时传入的name参数 val dataStoreName = "user_preferences" val dataStoreDir = File(targetContext.filesDir, "datastore") // 删除主数据文件及相关journal文件 File(dataStoreDir, "$dataStoreName.preferences_pb").takeIf { it.exists() }?.delete() File(dataStoreDir, "$dataStoreName.preferences_pb.journal").takeIf { it.exists() }?.delete() File(dataStoreDir, "$dataStoreName.preferences_pb.journal.tmp").takeIf { it.exists() }?.delete() }
2. 利用BaselineProfileRule的setupBlock回调
在collect方法中指定setupBlock,让它在每次基线采集迭代前执行清除操作,确保测试环境干净:
@get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun generateBaselineProfile() { baselineProfileRule.collect( packageName = "com.your.app.package", setupBlock = { // 执行pm clear命令,注意去掉adb前缀,且必须关闭输入流确保命令执行完成 InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand( "pm clear com.your.app.package" ).close() } ) { // 这里编写你的基线配置操作逻辑 startActivityAndWait() onView(withId(R.id.init_destination_btn)).perform(click()) // ...其他界面操作 } }
之前命令无效是因为多了adb shell前缀,且未关闭返回的InputStream,导致命令无法完整执行。
3. 修正build.gradle的配置
确保clearPackageData参数配置在正确位置,基准测试的instrumented测试runner参数需要放在模块的defaultConfig下:
android { defaultConfig { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments += [ "clearPackageData": "true" ] } }
如果基准测试使用单独的product flavor,要把配置放到对应的flavor块中,避免配置未生效。
内容的提问来源于stack exchange,提问作者Barry Irvine
相关产品推荐
相关产品推荐

