You need to enable JavaScript to run this app. Appium框架如何实现从Firebase/App Tester自动下载Android最新测试包
优惠活动
大模型
产品
解决方案
定价
更多

Appium框架如何实现从Firebase/App Tester自动下载Android最新测试包

实现方案参考

一、Firebase App Tester自动拉取最新APK实现

前置依赖

在项目的pom.xml中添加所需依赖:

<!-- Firebase Admin SDK -->
<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-admin</artifactId>
    <version>9.2.0</version>
</dependency>
<!-- Commons IO 用于文件下载操作 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

使用前请先在Firebase控制台生成服务账号JSON密钥,且给该账号分配Firebase App Distribution 查看者权限,否则无法拉取版本信息。

核心实现代码

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.appdistribution.FirebaseAppDistribution;
import com.google.firebase.appdistribution.Release;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.List;

public class FirebaseApkFetcher {
    // 配置项建议通过环境变量注入,不要硬编码到代码中
    private static final String SERVICE_ACCOUNT_PATH = System.getenv("FIREBASE_SERVICE_ACCOUNT_PATH");
    private static final String TARGET_SAVE_PATH = "src/test/resources/test-app.apk";
    private static final String FIREBASE_APP_ID = System.getenv("FIREBASE_ANDROID_APP_ID");
    private static final String FIREBASE_PROJECT_ID = System.getenv("FIREBASE_PROJECT_ID");

    public static void fetchLatestApk() throws IOException {
        // 初始化Firebase实例
        if (FirebaseApp.getApps().isEmpty()) {
            FileInputStream serviceAccount = new FileInputStream(SERVICE_ACCOUNT_PATH);
            FirebaseOptions options = FirebaseOptions.builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setProjectId(FIREBASE_PROJECT_ID)
                    .build();
            FirebaseApp.initializeApp(options);
        }

        // 拉取版本列表,默认按发布时间倒序返回
        List<Release> releases = FirebaseAppDistribution.getInstance().listReleases(FIREBASE_APP_ID).getReleases();
        if (releases.isEmpty()) {
            throw new RuntimeException("Firebase App Tester中未查询到任何发布版本");
        }
        Release latestRelease = releases.get(0);

        // 下载APK到指定的测试资源路径
        FileUtils.copyURLToFile(new URL(latestRelease.getBinaryDownloadUri()), new File(TARGET_SAVE_PATH));
        System.out.printf("最新测试包下载完成,版本号:%s,构建号:%s%n", 
            latestRelease.getDisplayVersion(), latestRelease.getBuildVersion());
    }
}

集成到测试流程

在测试启动前的钩子中调用拉取逻辑即可,比如用JUnit的@BeforeClass注解:

import org.junit.BeforeClass;
import java.io.IOException;

public class TestSuiteStarter {
    @BeforeClass
    public static void preTestSetup() throws IOException {
        // 测试执行前先拉取最新APK
        FirebaseApkFetcher.fetchLatestApk();
    }
}

后续Appium启动配置中的app参数直接填写TARGET_SAVE_PATH对应的路径即可,无需手动替换安装包。


二、Jenkins长期运行自动化任务行业通用实践

  • 触发规则配置
    • 优先配置Firebase webhook触发:通过Cloud Function监听App Tester的新构建事件,有新包发布时主动调用Jenkins任务webhook自动启动测试,无需定时轮询
    • 补充定时触发规则:比如每日凌晨执行全量测试用例集,覆盖核心功能回归
  • 敏感信息管理
    • 所有密钥、测试账号等敏感信息统一存储在Jenkins的Credentials管理模块,运行时通过环境变量注入测试进程,禁止硬编码到代码或配置文件
    • 每次任务启动前先清理工作区历史安装包,避免新旧版本混淆
  • 运行环境隔离
    • 测试任务使用独立Docker容器运行,容器内预装固定版本的JDK、Android SDK、Appium服务,避免不同任务的依赖冲突
    • 测试设备优先对接云测平台或企业自建设备农场,不直接绑定Jenkins宿主机物理设备,降低设备离线导致的任务失败率
  • 结果管理
    • 测试完成后自动归档Serenity测试报告、运行日志到Jenkins构件库,至少保留30天历史记录方便回溯
    • 测试结果与对应APK的版本号、构建号绑定,方便定位问题所属应用版本
    • 配置分级通知规则:测试失败时推送通知到研发、测试群,附带报告链接和失败用例摘要,测试成功可仅推送汇总信息
  • 稳定性优化
    • 配置任务重试机制:非用例失败的环境类错误自动重试1-2次,降低误报率
    • 配置定期磁盘清理规则,自动删除过期的历史安装包、日志文件,避免磁盘空间不足导致任务失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 18:36:06