You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:25:12