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
相关产品推荐
相关产品推荐

