全网最强,Python+Appium+pytest自动化测试,多设备并发+多线程(实战详细)

这篇具有很好参考价值的文章主要介绍了全网最强,Python+Appium+pytest自动化测试,多设备并发+多线程(实战详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Appium+python 实现单设备的 app 自动化测试

启动 appium server,占用端口 4723;
电脑与一个设备连接,通过 adb devices 获取已连接的设备;

在 python 代码当中,编写启动参数,通过 pytest 编写测试用例,来进行自动化测试。

若要多设备并发,同时执行自动化测试

需要:
确定设备个数;
每个设备对应一个 appium server 的端口号,并启动 appium;
pytest 要获取到每个设备的启动参数,然后执行自动化测试。;

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

实现策略

第1步:从设备池当中,获取当前连接的设备。若设备池为空,则无设备连接。

第2步:若设备池不为空,启动一个线程,用来启动appium server.与设备个数对应。
起始server端口为4723,每多一个设备,端口号默认+4

第3步:若设备池不为空,则启用多个线程,来执行app自动化测试。

具体实现步骤

1、通过 adb 命令,获取当前已连接的设备数、设备名称、设备的安卓版本号。
定义一个 ManageDevices 类。

重启adb服务。
通过adb devices命令获取当前平台中,已连接的设备个数,和设备uuid.
通过adb -P 5037 -s 设备uuid shell getprop ro.build.version.release获取每一个设备的版本号。
将所有已连接设备的设备名称、设备版本号存储在一个列表当中。
通过调用get_devices_info函数,即可获得4中的列表。

实现的部分代码为:

class ManageDevices:
    """
       1、重启adb服务。
       2、通过adb devices命令获取当前平台中,已连接的设备个数,和设备uuid.
       3、通过adb -P 5037 -s 设备uuid shell getprop ro.build.version.release获取每一个设备的版本号。
       4、将所有已连接设备的设备名称、设备版本号存储在一个列表当中。
       5、通过调用get_devices_info函数,即可获得4中的列表。
    """

    def __init__(self):
        self.__devices_info = []
        # 重启adb服务
        self.__run_command_and_get_stout("adb kill-server")
        self.__run_command_and_get_stout("adb start-server")

    def get_devices_info(self):
        """
        获取已连接设备的uuid,和版本号。
        :return: 所有已连接设备的uuid,和版本号。
        """
        self.__get_devices_uuid()
        print(self.__devices_info)
        self.__get_device_platform_vesion()
        return self.__devices_info

2、定义一个设备配置池。

设备启动参数管理池。
每一个设备:对应一个启动参数,以及appium服务的端口号。

desired_caps_config/desired_caps.yaml文件中存储了启动参数模板。
从1中的模板读取出启动参数。
从设备列表当中,获取每个设备的设备uuid、版本号,与2中的启动参数合并。
每一个设备,指定一个appium服务端口号。从4723开始,每多一个设备,默认递增4

每一个设备,指定一个本地与设备tcp通信的端口号。从8200开始,每多一个设备,默认递增4。

在启动参数当中,通过systemPort指定。
因为appium服务会指定一个本地端口号,将数据转发到安卓设备上。
默认都是使用8200端口,当有多个appium服务时就会出现端口冲突。会导致运行过程中出现socket hang up的报错。

实现的部分代码:

def devices_pool(port=4723,system_port=8200):
    """
    设备启动参数管理池。含启动参数和对应的端口号
    :param port: appium服务的端口号。每一个设备对应一个。
    :param system_port: appium服务指定的本地端口,用来转发数据给安卓设备。每一个设备对应一个。
    :return: 所有已连接设备的启动参数和appium端口号。
    """
    desired_template = __get_yaml_data()
    devs_pool = []
    # 获取当前连接的所有设备信息
    m = ManageDevices()
    all_devices_info = m.get_devices_info()
    # 补充每一个设备的启动信息,以及配置对应的appium server端口号
    if all_devices_info:
        for dev_info in all_devices_info:
            dev_info.update(desired_template)
            dev_info["systemPort"] = system_port
            new_dict = {
                "caps": dev_info,
                "port": port
            }
            devs_pool.append(new_dict)
            port += 4
            system_port += 4
    return devs_pool

特别注意事项:2 个及 2 个以设备并发时,会遇到设备 socket hang up 的报错。

原因是什么呢?
在 appium server 的日志当中,有这样一行 adb 命令:adb -P 5037 -s 08e7c5997d2a forward tcp:8200 tcp:6790

什么意思呢?
将本地 8200 端口的数据,转发到安卓设备的 6790 端口
所以,本地启动多个 appium server,都是用的 8200 端口,就会出现冲突。

解决方案:
应该设置为,每一个 appium server 用不同的本地端口号,去转发数据给不同的设备。
启动参数当中:添加 systemPort= 端口号 来设置。
这样,每个设备都使用不同的本地端口,那么可解决此问题。

3、appium server 启停管理

ps:此处可以使用 appium 命令行版,也可以使用桌面版

在自动化用例运行之前,必须让 appium server 启动起来。
在自动化用例执行完成之后,要 kill 掉 appium 服务。这样才不会影响下一次运行。

代码实现如下:

import subprocess
import os

from Common.handle_path import appium_logs_dir

class ManageAppiumServer:
    """
    appium desktop通过命令行启动appium服务。
    不同平台上安装的appium,默认的appium服务路径不一样。
    初始化时,设置appium服务启动路径
    再根据给定的端口号启动appium
    """

    def __init__(self,appium_server_apth):
        self.server_apth = appium_server_apth

    # 启动appium server服务
    def start_appium_server(self,port=4723):
        appium_log_path = os.path.join(appium_logs_dir,"appium_server_{0}.log".format(port))
        command = "node {0} -p {1} -g {2} " \
                  "--session-override " \
                  "--local-timezone " \
                  "--log-timestamp & ".format(self.server_apth, port, appium_log_path)
        subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True).communicate()

    # 关闭appium服务
    @classmethod
    def stop_appium(cls,pc,post_num=4723):
        '''关闭appium服务'''
        if pc.upper() == 'WIN':
            p = os.popen(f'netstat  -aon|findstr {post_num}')
            p0 = p.read().strip()
            if p0 != '' and 'LISTENING' in p0:
                p1 = int(p0.split('LISTENING')[1].strip()[0:4])  # 获取进程号
                os.popen(f'taskkill /F /PID {p1}')  # 结束进程
                print('appium server已结束')
        elif pc.upper() == 'MAC':
            p = os.popen(f'lsof -i tcp:{post_num}')
            p0 = p.read()
            if p0.strip() != '':
                p1 = int(p0.split('\n')[1].split()[1])  # 获取进程号
                os.popen(f'kill {p1}')  # 结束进程
                print('appium server已结束')

