APP自动化测试框架的开发

发布于:2024-12-07 ⋅ 阅读:(171) ⋅ 点赞:(0)

基于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,并且在设备上信任了开发者证书。
    • 选择编程语言和相关库安装
      • 编程语言选择: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.IDBy.XPATHBy.CLASS_NAME等。以一个简单的登录页面为例,在Python中可以这样定义:
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 - reports等插件来生成更详细的测试报告,如HTML格式的报告。分析测试报告可以查看测试用例的通过情况、失败原因等信息。如果测试用例失败,需要根据报告中的错误信息(如元素找不到、操作超时等)来定位问题,可能是应用的UI发生变化、测试脚本编写错误或者网络等外部因素导致的。通过不断优化测试脚本和应用的稳定性,可以提高自动化测试的效果。

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模拟器常见格式)等。
    • 应用相关标识
      • Android应用:需要知道应用的包名(appPackage)和启动的Activity(appActivity),比如包名可能是 "com.example.androidapp",启动Activity是 "com.example.androidapp.MainActivity"。这些可以通过查看应用的 AndroidManifest.xml 文件或者使用相关工具获取。
      • iOS应用:要明确应用的Bundle ID(bundleId),例如 "com.example.iosapp"

2. 创建配置文件(可选但推荐)

可以创建一个配置文件(如 config.ini 使用 configparser 库来读取,或者采用 JSONYAML 等格式的文件)来存放这些启动相关的配置信息,方便后续修改和维护。以下是以 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 中的信息。
  • 根据配置中指定的平台(AndroidiOS)来设置相应的 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的过程更加健壮和稳定。

异常处理

1. 注意:appium无法启动app的常见原因、解决方案


网站公告

今日签到

点亮在社区的每一天
去签到