Python+Appium+Pytest+Allure自动化测试框架-代码篇

文章目录

Python+Appium+Pytest+Allure自动化测试框架,本文主要讲述工程的搭建,测试用例的编写

自动化测试框架工程目录

pycharm创建python工程AutoTest,main.py做为主入口

设定目录结构如下

各目录用途说明

├─common		# 公共模块目录
├─datas         # 配置文件目录
├─outputs		# 测试输出目录
│  ├─logs		# 日志目录, 4723.log代表appium端口为4723服务的日志
│  ├─picture	# 截图存放目录
│  └─reports	# 测试报告存放目录
└─testcase		# 测试用例目录

示例测试代码

main.py调用pytest进行用例测试, 然后再调用allure生成报告

python 复制代码
# _*_coding:utf-8 _*_

import os
import pytest


def run_case():
    pytest.main(["-s",
                 "-v",
                 "--alluredir", "./outputs/reports/data"])

    generate_report()


def generate_report():
    # 查看allure报告
    os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")


if __name__ == "__main__":
    run_case()

写个打印Hello World的测试用例,里面加上allure添加报告信息,

pytest与allure的使用后面会讲到,这里只做个简单示例,

testcase/test_device_info.py

python 复制代码
# _*_coding:utf-8 _*_
import os
import time

import allure


@allure.feature("设备信息模块")
class TestDeviceInfo:

    @allure.story("设备信息故事")
    @allure.description("设备信息描述")
    @allure.severity(allure.severity_level.BLOCKER)
    def test_get_device_info(self):
        print('test_get_device_info start')
        print('Hello World')
        print('test_get_device_info end')

运行main.py就会开始进行自动化测试。

示例结果查看

有没有错可以直接在pycharm的打印中看

执行完用例,会生成allure的测试结果报告在outputs/reports/html目录下

在命令行中输入以下指令查看html结果

D:\workspace>allure open .\AutoTest\outputs\reports\html

allure

Allure 是一个灵活且功能强大的测试报告框架,主要用于为自动化测试生成美观且信息丰富的测试报告。

pytest

pytest是一个功能强大的 Python 测试框架,用于编写简单且可扩展的测试。

这里面有个testcase目录是专门给pytest用的,测试用例都放在这个目录下

编写pytest测试样例的规则

可以在工程根目录下放置pytest.in指定pytest规则,

它会在指定的目录及其子目录中自动搜索符合命名规则的测试函数和测试类。不需要手动添加每个测试用例到测试套件中。

比如,如果你有一个测试模块test_device_info.py,只要运行pytest命令,它就会自动发现并执行其中以test_开头的函数。

  1. 测试文件以test_开头
  2. 测试类以Test开头,并且不能带有 init 方法
  3. 测试函数以test_开头
  4. 断言使用基本的assert即可

pytest conftest.py向测试函数传参

main.py与testcase下的测试用例是隔离的,比如在main.py中创建个单例模式对象,在pytest测试函数中再调用这个单例对象实际会新创建个实例,二者不是一个对象。

这时需要用到pytest conftest.py向测试函数传参

  1. pytest会默认读取conftest.py里面的所有fixture
  2. conftest.py 文件名称是固定的,不能改动
  3. conftest.py只对同一个package下的所有测试用例生效
  4. 不同目录可以有自己的conftest.py一个项目中可以有多个conftest.py
  5. 测试用例文件中不需要手动import conftest.py,pytest会自动查找

在testcase目录下新建文件conftest.py里面

python 复制代码
# _*_coding:utf-8 _*_
import time
import pytest


# pytest.addoption()钩子函数,注册自定义参数 cmdopt 添加到配置对象
def pytest_addoption(parser):
    parser.addoption("--cmdopt",
                     action="store",
                     default="device_info",  # 默认参数值
                     help=None)
                     
# 从配置对象中读取自定义参数的值
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):
    # 两种写法
    return pytestconfig.getoption("--cmdopt")         

通过pytest.fixture, 把cmdopt传给测试函数。

修改main.py, 加了参数--cmdopt=Hi, 把Hi传过去。

python 复制代码
# _*_coding:utf-8 _*_

import os
import pytest


def run_case():
    pytest.main(["-s",
                 "-v",
                 "--cmdopt=Hi",
                 "--alluredir", "outputs/reports/data"])

    generate_report()


def generate_report():
    # 生成allure报告
    os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")


if __name__ == "__main__":
    run_case()