4、pytest 当中根据不同的启动参数来执行自动化测试用例

在使用 pytest 执行用例时,是通过 pytest.main()会自动收集所有的用例,并自动执行生成结果。

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

这种情况下,appium 会话的启动信息是在代码当中给定的。

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

以上模式当中,只会读取一个设备的启动信息,并启动与设备的会话。

虽然 fixture 有参数可以传递多个设备启动信息,但它是串行执行的。

需要解决的问题的是:
可以传递多个设备的启动参数,但不是通过 fixture 的参数。
每传递一个设备启动参数进来,执行一次 pytest.main()

解决方案:
通过 pytest 的命令行参数。即在 pytest.main()的参数当中,将设备的启动信息传进来。
使用 python 的多线程来实现。每接收到一个设备启动参数,就启动一个线程来执行 pytest.main

1)第一个,pytest 的命令行参数。
首先需要在 conftest.py 添加命令行选项,命令行传入参数”–cmdopt“。

用例如果需要用到从命令行传入的参数,就调用 cmdopt 函数。

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

代码如下:

def pytest_addoption(parser):
    parser.addoption(
        "--cmdopt", action="store", default="{platformName:'Android',platformVersion:'5.1.1'}",
        help="my devices info"
    )


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


@pytest.fixture
def start_app(cmdopt):
    device = eval(cmdopt)
    print("开始与设备 {} 进行会话,并执行测试用例 !!".format(device["caps"]["deviceName"]))
    driver = start_appium_session(device)
    yield driver
    driver.close_app()
    driver.quit()

