Appium+Pytest+Allure实现APP自动化测试,小试牛刀

Hi,大家好。Appium结合Pytest开展App自动化测试时,你知道如何自动运行用例并发执行吗?费话不多说,直接上代码, 毕竟想让每个人都能看明白也不容易,所以附上代码,有兴趣的自行研究,如需获取框架源码可以在ITester软件测试公众号后台回复”APP框架”。

一、项目介绍

1、项目环境

项目环境如下:

  • Python
  • pytest
  • allure
  • appium
  • node
  • 夜神模拟器

2、项目环境

项目结构截图如下所示:

项目结构说明:

  • base:存放基本的方法;
  • cases:存放测试用例;
  • common:一些公共的方法;
  • config:存放配置文件;
  • log:日志文件;
  • image:存放测试截图;
  • Page:测试的定位元素;
  • report:测试报告;
  • pytest.ini:pytest启动配置文件;
  • requirements.txt:需要安装的py模块;
  • run.py:运行文件。

二、项目实现

1、base_page.py
base/base_page.py:封装一些方法,元素的点击、输入、查找,还有一些自己需要的公共方法也封装在此。

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

2、check_port.py

common/check_port.py:检测端口是否被占用,如被占用则释放。

#!/usr/bin/python3
-*- coding:utf-8 -*-
@Software:PyCharm
@File : check_port.py

import socket
import os

def check_port(host, port):
    """检测指定的端口是否被占用"""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建socket对象
    try:
        s.connect((host, port))
        s.shutdown(2)
    except OSError:
        print('port %s is available! ' % port)
        return True
    else:
        print('port %s already be in use !' % port)
        return False

def release_port(port):
    """释放指定的端口"""
    cmd_find = 'netstat -aon | findstr {}'.format(port)  # 查找对应端口的pid
    print(cmd_find)

    # 返回命令执行后的结果
    result = os.popen(cmd_find).read()
    print(result)

    if str(port) and 'LISTENING' in result:
        # 获取端口对应的pid进程
        i = result.index('LISTENING')
        start = i + len('LISTENING') + 7
        end = result.index('\n')
        pid = result[start:end]
        cmd_kill = 'taskkill -f -pid %s' % pid  # 关闭被占用端口的pid
        print(cmd_kill)
        os.popen(cmd_kill)
    else:
        print('port %s is available !' % port)

if __name__ == '__main__':
    host = '127.0.0.1'
    port = 4723
    if not check_port(host, port):
        print("端口被占用")
        release_port(port)

3、 get_main_js.py

common/get_main_js.py:获取main.js,使用main.js启动appium server。

#!/usr/bin/python3
-*- coding:utf-8 -*-
@Software:PyCharm
@File : get_main_js.py

import subprocess
from config.root_config import LOG_DIR

"""
获取main.js的位置,使用main.js启动appium server
"""

class MainJs(object):
    """获取启动appium服务的main.js命令"""

    def __init__(self, cmd: str = "where main.js"):
        self.cmd = cmd

    def get_cmd_result(self):
        p = subprocess.Popen(self.cmd,
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             shell=True)
        with open(LOG_DIR + "/" + "cmd.txt", "w", encoding="utf-8") as f:
            f.write(p.stdout.read().decode("gbk"))
        with open(LOG_DIR + "/" + "cmd.txt", "r", encoding="utf-8") as f:
            cmd_result = f.read().strip("\n")
        return cmd_result

if __name__ == '__main__':
    main = MainJs("where main.js")
    print(main.get_cmd_result())

4、 desired_caps.yaml

config/desired_caps.yml:app自动化测试项目相关的yaml。

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

5、root_config.py

config/root_config.py:项目文件和路径配置信息。

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

6、 conftest.py

conftest.py:

#!/usr/bin/python3
-*- coding:utf-8 -*-
@Software:PyCharm
@File : root_config.py

from drivers.app_driver import BaseDriver
import pytest
import time

from common.check_port import release_port
base_driver = None

def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store", default="device_info", help=None)

@pytest.fixture(scope="session")
def cmd_opt(request):
    return request.config.getoption("--cmdopt")

