基于appium的APP自动化测试框架的开发流程概览
1. 环境搭建
-
- 安装Appium Server
-
-
- 下载与安装:可以从Appium官方网站(Redirecting)下载安装包。对于Windows系统,下载.exe文件后双击安装;对于Mac系统,下载.dmg文件后进行安装。安装过程中可以按照默认配置进行操作。
- 启动Appium Server:安装完成后,启动Appium Server。它会在本地开启一个服务端口(通常是4723),用于接收自动化测试脚本发送的命令。在启动界面可以查看服务运行状态和相关的日志信息。
-
-
- 安装设备驱动(Android和iOS)
-
-
- Android:如果要测试Android应用,需要安装Android SDK(Software Development Kit)。可以从Android官方网站下载。安装完成后,配置好环境变量,确保在命令行中可以访问到
adb
(Android Debug Bridge)工具。adb
用于与Android设备或模拟器进行通信,例如安装应用、获取设备信息等。另外,根据测试设备的Android版本,可能还需要安装对应的Android系统镜像来创建模拟器。 - iOS:对于iOS测试,需要在Mac机器上安装Xcode。Xcode包含了iOS开发和测试所需的工具和库。同时,要确保测试的iOS设备已通过USB连接到Mac,并且在设备上信任了开发者证书。
- Android:如果要测试Android应用,需要安装Android SDK(Software Development Kit)。可以从Android官方网站下载。安装完成后,配置好环境变量,确保在命令行中可以访问到
-
-
- 选择编程语言和相关库安装
-
-
- 编程语言选择:Appium支持多种编程语言,如Python、Java、JavaScript等。以Python为例,它简单易学且有丰富的第三方库支持。
- 安装相关库:如果选择Python,需要安装
Appium - Python - Client
库。可以通过pip install Appium-Python-Client
命令进行安装。这个库提供了与Appium Server交互的API,用于编写自动化测试脚本。
-
2. 创建测试项目结构
-
- 项目目录规划
-
-
- 可以创建一个主目录作为项目根目录,例如
AppiumTestProject
。在根目录下,划分不同的子目录,如tests
用于存放测试脚本,page_objects
用于存放页面对象类(遵循PO模式,将页面元素定位和操作封装在类中),utils
用于存放一些工具类(如用于读取配置文件、生成测试数据等)。
- 可以创建一个主目录作为项目根目录,例如
-
-
- 配置文件设置
-
-
- 创建一个配置文件,如
config.ini
,用于存储测试相关的配置信息,如Appium Server的地址、端口号,应用的包名、启动Activity(针对Android)或者Bundle ID(针对iOS)等。可以使用Python的configparser
库来读取配置文件中的信息。例如,在config.ini
文件中可以有以下内容:
- 创建一个配置文件,如
-
[Appium]
server_url = http://127.0.0.1:4723
[Android]
package_name = com.example.app
activity_name = com.example.app.MainActivity
[iOS]
bundle_id = com.example.iosapp
3. 编写页面对象(Page Objects)
-
- 页面元素定位
-
-
- 根据应用的UI界面,为每个页面创建一个页面对象类。在类中,定义页面元素的定位方式。例如,使用Appium的定位策略,如
By.ID
、By.XPATH
、By.CLASS_NAME
等。以一个简单的登录页面为例,在Python中可以这样定义:
- 根据应用的UI界面,为每个页面创建一个页面对象类。在类中,定义页面元素的定位方式。例如,使用Appium的定位策略,如
-
from appium.webdriver.common.mobileby import MobileBy
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_input = (MobileBy.ID, "username_input_id")
self.password_input = (MobileBy.ID, "password_input_id")
self.login_button = (MobileBy.ID, "login_button_id")
- 操作方法封装
-
- 在页面对象类中,除了元素定位,还需要封装对这些元素的操作方法。这些方法代表了用户在页面上的行为,如输入文本、点击按钮等。继续以上述登录页面为例:
def enter_username(self, username):
self.driver.find_element(*self.username_input).send_keys(username)
def enter_password(self, password):
self.driver.find_element(*self.password_input).send_keys(password)
def click_login_button(self):
self.driver.find_element(*self.login_button).send_keys(Keys.ENTER)
4. 编写测试脚本
-
- 测试用例结构
-
-
- 使用测试框架(如Python中的unittest或pytest)来编写测试用例。每个测试用例应该是一个独立的方法,用于测试应用的一个功能点。例如,一个登录功能测试用例可以如下编写(使用unittest框架):
-
import unittest
from appium import webdriver
from page_objects.login_page import LoginPage
class TestLogin(unittest.TestCase):
def setUp(self):
# 从配置文件中读取Appium Server地址等信息
config = configparser.ConfigParser()
config.read('config.ini')
appium_server_url = config.get('Appium','server_url')
desired_caps = {}
# 根据是Android还是iOS设备设置不同的capabilities
# 这里以Android为例
desired_caps['platformName'] = 'Android'
desired_caps['deviceName'] = 'Android Device'
desired_caps['appPackage'] = config.get('Android','package_name')
desired_caps['appActivity'] = config.get('Android','activity_name')
self.driver = webdriver.Remote(appium_server_url, desired_caps)
self.login_page = LoginPage(self.driver)
def test_login_success(self):
username = "test_user"
password = "test_password"
self.login_page.enter_username(username)
self.login_page.enter_password(password)
self.login_page.click_login_button()
# 在这里可以添加断言来验证登录是否成功,比如检查是否跳转到了预期的页面等
def tearDown(self):
self.driver.quit()
5. 执行测试和结果分析
-
- 执行测试
-
-
- 在命令行中,进入测试项目目录,使用测试框架提供的命令来执行测试。以pytest为例,可以使用
pytest tests/
命令来执行tests
目录下的所有测试脚本。在测试执行过程中,可以在控制台看到测试步骤的执行情况以及相关的日志信息。
- 在命令行中,进入测试项目目录,使用测试框架提供的命令来执行测试。以pytest为例,可以使用
-
-
- 结果分析
-
-
- 测试框架会生成测试结果报告。对于pytest,可以通过安装
pytest - reports
等插件来生成更详细的测试报告,如HTML格式的报告。分析测试报告可以查看测试用例的通过情况、失败原因等信息。如果测试用例失败,需要根据报告中的错误信息(如元素找不到、操作超时等)来定位问题,可能是应用的UI发生变化、测试脚本编写错误或者网络等外部因素导致的。通过不断优化测试脚本和应用的稳定性,可以提高自动化测试的效果。
- 测试框架会生成测试结果报告。对于pytest,可以通过安装
-
APP自动化应用
以下是在App自动化中封装启动APP代码的常见步骤和示例(以Python语言结合Appium框架为例):
1. 分析启动APP所需的配置信息
在启动APP时,通常需要知晓以下关键信息:
- Appium服务器地址和端口:例如本地默认的
http://127.0.0.1:4723
,它是测试脚本与Appium服务器通信的端点。 - 设备相关配置(Desired Capabilities):
-
- 平台名称(platformName):明确是
Android
还是iOS
,如"Android"
或"iOS"
。 - 设备名称(deviceName):对于真实设备,是设备的实际名称(可通过
adb devices
获取Android设备名称,iOS设备在连接电脑后也有对应的显示名称);对于模拟器,是模拟器的设定名称,像"emulator-5554"
(Android模拟器常见格式)等。 - 应用相关标识:
- 平台名称(platformName):明确是
-
-
- Android应用:需要知道应用的包名(
appPackage
)和启动的Activity(appActivity
),比如包名可能是"com.example.androidapp"
,启动Activity是"com.example.androidapp.MainActivity"
。这些可以通过查看应用的AndroidManifest.xml
文件或者使用相关工具获取。 - iOS应用:要明确应用的Bundle ID(
bundleId
),例如"com.example.iosapp"
。
- Android应用:需要知道应用的包名(
-
2. 创建配置文件(可选但推荐)
可以创建一个配置文件(如 config.ini
使用 configparser
库来读取,或者采用 JSON
、YAML
等格式的文件)来存放这些启动相关的配置信息,方便后续修改和维护。以下是以 config.ini
为例的简单结构:
[Appium]
server_url = http://127.0.0.1:4723
[Android]
platformName = Android
deviceName = emulator-5554
appPackage = com.example.androidapp
appActivity = com.example.androidapp.MainActivity
[iOS]
platformName = iOS
deviceName = iPhone 14 Pro
bundleId = com.example.iosapp
3. 封装启动APP的函数
创建一个Python模块(比如命名为 app_launcher.py
),在其中封装启动APP的函数,示例代码如下:
from appium import webdriver
import configparser
def launch_app():
config = configparser.ConfigParser()
config.read('config.ini')
desired_caps = {}
platform = config.get('Appium', 'platformName')
if platform.lower() == 'android':
desired_caps['platformName'] = 'Android'
desired_caps['deviceName'] = config.get('Android', 'deviceName')
desired_caps['appPackage'] = config.get('Android', 'appPackage')
desired_caps['appActivity'] = config.get('Android', 'appActivity')
elif platform.lower() == 'ios':
desired_caps['platformName'] = 'iOS'
desired_caps['deviceName'] = config.get('iOS', 'deviceName')
desired_caps['bundleId'] = config.get('iOS', 'bundleId')
driver = webdriver.Remote(config.get('Appium','server_url'), desired_caps)
return driver
在上述代码中:
- 首先读取配置文件
config.ini
中的信息。 - 根据配置中指定的平台(
Android
或iOS
)来设置相应的Desired Capabilities
。 - 使用
webdriver.Remote
方法连接到Appium服务器,并传递配置好的Desired Capabilities
,以此启动APP并返回对应的Appium
驱动对象(后续可以通过这个对象来操作APP界面等)。
4. 在测试用例中使用封装好的函数
在具体的测试用例文件(比如 test_login.py
等)中,可以这样调用封装好的启动APP函数:
import unittest
from app_launcher import launch_app
class TestLogin(unittest.TestCase):
def setUp(self):
self.driver = launch_app()
def test_login_success(self):
# 在这里编写具体的登录测试逻辑,使用self.driver操作APP界面元素等
pass
def tearDown(self):
self.driver.quit()
通过这样的封装,当需要修改APP的启动配置(比如更换测试设备、应用版本更新导致包名或Activity改变等)时,只需要在配置文件中进行相应调整,而不需要在每个测试用例中去修改启动相关的代码,提高了代码的可维护性和复用性。
此外,还可以进一步扩展这个封装,比如添加异常处理逻辑,在启动失败时进行更友好的提示或者重试等操作,让启动APP的过程更加健壮和稳定。