2)使用多线程实现: 每接收到一个设备启动参数,就启动一个线程来执行 pytest.main

定义一个 main.py。

run_case 函数。
此方法主要是:接收设备启动参数,通过 pytest.main 去收集并执行用例。

# 根据设备启动信息,通过pytest.main来收集并执行用例。
def run_cases(device):
  """
  参数:device为设备启动参数。在pytest.main当中,传递给--cmdopt选项。
  """
    print(["-s", "-v", "--cmdopt={}".format(device)])
    reports_path = os.path.join(reports_dir,"test_result_{}_{}.html".format(device["caps"]["deviceName"], device["port"]))
    pytest.main(["-s", "-v",
                 "--cmdopt={}".format(device),
                 "--html={}".format(reports_path)]
                )

每有一个设备,就启动一个线程,执行 run_cases 方法。

# 第一步:从设备池当中,获取当前连接的设备。若设备池为空,则无设备连接。
devices = devices_pool()

# 第二步:若设备池不为空,启动appium server.与设备个数对应。起始server端口为4723,每多一个设备,端口号默认+4
if devices and platform_name and appium_server_path:
    # 创建线程池
    T = ThreadPoolExecutor()
    # 实例化appium服务管理类。
    mas = ManageAppiumServer(appium_server_path)
    for device in devices:
        # kill 端口,以免占用
        mas.stop_appium(platform_name,device["port"])
        # 启动appium server
        task = T.submit(mas.start_appium_server,device["port"])
        time.sleep(1)

    # 第三步:若设备池不为空,在appium server启动的情况下,执行app自动化测试。
    time.sleep(15)
    obj_list = []
    for device in devices:
        index = devices.index(device)
        task = T.submit(run_cases,device)
        obj_list.append(task)
        time.sleep(1)

    # 等待自动化任务执行完成
    for future in as_completed(obj_list):
        data = future.result()
        print(f"sub_thread: {data}")

    # kill 掉appium server服务,释放端口。
    for device in devices:
        ManageAppiumServer.stop_appium(platform_name, device["port"])
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

二、接口自动化项目实战

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

三、Web自动化项目实战

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

四、App自动化项目实战

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

五、一线大厂简历

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

六、测试开发DevOps体系

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

七、常用自动化测试工具

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

八、JMeter性能测试

多线程测试工具,自动化测试,软件测试,App自动化测试,appium,软件测试,自动化测试,自动化测试框架,python自动化测试,App自动化测试,pytest自动化测试框架

九、总结(尾部小惊喜)

燃烧心中的激情,追逐梦想的轨迹;勇往直前,超越自我,用汗水书写辉煌篇章;不畏失败,敢于冒险,奋力拼搏才能收获成功的喜悦;坚信自己,坚守初心,只要努力,未来必将闪耀光芒。

信念如火燃烧,奋斗成就辉煌;脚步坚定不停歇,努力奋斗路漫漫;挑战困难毫不畏惧,勇往直前追梦想;相信自己,超越极限,激情奋斗创未来。

梦想是灵魂的引路人,奋斗是实现的唯一途径;勇往直前,不畏艰难,每一次努力都在离成功更近的地方;坚持信念,超越自我,将激情与拼搏融入生命的旋律中,创造属于自己的辉煌。文章来源地址https://www.toymoban.com/news/detail-787900.html