@pytest.fixture(scope="session")
def common_driver(cmd_opt):
    cmd_opt = eval(cmd_opt)
    print("cmd_opt", cmd_opt)
    global base_driver
    base_driver = BaseDriver(cmd_opt)
    time.sleep(1)
    driver = base_driver.get_base_driver()
    yield driver
    # driver.close_app()
    driver.quit()
    release_port(cmd_opt["server_port"])

7、test_concurrent.py

cases/test_concurrent.py:绘制密码并解锁。

#!/usr/bin/python3
-*- coding:utf-8 -*-
@Software:PyCharm
@File : test_concurrent.py

import pytest
import time
from appium.webdriver.common.mobileby import MobileBy
from base.base_page import Base

class TestGesture(object):
    def test_gesture_password(self, common_driver):
        """简单的做了一个绘制手势密码的过程"""
        driver = common_driver
        base = Base(driver)
        base.skip_welcome_page('left', 3)  # 滑动屏幕
        time.sleep(3)  # 为了看滑屏的效果
        driver.start_activity(app_package="com.xxzb.fenwoo",
                              app_activity=".activity.user.CreateGesturePwdActivity")
        commit_btn = (MobileBy.ID, 'com.xxzb.fenwoo:id/right_btn')
        password_gesture = (MobileBy.ID, 'com.xxzb.fenwoo:id/gesturepwd_create_lockview')
        element_commit = base.find_element(commit_btn)
        element_commit.click()
        password_element = base.find_element(password_gesture)
        base.gesture_password(password_element, 1, 2, 3, 6, 5, 4, 7, 8, 9)
        time.sleep(5)  # 看效果

if __name__ == '__main__':
    pytest.main()

8、 run_case.py

run_case.py:运行文件。

#!/usr/bin/python3
-*- coding:utf-8 -*-
@Software:PyCharm
@File : run_case.py

import pytest
import os
from multiprocessing import Pool

device_infos = [
    {
        "platform_version": "5.1.1",
        "server_port": "4723",
        "device_port": "62001",
    },
    {
        "platform_version": "5.1.1",
        "server_port": "4725",
        "device_port": "62025",
    }
]

def main(device_info):
    pytest.main(["--cmdopt={}".format(device_info),
                 "--alluredir", "./allure-results", "-vs"])
    os.system("allure generate allure-results -o allure-report --clean")

if __name__ == "__main__":
    with Pool(2) as pool:
        pool.map(main, device_infos)
        pool.close()
        pool.join()

三、项目总结

1、项目效果

如下所示,最终实现启动APP,绘制解锁图案,进入APP主页。

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

2、项目思路

Pytest作为单元测试框架,要完成App测试自动化需要把Pytest和Appium进行整合,同时利用Allure完成测试报告的产出。编写App自动化测试的步骤如下:

1)设计待测试APP的自动化测试用例;

2)新建app测试项目;

3)配置conftestpy文件等;

4)编写整体app测试用例运行文件;

5)将设计好的自动化测试用例转化成脚本;

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

3、项目小结

上述只是初步实现了一个多手机并发的需求,希望项目更加的规范还需要引入PO设计模式,其次base_page.py中还可以封装更多的方法,上述代码中也只封装了几个方法,如果真正的把这个并发引入到项目中肯定还需要完善,感兴趣的小伙伴可以试试。

Appium+Pytest+Allure实现APP自动化测试,小试牛刀

