微信小程序自动化实战(一)

一. Airtest工具介绍

1.1 Airtest简介

1) Airtest是网易开发的一款UI自动化测试框架

2) 两大核心功能: 基于poco的UI控件识别, 基于airtest的图像识别

1.2 基本操作

1.2.1 工具包下载

pip install airtest
pip install pocoui   # 注意此处不是poco,而是pocoui

1.2.2 设备连接

# -*- coding: utf-8 -*-
# @Author  : chinablue

from airtest.core.api import connect_device, set_current

device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"    # 通过[adb devices]来获取

# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=ADBCAP")

# 切换到指定设备
set_current(device_uuid)

# 判断是否亮屏
if d.is_screenon():
    d.home()    # 点击Home键
else:
    d.wake()    # 唤醒屏幕

 

1.2.3 基于poco的定位操作

# -*- coding: utf-8 -*-
# @Author  : chinablue

from airtest.core.api import connect_device, start_app
from poco.drivers.android.uiautomation import AndroidUiautomationPoco

device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"    # 通过[adb devices]来获取

# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=JAVACAP")

# 初始化poco对象
poco = AndroidUiautomationPoco(device=d, use_airtest_input=True, screenshot_each_action=False)

# 点击[home]键
d.home()

# 打开app
start_app(package="com.tencent.mm")  # app包名获取命令: adb shell dumpsys window windows|findstr "mCurrentFocus"

# 通过Airtest-IDE来查看页面元素
poco(text="发现").click()
poco(textMatches="^小程序.*").click()
poco(text="最近使用").parent().parent().parent().offspring(text="云访客之测试").click()

注意事项: 

  1. 此示例中初始化poco对象时需实例化的类为AndroidUiautomationPoco. 更多参考请点击这里

  2. 查看UI元素的属性元素的层级关系需要通过airtest-IDE工具来辅助完成

       3. 目前在pocoui中推荐的定位方式有两种, 一种是通过属性来定位(支持模糊匹配), 一种是通过层级关系来定位. 

1.2.4 基于图像识别的定位操作

# -*- coding: utf-8 -*-
# @Author  : chinablue

from airtest.core.api import connect_device, start_app, touch, Template

device_ip = "127.0.0.1"
device_port = "5037"
device_uuid = "3f9d6008"    # 通过[adb devices]来获取

# 连接设备
d = connect_device(f"Android://{device_ip}:{device_port}/{device_uuid}?cap_method=JAVACAP")

# 点击[home]键
d.home()

# 打开app
start_app(package="com.tencent.mm")  # app包名获取命令: adb shell dumpsys window windows|findstr "mCurrentFocus"

# 点击[发现], 通过Airtest-IDE来截取目标图片
touch(Template(filename="wechat_discover.png"))

注意事项:

  1. wechat_discover.png在这里下载 : 微信小程序自动化实战(一)

  2. 通过airtest-IDE工具完成截图后, 需要去对应工作目录中将png格式的图片拷贝到测试脚本中

二. UI自动化测试中的PO模式

2.1 如何理解PO模式

1) PO是Page Object的缩写, PO模式体现了分层设计的思想

2) PO的优点: 提高代码的可读性,提高代码的可维护性,提高代码的复用性

3) 主要想解决的问题: 测试用例不会因某个元素定位发生变化而去修改所有相关的测试用例

4) PO模式是将每个页面映射成class类,通过这个类来维护当前页面元素(映射成类对象属性)和页面操作(映射成类方法)

5) 结合PO模式, 对测试脚本的逻辑分层设计:

  定位信息层: 填写元素信息或图片信息
  基本操作层: 定义页面元素的基本操作
  业务场景层: 将页面的基本操作组装成一个个用例步骤
  测试用例层: 编写测试用例

2.2 Page层的设计思路

# -*- coding:utf-8 -*-
# Author:chinablue

import logging

import allure

from bns.pages.base_page import BasePage


# 元素操作封装
class Handle(BasePage):
    """
    对页面操作的基础封装
  """


def __init__(self, driver):
    super().__init__(driver)
    self.logger = logging.getLogger(__name__)


# 业务场景封装
class Business(Handle):
    """
    对单个测试步骤的封装
  """

    def __init__(self, driver):
        super().__init__(driver)

    @allure.step("断言: 页面关键信息检查")
    def is_current_page(self):
        pass   # 页面关键信息的断言


# 元素信息管理:Android
class AndroidLocator(Business):
    def __init__(self, driver):
        super().__init__(driver)
        self.poco_locator()
        self.airtest_locator()

    def poco_locator(self):
        pass

    def airtest_locator(self):
        pass

注意事项:

  1. BasePage类会根据定义的属性来动态绑定元素操作方法, 目前可特殊识别的属性有: a_*,  p_*,  image_*

  2. 每个page页会定义有继承关系的3个类: Handle类, Business类, AndroidLocator类

  3. 对于一些非重点测试的page页, 可以和其他page页进行适当合并

  4. AndroidLocator类中支持poco定位和图像识别定位, 但无论采用哪一种定位方式,属性命名要有意义 

  5. Business类中需要复写is_current_page方法, 该方法会对当前页面特征进行断言

更为详细的例子请参考这里

三. UI自动化框架介绍

  • 动态查找页面, 通过属性的方式来获取page的实例化对象
  • 使用pytest组织测试用例, allure.step对用例进行分层

3.1 项目结构介绍

|-base        # 基础层
|-bns         # 业务层: 基于PO模式设计
    |-pages       # 每个页面定义成一个py文件, 每个py文件中有3个类
    |-screenshots  # 截图定位的图片  
    |-init_app.py  # 设备连接, poco初始化操作
|-testcase    # 用例层: 主要调用用例步骤,进行页面断言
|-config.py   # 配置文件: 支持在运行过程中通过set方式来修改配置文件,方便在持续集成场景的使用
|-main.py     # 执行入口

3.2 编写第一个用例, 分析代码之间的调用关系

 

上一篇:Airtest框架源码目录结构解析


下一篇:基于AirTest+Python的ios自动化测试demo