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

如何检测MacroBenchmark是否正在运行?

检测MacroBenchmark运行状态并连接本地WireMock服务器

实现方案

你可以通过两种可靠方式检测MacroBenchmark的运行状态,进而触发与本地WireMock的连接逻辑:

1. 利用MacroBenchmark生命周期回调

MacroBenchmark提供了基准测试生命周期的回调节点,你可以在测试开始/结束的钩子中添加状态判断与WireMock连接逻辑:

class AppBenchmark {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    @Benchmark
    fun launchBenchmark() = benchmarkRule.measureRepeated {
        // 用runWithTimingDisabled包裹非测试逻辑,避免影响计时结果
        runWithTimingDisabled {
            if (benchmarkRule.isMeasuring) {
                setupWireMockConnection()
            }
        }
        // 执行基准测试核心逻辑
        startActivityAndWait<MainActivity>()
    }

    private fun setupWireMockConnection() {
        // 连接本地WireMock服务器
        val wireMock = WireMock("localhost", 8080)
        // 可添加接口验证或预设响应逻辑
        wireMock.register(WireMock.get(WireMock.urlEqualTo("/api/config"))
            .willReturn(WireMock.okJson("{\"env\":\"benchmark\"}")))
    }
}

2. 通过进程名识别状态

MacroBenchmark运行时会以带特定标识的进程名执行,你可以通过检测当前进程名判断是否处于基准测试状态:

private fun isMacroBenchmarkActive(): Boolean {
    val processName = applicationContext.packageName + ":macrobenchmark"
    return Application.getProcessName() == processName
}

在应用初始化或需要调用WireMock的时机执行该方法,返回true时再启动连接逻辑。

关键注意事项

  • 确保WireMock服务器在MacroBenchmark启动前已启动,可通过Gradle任务或shell脚本在测试前启动、测试后关闭。
  • 所有与WireMock交互的逻辑必须放在runWithTimingDisabled块内,避免连接、接口配置的耗时干扰基准测试的计时准确性。
  • 若使用AGP 7.4及以上版本,需注意适配MacrobenchmarkRule的最新API,部分旧版回调方法已被标记为废弃。

内容的提问来源于stack exchange,提问作者timr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:48:11