如果失败,我正在尝试重新开始我的测试。我创建了一个规则,它正在执行,但问题出在应用程序上。我必须手动重新启动它。目前,我可以杀死它,但不知道如何重新启动它。
规则代码:
class RetryFailedTestRule(retryCount: Int = 1) : TestRule {
private val timesToRunTestCount = retryCount + 1
override fun apply(base: Statement, description: Description): Statement {
return statement(base, description)
}
private fun statement(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
for (runCount in 1..timesToRunTestCount) {
try {
println("--> Attempt #$runCount")
base.evaluate()
println("--> Success at #$runCount")
break
} catch (t: Throwable) {
if (runCount == timesToRunTestCount) {
println("<-- Attempt #$runCount failed. No more attempts.")
throw t
}
System.err.println(
"${description.methodName}: test failed on run: `$runCount`." +
" Will run a maximum of `$timesToRunTestCount` times."
)
println("<-- Attempt #$runCount failed. Repeating.")
finishOnUiThread()
}
}
}
}
}
重启代码:
@OptIn(ExperimentalPermissionsApi::class)
private fun finishOnUiThread() {
val instrumentation = InstrumentationRegistry.getInstrumentation()
instrumentation.runOnMainSync {
finishActivity()
}
instrumentation.waitForIdleSync()
ActivityScenario.launch(AppActivity::class.java)
}
private fun finishActivity() {
println("RetryFailedTestRule finishActivity")
val activities: MutableList<Activity> = ArrayList()
for (stage in EnumSet.range(Stage.CREATED, Stage.STOPPED)) {
activities.addAll(
ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(stage)
)
}
for (activity in activities) {
println("RetryFailedTestRule list of activities $activities")
if (!activity.isFinishing) {
try {
activity.finish()
} catch (e: RuntimeException) {
println("Failed to finish activity")
}
}
}
}
所以它完成了应用程序,但无法像测试前一样启动它。我已经为旧 UI 尝试了不同的东西,但这些都不适用于 Compose。还有其他方法吗?