test_device_info.py中,函数添加cmdopt,把参数接收进来

python 复制代码
# _*_coding:utf-8 _*_
import os
import time

import allure


@allure.feature("设备信息模块")
class TestDeviceInfo:

    @allure.story("设备信息故事")
    @allure.description("设备信息描述")
    @allure.severity(allure.severity_level.BLOCKER)
    def test_get_device_info(self, cmdopt):
        print('test_get_device_info start')
        print('get cmdopt:' + cmdopt)
        print('test_get_device_info end')

执行结果,可以看到打印了Hi

appium

Appium 是一个开源的自动化测试框架,主要用于移动应用(包括 iOS 和 Android)的自动化测试。

其使用步骤是

启动appium服务

在命令行中输入

start /b appium -a 127.0.0.1 -p 4723 -pa /wd/hub

注意新版本appium不支持-bp参数(bootstrap port),加了会报错,另外需要加上-pa /wd/hub的参数,否则会报错"No route found for /wb/hub/session"。

第一次启动要慢些,有时候要花十多秒,等待appium的打印出现才执行后面的操作

代码端通过端口与appium服务通信对设备进行操作

把调试设备(比如开adb功能的手机)连usb到电脑,

命令行中查看设备名称

adb devices

比如得到:X36405Y4041600056

我们把这个值填写到代码配置中,

python 复制代码
from appium.options.android import UiAutomator2Options


def get_appium_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "13", # 这个填设备的安卓版本,如果写错会报错的
        "deviceName": "X36405Y4041600056", # 这个填设备adb device获取的名称,写错会报错
        "noReset": True,
    }

    #driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    # 新版本appium需要对参数进行转化
    options = UiAutomator2Options()
    options.load_capabilities(desired_caps)

    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', options=options)
    return driver

注意,新版本appium要用options参数,不能直接用desired_caps,否则会报错:

>           capabilities = options.to_capabilities()
E           AttributeError: 'NoneType' object has no attribute 'to_capabilities'

报错图如下:

在pytest测试用例中调用appium

这个例子我们调用appium获取设备的屏幕宽度并打印出来

python 复制代码
@allure.feature("设备信息模块")
class TestDeviceInfo:

    @allure.story("设备信息故事")
    @allure.description("设备信息描述")
    @allure.severity(allure.severity_level.BLOCKER)
    def test_get_device_info(self, cmdopt):
        print('test_get_device_info start')
        print('get cmdopt:' + cmdopt)
        
        driver = get_appium_driver()
        width = driver.get_window_size()['width']
        print('screen width {}'.format(width))
        
        print('test_get_device_info end')

运行结果:

到此Python+Appium+Pytest+Allure框架就串连起来了。

更多功能

  1. yaml
    yaml也可以整合进来,比如把desired_caps存放到datas/caps.yml中,然后代码中去读这个配置,而不是写在代码里面。测试用例的步骤也可以用yaml表示,这里不再细说。
  2. 多进程/线程支持多设备同时进行测试
    这块可以单独拿一篇来说了,这里只说下思路,在代码中自动执行adb devices然后把所有adb设备都列举出来,每台设备开个线程或进程执行appium服务,每个服务端口配置成不一样的。
    不同设备根据不同端口访问appium服务进行设备操作。
    Python+Appium+Pytest+Allure自动化测试框架-安装篇
    作者:帅得不敢出门
相关推荐
深度学习lover1 小时前
[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
python·yolo·目标检测·计算机视觉·遥感航拍飞机和船舶识别
云起无垠2 小时前
【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位
人工智能·自动化
水木流年追梦2 小时前
【python因果库实战10】为何需要因果分析
开发语言·python
m0_675988233 小时前
Leetcode2545:根据第 K 场考试的分数排序
python·算法·leetcode
凡人的AI工具箱5 小时前
每天40分玩转Django:Django测试
数据库·人工智能·后端·python·django·sqlite
qyq15 小时前
Django框架与ORM框架
后端·python·django
企业软文推广5 小时前
企业如何选择媒体发稿平台及相关事项?媒介盒子分享
python
JM_life5 小时前
你的第一个博客-第一弹
python
Lay_鑫辰6 小时前
禾川HCQ1系列PAC脉冲控制步进驱动器
运维·人工智能·单片机·嵌入式硬件·自动化
No0d1es6 小时前
GESP CCF python二级编程等级考试认证真题 2024年12月
开发语言·python·青少年编程·gesp·ccf·二级