最完整的Google I/O App自动化测试指南:UI Automator与Appium实践

最完整的Google I/O App自动化测试指南:UI Automator与Appium实践

【免费下载链接】iosched The Google I/O Android App 【免费下载链接】iosched 项目地址: https://gitcode.com/gh_mirrors/io/iosched

你是否还在为Android应用的兼容性测试焦头烂额?是否因重复的手动操作而浪费大量时间?本文将通过Google I/O官方应用的实际案例,带你掌握UI Automator与Appium的自动化测试方案,解决跨设备测试效率低、回归测试成本高的痛点。读完本文你将获得:

  • 从零搭建I/O App测试框架的完整步骤
  • UI Automator实现复杂交互的实战技巧
  • Appium跨平台测试的配置与优化方法
  • 测试用例设计的最佳实践与避坑指南

测试框架概览

Google I/O App作为Android官方示例项目,其测试架构采用了分层设计,主要包含单元测试、集成测试和UI测试三个层级。项目中的测试代码集中在以下目录:

测试框架架构

测试框架采用Hilt进行依赖注入,通过自定义测试规则实现测试环境的统一配置。核心测试规则包括:

  • FixedTimeRule:控制测试时间,模拟不同时间段的应用行为
  • SetPreferencesRule:预设应用偏好,跳过欢迎界面等初始流程
  • MainActivityTestRule:启动指定的Activity并管理测试生命周期

UI Automator实战

UI Automator是Android官方提供的UI测试框架,适用于跨应用和系统级的交互测试。在Google I/O App中,ScheduleTest.kt展示了如何使用UI Automator API进行界面测试。

基础测试用例实现

以下代码片段展示了如何验证日程列表中第一个会话的显示状态:

@Test
fun showFirstDay_sessionOnFirstDayShown() {
    onView(withText(FAKE_SESSION_ON_DAY1))
        .check(matches(isDisplayed()))
}

这段测试代码通过onView方法定位文本为"Fake session on day 1"的元素,并验证其是否可见。其中FAKE_SESSION_ON_DAY1常量定义在测试类的伴生对象中,确保测试数据的一致性。

复杂交互测试

对于RecyclerView等复杂控件,UI Automator提供了专门的操作类:

@Test
fun clickOnFirstItem_detailsShown() {
    onView(withId(R.id.recyclerview_schedule))
        .perform(RecyclerViewActions.actionOnItemAtPosition<SessionViewHolder>(0, click()))
    
    onView(withId(R.id.session_detail_title)).check(matches(isDisplayed()))
}

这段代码实现了点击日程列表第一项并验证详情页标题显示的完整流程。值得注意的是,该测试目前被标记为@Ignore,因为在平板设备上会话详情会显示在右侧面板,而测试Activity不包含该布局结构。

测试规则配置

Google I/O App的测试类通过多重规则实现测试环境的准备:

@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)

@get:Rule(order = 1)
var timeProviderRule = FixedTimeRule()

@get:Rule(order = 1)
var preferencesRule = SetPreferencesRule()

@get:Rule(order = 2)
var activityRule = MainActivityTestRule(R.id.navigation_schedule)

这些规则按顺序执行:首先初始化Hilt依赖注入,然后固定测试时间,设置应用偏好,最后启动日程页面的Activity。这种配置确保了测试的可重复性和环境一致性。

Appium跨平台测试

虽然Google I/O App的原生测试主要使用UI Automator,但Appium作为跨平台测试框架,可以实现iOS和Android的统一测试脚本。以下是将现有UI测试迁移到Appium的关键步骤。

环境配置

首先需要安装Appium服务器和相关依赖:

npm install -g appium
appium driver install uiautomator2

然后创建desiredCapabilities配置文件,指定测试设备和应用信息:

{
  "platformName": "Android",
  "appium:deviceName": "Android Emulator",
  "appium:appPackage": "com.google.samples.apps.iosched",
  "appium:appActivity": ".ui.MainActivity",
  "appium:automationName": "UiAutomator2"
}

