如何做UI Automation(二)设计Automation的test case

本文探讨了自动化测试中的常见误区,提出了一种分级管理测试案例的方法,包括BVT和FVT等不同级别,并强调了如何通过重新设计测试案例提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个常见的错误是,试图自动化所有的test cases。一些没有经验的管理者会希望用自动化覆盖率来衡量自动化测试开发人员的工作。

但是,实际上自动化是一件需要很大投入的工作。不仅有开发的工作量,也有维护的工作量。如果过于追求自动化的数量,在系统有任何变化的时候,都会收到非常多的false alert,让开发和测试都陷于无尽的无效工作。

基于以上原因,我们的automation test case是需要经过设计的。

1. 将test case分级: BVT-1, BVT-2,FVT-1,FVT-2等等。重点关注BVT的test case,optionally地关注FVT case。

挑选test case的时候,一定要注意规模和测试目的。太长太多的case,会导致代码提交需要漫长的等待。而且,会额外消耗很多的精力。

2. 从手工测试的test cases中挑出一些test cases之后,将之重新设计,而非完全模拟所有手工步骤。

    可以将需要测试的重点与其他操作分离。

例如,你手头有一个test case,目的是验证UI 上所有的元素是否显示正常。按照正常的过程,你可能需要从一开始用uI准备数据,然后再来验证UI。但是,这里,你可以先用其他的手段,准备好数据,然后直接打开该UI,来做你最核心的验证操作。这样的话,该验证就不会依赖于前面的准备数据的功能是否良好,不会被准备数据功能block。同时,用UI准备数据是一个非常耗时,而且非常脆弱的过程,提前用其他手段准备好数据,可以增加测试的可靠性、稳定性和速度。

### 如何从零开始搭建UI自动化测试框架 #### 1. 明确需求与目标 在构建 UI 自动化测试框架之前,需明确项目的具体需求以及预期达到的目标。这包括但不限于支持的应用平台(Android 或 iOS)、使用的编程语言、框架的核心功能等[^2]。 #### 2. 技术选型 技术栈的选择直接影响到后续开发效率和维护成本。对于 Python 开发者而言,推荐使用 Pytest 结合 Appium 来实现跨平台的移动端 UI 测试。Appium 是一款开源工具,能够很好地适配 Android 和 iOS 平台上的应用测试[^3]。 #### 3. 安装依赖环境 为了运行基于 Appium 的 UI 自动化脚本,需要安装以下组件: - **Node.js**: Appium 基于 Node.js 构建。 - **Java Development Kit (JDK)**: 部分插件可能需要用到 Java 编译器。 - **Android SDK Tools**: 提供访问设备的能力。 可以通过命令行验证这些工具是否已正确配置好环境变量[^2]: ```bash node -v && java -version && adb version ``` 如果上述任意一条指令报错,则说明对应软件未被成功设置路径或者尚未下载安装。 #### 4. 初始化项目结构 创建合理的目录布局有助于管理日益增长的文件数量并保持良好的可读性和扩展性。一个典型的 UI 自动化测试工程可以按照如下方式组织[^3]: ``` ui_automation/ │── config/ # 存储全局参数如 desired capabilities 设置 │ └── caps.py # Desired Capabilities 文件 ├── pages/ # 页面对象模型(Page Object Model)定义区域 │ ├── base_page.py # 封装通用方法的基础类 │ └── home_page.py # 主页特定操作封装 ├── tests/ # 实际编写用例的地方 │ └── test_login.py # 登录场景下的测试样例 └── utils/ # 辅助函数集合比如日志记录模块 └── logger.py # 日志处理逻辑 ``` #### 5. 设计页面对象模型(POM) POM 是一种设计模式,在 Selenium/Appium 场景下特别受欢迎因为它能有效分离代码中的业务流程和技术细节从而提高重用率减少冗余代码量。每一个屏幕界面都应该映射成单独的一个 Page 类实例[^3]。 例如下面展示了一个简单的登录页面交互过程: ```python from appium.webdriver.common.mobileby import MobileBy from .base_page import BasePage class LoginPage(BasePage): _username_locator = (MobileBy.ID, 'com.example:id/edit_username') _password_locator = (MobileBy.ID, 'com.example:id/edit_password') _login_button_locator = (MobileBy.ID, 'com.example:id/button_login') def enter_username(self, username): self.find_element(*self._username_locator).send_keys(username) def enter_password(self, password): self.find_element(*self._password_locator).send_keys(password) def click_login(self): self.find_element(*self._login_button_locator).click() ``` #### 6. 编写测试用例 利用 pytest 插件简化执行流程并通过 conftest.py 共享 fixture 资源来初始化 driver 对象[^3]。 示例 `conftest.py` 中的内容可能是这样的: ```python import pytest from appium import webdriver @pytest.fixture(scope='function') def driver(): desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'appPackage': 'com.example.app', 'appActivity': '.MainActivity' } drvr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) yield drivr drvr.quit() ``` 而具体的某个测试案例则看起来像这样: ```python def test_successful_login(driver): login_page = LoginPage(driver) login_page.enter_username("valid_user") login_page.enter_password("secure_passw0rd!") login_page.click_login() assert "Welcome" in driver.page_source ``` #### 7. 执行测试计划 最后一步便是定期安排 CI/CD 系统自动触发整个套件跑一遍所有预设好的 case 列表以便及时发现潜在 bug 。也可以手动指定单个或多个 cases 来快速验证改动效果[^2]。 --- 问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值