到了这里,关于全网最强,Python+Appium+pytest自动化测试,多设备并发+多线程(实战详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事

    文本主要介绍下 Pytest+Allure+Appium 记录一些过程和经历。 法主要用了啥: Python3 Appium Allure-pytest Pytest Appium 不常见却好用的方法 Appium 直接执行 adb shell 方法 #Appium 启动时增加 --relaxed-security 参数 Appium 即可执行类似adb shell的方法 appium -p 4723 --relaxed-security #使用方法 def adb_shell(se

    2024年01月25日
    浏览(33)
  • 全网最细最全Appium自动化测试 iOS入门教程,App自动化测试教程,精细整理

    目录:导读 一、MAC电脑上 Appium 的安装流程 二、流程图 三、下载AppiumServerGui和AppiumInspector 四、开始测试       1、真机测试                 1.1 准备工作                 1.2 获取 开发包 .app 结尾                 1.3 WebDriverAgent使用                 1.4 配置 Appium Inspec

    2024年02月07日
    浏览(38)
  • 全网超全,pytest自动化测试框架pytest.ini配置文件详细(实战)

    pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行 非test文件 pytest里面有些文件是非test文件 pytest.ini:pytest的主配置文件,可以改变pytest的默认行为 conftest.py:测试用例的一些fixture配置 init .py:识别该文件夹为p

    2024年02月11日
    浏览(35)
  • 火爆全网,Pytest自动化测试框架-测试用例执行与失败重跑(实战详细)

    用例执行状态 用例执行完成后,每条用例都有自己的状态,常见的状态有 passed:测试通过 failed:断言失败 error:用例本身写的质量不行,本身代码报错(譬如:fixture不存在,fixture里面有报错) xfail:预期失败,加了 @pytest.mark.xfail() error例子1:参数不存在 为啥是error pwd参数

    2024年02月11日
    浏览(28)
  • Selenium+Pytest自动化测试框架实战,还不会点这里一清二楚,全网最细教程!

    在华为工作了10年的大佬出的Web自动化测试教程,华为现用技术教程!_哔哩哔哩_bilibili 在华为工作了10年的大佬出的Web自动化测试教程,华为现用技术教程!共计16条视频,包括:1. 【web自动化】主流Web自动化测试技术对比、2. 【web自动化】Selenium自动化测试环境一键搭建、

    2024年02月02日
    浏览(56)
  • App自动化测试|Appium+Python自动化测试环境搭建

    搭建过程步骤如下: 安装jdk并配置好环境变量(jdk版本1.8以上) 安装android-sdk并配置好环境变量;具体步骤见:Android Studio安装(推荐使用这种方法安装SDK) - 环境配置 - 测试人社区 安装安卓模拟器 安装node.js(官网下载安装最新版本) ;下载地址:下载 | Node.js 中文网 找到wind

    2024年02月12日
    浏览(28)
  • appium+python自动化测试

    1、aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity 2、在android-sdk里面双击SDK-manager,下载buidl-tools 3、勾选build-tools,随便选一个版本,我这里选的是24的版本 4、下载完成后:在D:androidsdkandroid-sdk-windowsbuild-tools24.0.0目录下找到aapt.e

    2024年02月10日
    浏览(29)
  • 【python+appium】自动化测试

    python+appium自动化测试系列就要告一段落了,本篇博客咱们做个小结。 首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过

    2024年02月14日
    浏览(25)
  • 使用【Python+Appium】实现自动化测试

    一、环境准备 1.脚本语言:Python3.x    IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:SoftwareAndroid_SDKplatform-tools 4.安装Appium for windows,官网地址 Redirecting  点击下载按钮会到GitHub的下载页面,选择对应平台下载   安装完成后,启动Appium,host和port默认的即可,然

    2024年02月08日
    浏览(33)
  • Python +Appium 实现app自动化测试

    一、Appium简介 Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrome上的Safari或Android上的内置“浏览器”应用

    2023年04月09日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包