求Android Espresso失败测试用例1-2次重试的Kotlin/Java定制方案
Android Espresso 失败测试用例重试方案(Kotlin/Java)
核心实现思路
通过自定义JUnit TestRule 拦截测试执行流程,当测试用例执行失败时,自动重试指定次数(1-2次),规避因UI加载延迟、系统资源波动等偶发因素导致的误判失败。
Kotlin 实现
1. 自定义重试规则类
import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement class RetryRule(private val retryCount: Int = 2) : TestRule { override fun apply(base: Statement, description: Description): Statement { return object : Statement() { override fun evaluate() { var throwable: Throwable? = null // 循环执行测试,最多重试retryCount次 for (i in 0..retryCount) { try { base.evaluate() return // 测试成功,直接结束 } catch (t: Throwable) { throwable = t println("测试 ${description.displayName} 第 ${i+1} 次失败,准备重试...") } } // 所有重试均失败,抛出最后一次的异常 throw throwable!! } } } }
2. 在测试类中使用规则
在Espresso测试类中通过@Rule注解引入规则,可指定重试次数(示例设置为2次,即最多执行3次:1次原执行+2次重试):
import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class SampleEspressoTest { @get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) // 指定重试2次 @get:Rule val retryRule = RetryRule(2) @Test fun testLoginFlow() { // 你的Espresso测试代码 // onView(withId(R.id.username_input)).perform(typeText("test_user")) // ... } }
Java 实现
1. 自定义重试规则类
import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class RetryRule implements TestRule { private final int retryCount; public RetryRule() { this(2); // 默认重试2次 } public RetryRule(int retryCount) { this.retryCount = retryCount; } @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { Throwable throwable = null; for (int i = 0; i <= retryCount; i++) { try { base.evaluate(); return; } catch (Throwable t) { throwable = t; System.out.println("测试 " + description.getDisplayName() + " 第 " + (i+1) + " 次失败,准备重试..."); } } throw throwable; } }; } }
2. 在测试类中使用规则
import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SampleEspressoTest { @Rule public ActivityScenarioRule<MainActivity> activityRule = new ActivityScenarioRule<>(MainActivity.class); // 指定重试1次 @Rule public RetryRule retryRule = new RetryRule(1); @Test public void testLoginFlow() { // 你的Espresso测试代码 // onView(withId(R.id.username_input)).perform(typeText("test_user")); // ... } }
注意事项
- 仅针对偶发性失败的测试用例使用重试,不要用重试掩盖测试代码本身的逻辑问题。
- 重试次数建议控制在1-2次,过多重试会大幅增加测试总耗时。
- 若测试涉及状态变更(如数据库写入、SharedPreferences修改),需在每次重试前重置测试环境,避免上次失败的状态干扰后续重试。
内容的提问来源于stack exchange,提问作者ASHOK DAUKIYA
相关产品推荐
相关产品推荐

