App UI自动化--Appium学习--第一篇
一、主流移动自动化测试工具介绍
在移动应用开发中,确保应用程序的质量和用户体验至关重要。为了高效地进行自动化测试,市场上出现了多个优秀的工具。以下是三个主流的移动自动化测试工具——Robotium、Appium 和 Macaca 的详细介绍:
1. Robotium
概述:
- 平台支持:主要针对 Android 应用。
- 特点:
- Robotium 是一个专门为 Android 应用设计的白盒测试框架,它允许开发者编写简洁、可靠的自动化测试脚本。
- 支持模拟用户交互操作,如点击、滑动等,并且可以跨多个活动(Activity)进行导航。
- 提供了强大的功能来验证 UI 元素的状态和行为。
优势:
- 简单易用,API 设计直观,易于上手。
- 高度集成到 Android SDK 中,适用于原生和混合应用。
- 支持 CI/CD 流程,与 Jenkins 等持续集成工具无缝对接。
局限性:
- 仅限于 Android 平台,对于需要跨平台测试的项目不太适用。
- 对于较新的 Android API 版本可能不够及时更新。
2. Appium
概述:
- 平台支持:广泛支持 iOS 和 Android 应用。
- 特点:
- Appium 是一个开源的、跨平台的移动自动化测试工具,遵循 WebDriver 协议,兼容 Selenium WebDriver API。
- 它允许使用多种编程语言(如 Java、Python、Ruby 等)编写测试脚本,并且可以在不同的操作系统上运行。
- 支持 Web、原生和混合应用的自动化测试。
优势:
- 跨平台特性使其成为多平台项目的理想选择。
- 拥有活跃的社区支持和丰富的插件生态系统。
- 无需修改被测应用源码即可进行自动化测试,方便快捷。
局限性:
- 相比其他工具,设置环境和配置可能会稍微复杂一些。
- 在某些情况下,性能可能不如专门针对某一平台的工具。
3. Macaca
概述:
- 平台支持:支持 iOS 和 Android 应用。
- 特点:
- Macaca 是由阿里巴巴团队开发并维护的一个现代化移动自动化测试解决方案。
- 它基于 WebDriver 协议,但引入了更现代的技术栈,例如 Node.js 和 Chrome DevTools Protocol,以提高稳定性和效率。
- 提供了详细的文档和支持,特别是对中国市场的本地化支持较好。
优势:
- 高效稳定的执行引擎,适合大规模并发测试。
- 强大的调试和日志记录功能,便于问题排查。
- 深度集成阿里云服务,如性能监控、崩溃分析等。
局限性:
- 社区相对较小,相比于 Appium,在全球范围内的普及程度较低。
- 文档虽然详尽,但对于非中文用户的友好度可能稍逊一筹。
市面APP介绍
Native App(原生应用)
原生应用是专门为特定操作系统(如iOS或Android)开发的应用程序,使用官方编程语言(如Swift、Java)。它们直接访问底层硬件资源,提供最佳性能和用户体验,并能充分利用设备特性,如推送通知和离线模式。然而,开发成本较高,需为每个平台单独编写代码。
Web App(Web 应用)
Web应用通过浏览器访问,基于HTML5、CSS和JavaScript构建,无需安装。它具有跨平台优势,任何有现代浏览器的设备都可运行。更新即时,维护简便,但性能和设备功能访问受限,依赖网络连接,不适合完全离线使用。
Hybrid App(混合应用)
混合应用结合了Web应用和原生应用的优点,内部包含WebView组件加载Web页面,同时可通过插件调用部分原生API。它使用单一代码库支持多平台,开发成本较低,灵活性高,适合快速迭代。不过,其性能和用户体验可能不及纯原生应用。
Mac的APPium环境安装参考
1、安装java sdk以及android studio sdk并配置环境变量:https://blog.csdn.net/u013728021/article/details/115121013
2、安装appium的可视化界面:
https://github.com/appium/appium-desktop/releases
3、使用python的语句配置依赖包
pip install Appium-Python-Client==1.3.0
ADB调试工具的基本命令
当然可以,以下是 ADB 命令的简洁介绍:
ADB 命令简介
1. 设备管理
adb devices
:列出所有已连接设备。adb connect <IP>:<端口>
:连接远程设备。adb reboot
:重启设备。
2. 文件传输
adb push <本地> <远程>
:上传文件到设备。adb pull <远程> [本地]
:从设备下载文件。
3. Shell 命令
adb shell
:打开设备 Shell。adb shell <命令>
:执行单个命令。adb shell pm list packages
:列出安装的应用。
4. 日志查看
adb logcat
:查看实时日志。adb logcat -c
:清空日志。
5. 应用管理
adb install <APK>
:安装应用。adb uninstall <包名>
:卸载应用。adb shell pm clear <包名>
:清除应用数据。
6. 截屏与录屏
adb shell screencap /sdcard/screenshot.png
:截取屏幕图片。adb shell screenrecord /sdcard/demo.mp4
:录制屏幕视频。
7. 端口转发
adb forward tcp:<本地端口> tcp:<远程端口>
:端口转发。
8. 其他
adb bugreport
:生成错误报告。adb shell input text "Hello"
:发送文本输入。adb shell input keyevent <KeyCode>
:模拟按键事件。
手机连接参考:https://blog.csdn.net/2301_76601922/article/details/129500450
DEMO脚本
下面是一个使用 Appium 进行 Android 应用 UI 自动化的简单 Python 脚本示例。我们将模拟打开一个应用,点击按钮,并验证文本显示是否正确。此脚本假设您已经安装了 Appium 和相关依赖(如 Appium-Python-Client
),并且有一个可以测试的应用 APK 文件。
# 导入必要的库
from appium import webdriver
import unittest
class SimpleAndroidTest(unittest.TestCase):
def setUp(self):
# 设置 Desired Capabilities,用于指定测试设备和应用信息
desired_caps = {
'platformName': 'Android', # 设备平台
'platformVersion': '11.0', # 设备系统版本
'deviceName': 'emulator-5554', # 设备名称或模拟器ID
'app': '/path/to/your/app.apk', # APK 文件路径
'appPackage': 'com.example.app', # 应用的包名
'appActivity': '.MainActivity' # 启动 Activity 名称
}
# 初始化 WebDriver 并连接到 Appium Server
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_button_click(self):
# 等待页面加载完成
self.driver.implicitly_wait(10)
# 查找并点击按钮元素
button = self.driver.find_element_by_id('com.example.app:id/button')
button.click()
# 验证点击后显示的文本
result_text = self.driver.find_element_by_id('com.example.app:id/textView').text
self.assertEqual(result_text, 'Button Clicked!')
def tearDown(self):
# 测试结束后关闭应用
self.driver.quit()
if __name__ == '__main__':
unittest.main()
注释说明:
1. 导入库
from appium import webdriver
:导入 Appium 的 WebDriver 模块,用于与 Appium Server 通信。import unittest
:导入 Python 内置的单元测试框架,方便组织测试用例。
2. 设置测试类
class SimpleAndroidTest(unittest.TestCase)
:定义一个继承自unittest.TestCase
的测试类,所有测试方法都应在此类中定义。
3. 初始化测试环境 (setUp
方法)
- Desired Capabilities:这是启动会话时传递给 Appium Server 的配置参数,包括平台信息、设备详情以及要测试的应用信息。
'platformName'
: 指定目标平台为 Android。'platformVersion'
: 设备的操作系统版本。'deviceName'
: 设备或模拟器的名称,这里使用的是默认的 Android 模拟器。'app'
: APK 文件的完整路径,确保路径正确无误。'appPackage'
: 应用的包名,可以通过adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
命令获取。'appActivity'
: 启动应用时的第一个 Activity 名称。
self.driver = webdriver.Remote(...)
:创建一个新的 WebDriver 实例,并通过 HTTP 请求连接到本地运行的 Appium Server(默认地址为http://localhost:4723/wd/hub
)。
4. 定义测试方法 (test_button_click
方法)
self.driver.implicitly_wait(10)
:设置隐式等待时间,确保在查找元素时如果有延迟也能成功找到。button = self.driver.find_element_by_id('...')
:根据 ID 查找按钮元素,并存储到变量button
中。button.click()
:模拟用户点击按钮操作。result_text = self.driver.find_element_by_id('...').text
:查找结果文本框,并读取其文本内容。self.assertEqual(...)
:断言实际结果是否等于预期值 “Button Clicked!”,如果不同则测试失败。
5. 清理测试环境 (tearDown
方法)
self.driver.quit()
:结束测试后关闭应用和 WebDriver 会话,释放资源。
6. 执行测试
if __name__ == '__main__': unittest.main()
:当脚本作为主程序运行时,调用unittest.main()
来启动测试。