Original: https://blog.csdn.net/caixiangting/article/details/125627985
Author: 测试小鬼
Title: Appium+Pytest+Allure实现APP自动化测试,小试牛刀

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773810/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 指针的初步认识

    🏖️作者:@malloc不出对象⛺专栏:《初识C语言》👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言 * 一、指针是什么 &#8…

    Python 2023年9月16日
    049
  • Pytest + Allure 测试报告生成,问题解决

    Allure 下载安装 Allure 下载地址:https://github.com/allure-framework/allure2/releases 配置安装: 解压到pyte…

    Python 2023年9月10日
    063
  • 2023跨年代码(烟花+雪花)

    一眨眼,马上就2023年了,祝大家在新的一年里:身体健康平安,生活充实饱满,事业步步高升,心情阳光灿烂,财运滚滚而来,家庭美满幸福,新年开心快乐! 本文将给大家分享一些跨年代码,基…

    Python 2023年9月5日
    0128
  • Python 国家地震台网 地震数据集完整分析、pyecharts、plotly,分析强震次数、震级分布、震级震源关系、发生位置、发生时段、最大震级、平均震级

    前情提要 编写这篇文章是为了记录自己是如何分析地震数据集,使用模块,克服一系列 (bug) 的过程。如果你是 (python) 初入数据分析的小白,那么这篇文章很适合你。阅读栏目时…

    Python 2023年5月24日
    064
  • 一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年8月1日
    042
  • Pyhton 批量筛选Excel的方法——Pandas的使用

    Pyhton 批量筛选Excel的方法——Pandas的使用 摘要 说明 * 1、初始化数据(可跳过) 2、根据条件筛选数据 摘要 在进行数据处理时,经常需要筛选出满足条件的数据,…

    Python 2023年8月17日
    058
  • venv:虚拟环境创建

    注:创建项目的路径不要用中文,可能会报错,影响运行) 1.创建django项目为例:(xiaomi) 和 子应用(users) 项目命令:django-admin startpro…

    Python 2023年8月3日
    043
  • 用户的交互

    用户的交互 用户交互:人往计算机中 input/输入数据,计算机print/输出结果 input 输入 输入input:程序执行input,程序就会停止下来等待用户键盘输入,用户输…

    Python 2023年5月23日
    070
  • 深入浅出PyTorch——PyTorch可视化

    1. 可视化网络结构 在复杂的网络结构中确定每一层的输入结构,方便我们在短时间内完成debug 1.1 使用print函数打印模型基础信息 使用ResNet18的结构进行展示 im…

    Python 2023年9月27日
    049
  • 企业应用架构研究系列十二:网络模型与网络协议

    最近研究IOT相关的技术与架构,由于网络上的资料质量并不是很好,很多文章把一些网络模型与协议混淆,因此梳理了一下这些概念。无论是做IOT平台还是微服务都是离不开网络开发这个一个重要…

    Python 2023年10月16日
    032
  • Python爬取全国各地区疫情风险等级

    需求 通过爬虫取得国家官网各地区疫情风险等级,存入电子表格最终如下: ; 数据来源 http://bmfw.www.gov.cn/yqfxdjcx/risk.html 分析网页 页…

    Python 2023年8月1日
    037
  • matplotlib绘制三维散点图的各种问题

    matplotlib绘制三维散点图 0 代码 目标1:读取aaaa.csv,选取b字段的数据,提取出b字段下c字段的不重复值目标2:以d、e、f三个字段为三维坐标,以g字段表示大小…

    Python 2023年9月3日
    034
  • Unity制作 小球吃金币 游戏

    工程源文件下载地址-百度网盘 1. 新建一个项目 2. 新建一个平面对象 3. 新建一个材质球 为材质球设置颜色 5. 将材质球拖拽赋值给平面 6. 创建立方体对象,拉伸至平面宽度…

    Python 2023年9月29日
    034
  • Python ❀ 文件操作

    Python学习计划(八) 一、路径1、构建通用路径Windows、Linux os系统上路径分隔符不同,所以最好统一 2、当前目录获取当前目录路径 改变当前路径 3、绝对路径于相…

    Python 2023年5月25日
    065
  • 1.scrapy框架介绍

    一、什么是scrapy框架? 先来看字面意思:框架。 一般来说,框架来源于建筑学,往往指建筑主体已经搭建好了,剩下的只是细枝末节的一些东西,比如安个门、砌一堵墙、开个窗户等等,不需…

    Python 2023年10月3日
    057
  • 【Linux】调试器gdb的使用

    目录 * – 👉什么是 gdb👈 – 👉gdb 的使用👈 – + 查看代码 + 设置断点 + 查看断点 + 删除断点 + 执行当前被调试的程序 …

    Python 2023年10月8日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球