测试用例转换

将UI Automator测试转换为Appium脚本非常简单。以下是使用JavaScript的Appium版本实现相同的会话列表测试:

describe('Schedule Screen', () => {
  beforeEach(async () => {
    await driver.launchApp();
    // 跳过欢迎界面
    await driver.findElement('id', 'button_welcome_continue').click();
  });

  it('should display first day sessions', async () => {
    const sessionElement = await driver.findElement('xpath', '//*[@text="Fake session on day 1"]');
    expect(await sessionElement.isDisplayed()).toBe(true);
  });

  it('should show session details when clicking item', async () => {
    await driver.findElement('id', 'recyclerview_schedule').click();
    const detailTitle = await driver.findElement('id', 'session_detail_title');
    expect(await detailTitle.isDisplayed()).toBe(true);
  });
});

元素定位策略

Appium支持多种元素定位方式,对应Google I/O App的UI结构,推荐使用以下策略:

  1. ID定位:使用布局文件中定义的android:id属性,如activity_main.xml中的navigation_schedule
  2. 文本定位:适用于静态文本元素,如会话标题
  3. 内容描述:针对图标等无文本元素,如values/strings.xml中定义的辅助功能描述

测试数据管理

Google I/O App使用模拟数据进行测试,这些数据存储在mobile/sampledata/目录下,包含以下文件:

这些JSON文件为测试提供了一致的数据集,确保测试结果的可重复性。在自动化测试中,可以通过修改这些文件来模拟不同场景,如满负荷日程、特殊会场布局等。

测试报告与CI集成

Google I/O App的持续集成配置位于kokoro/目录,包含以下文件:

要将UI测试结果集成到CI报告中,可以添加以下步骤到构建脚本:

# 运行UI测试并生成报告
./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.reportDir=reports/ui

# 将报告上传到CI服务器
curl -X POST -F "report=@reports/ui/index.html" https://ci.example.com/upload

最佳实践与优化

测试效率提升

  1. 禁用动画:测试前关闭设备动画可提高执行速度,可通过adb命令实现:

    adb shell settings put global window_animation_scale 0
    adb shell settings put global transition_animation_scale 0
    adb shell settings put global animator_duration_scale 0
    
  2. 并行测试:在gradle.properties中配置测试并行执行:

    android.testOptions.execution 'ANDROIDX_TEST_ORCHESTRATOR'
    
  3. 选择性测试:使用测试标签实现部分测试执行:

    @Test
    @Tag("smoke")
    fun criticalPathTest() { ... }
    

常见问题解决

  1. 元素定位不稳定:使用显式等待替代隐式等待:

    WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("session_detail_title")))
    
  2. 测试环境不一致:使用test-shared中的共享规则统一环境配置

  3. 跨设备兼容性:针对不同屏幕尺寸编写适应性测试,参考layout-w840dp/等目录的布局文件

总结与展望

通过UI Automator和Appium,我们可以为Google I/O App构建强大的自动化测试体系。UI Automator适合深入Android平台特性的测试,而Appium则提供了跨平台的统一解决方案。项目中的测试代码展示了如何将这些工具与Hilt依赖注入、模拟数据和CI流程相结合,构建完整的测试策略。

随着Jetpack Compose的普及,未来的测试框架可能会更多地采用Compose Test API,但UI Automator和Appium仍然是Android自动化测试的重要工具。建议开发者根据项目需求选择合适的测试方案,同时保持测试代码的可维护性和可扩展性。

点赞+收藏+关注,获取更多Android测试实战技巧!下期预告:《使用Firebase Test Lab进行大规模设备测试》

【免费下载链接】iosched The Google I/O Android App 【免费下载链接】iosched 项目地址: https://gitcode.com/gh_mirrors/io/iosched

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值