自动化测试实现多线程

2023-10-27

自动化测试实现多线程

进程

进程就是一个程序在一个数据集上的一次动态执行过程;
我们编写的程序用来描述进程要完成哪些功能以及如何完成。

线程

线程页脚轻量级进程,他是一个基本的CPU执行单元,是进程中的实现;线程的出现是为了降低上下文切换的小号,提高系统的并发性。

线程与进程

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但是少有一个线程
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源
  • CPU分给线程,即真正在CPU上运行的线程

多线程原理与应用

并行与并发

并行:每个线程分配给独立的核心,线程同时运行
并发:多个线程在单个核心运行,统一时间一个线程运行,系统不停切换线程,看起来像是同时运行,实际上是线程不停切换

python的多线程

GIL 全局计时器锁:摸个线程想要执行必须先拿到GIL
python的多线程:其实同一时间只能运行一个线程,但是能实现并发

python多线程应用

不同代码运行效率不一样,我们可以通过多线程,形成并发,实现提高效率
案例:web自动化,其实CPU执行完一次命令,大部分时间是在等待,那么这段时间,CPU会限制或者做其他进程的任务,因此我们可以使用多线程,实现多浏览器自动化同事运行,从而实现高效率

from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support.wait import WebDriverWait
import time
from ddt import ddt,data,unpack
import threading

data_sum = [
    {'sum_a': 2, 'sum_b': 3},
    {'sum_a': 2, 'sum_b': 3},
    {'sum_a': 5, 'sum_b': 10}
]

def run_first():
    desired_caps = {
        'platformName': 'Android',  # 被测手机是安卓
        'platformVersion': '7.1.2',  # 手机安卓版本
        'deviceName': 'xiaomi_mix',  # 设备名,安卓手机可以随意填写
        'appPackage': 'com.chinatower.fghd.customer',  # 启动APP Package名称
        'appActivity': 'com.ckd.fgbattery.activity.User_Login_Activity',  # 启动Activity名称
        'unicodeKeyboard': True,  # 使用自带输入法,输入中文时填True
        'resetKeyboard': True,  # 执行完程序恢复原来输入法
        'noReset': True,  # 不要重置App
        'newCommandTimeout': 5000,
        'UDID':'127.0.0.1:62001',
        'automationName': 'uiAutomator2'
        # 'app': r'd:\apk\bili.apk',
    }
    driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    #login_pwd(1,1)
    pwd = driver.find_element_by_xpath('//*[@text = "密码登录"]')
    print(pwd.get_attribute('text'))
    TouchAction(driver).tap(pwd).perform()
    pwd.click()
    driver.find_element_by_id("user_phone_et").send_keys('1')
    driver.find_element_by_id("sms_code_et").send_keys('1')
    driver.find_element_by_id("btn_res").click()
    # 登录错误时,无法跳转进入页面
    try:
        WebDriverWait(driver, 3, 1).until(lambda x: x.find_element_by_xpath("//*[@text='扫码换电']"))
        scan = driver.find_elements_by_xpath("//*[@text='扫码换电']")
        if scan:
            print("登录成功")
            return True
    except:
        print("登录失败")
        return False


def run_two():
    desired_caps_and5 = {
        'platformName': 'Android',  # 被测手机是安卓
        'platformVersion': '5.1.1',  # 手机安卓版本
        'deviceName': 'HuaWei P30',  # 设备名,安卓手机可以随意填写
        'appPackage': 'com.chinatower.fghd.customer',  # 启动APP Package名称
        'appActivity': 'com.ckd.fgbattery.activity.User_Login_Activity',  # 启动Activity名称
        'unicodeKeyboard': True,  # 使用自带输入法,输入中文时填True
        'resetKeyboard': True,  # 执行完程序恢复原来输入法
        'noReset': True,  # 不要重置App
        'newCommandTimeout': 5000,
        'UDID':'127.0.0.1:62026',
        'automationName': 'uiAutomator2'
        # 'app': r'd:\apk\bili.apk',
    }
    driver2 = webdriver.Remote('http://localhost:4725/wd/hub', desired_caps_and5)
    #login_pwd(2,2)
    time.sleep(10)
    print("第二个")
    pwd = driver2.find_element_by_xpath('//*[@text = "密码登录"]')
    print(pwd.get_attribute('text'))
    TouchAction(driver2).tap(pwd).perform()
    pwd.click()
    driver2.find_element_by_id("user_phone_et").send_keys('1')
    driver2.find_element_by_id("sms_code_et").send_keys('2')
    driver2.find_element_by_id("btn_res").click()
    # 登录错误时,无法跳转进入页面
    try:
        WebDriverWait(driver2, 3, 1).until(lambda x: x.find_element_by_xpath("//*[@text='扫码换电']"))
        scan = driver2.find_elements_by_xpath("//*[@text='扫码换电']")
        if scan:
            print("登录成功")
            return True
    except:
        print("登录失败")
        return False

    # @data(*data_sum)
    # @unpack
# def login_pwd(sum_a,sum_b):
#         pwd = driver.find_element_by_xpath('//*[@text = "密码登录"]')
#         print(pwd.get_attribute('text'))
#         TouchAction(self.driver).tap(pwd).perform()
#         pwd.click()
#         driver.find_element_by_id("user_phone_et").send_keys(sum_a)
#         driver.find_element_by_id("sms_code_et").send_keys(sum_b)
#         driver.find_element_by_id("btn_res").click()
#         # 登录错误时,无法跳转进入页面
#         try:
#             WebDriverWait(driver, 3, 1).until(lambda x: x.find_element_by_xpath("//*[@text='扫码换电']"))
#             scan = driver.find_elements_by_xpath("//*[@text='扫码换电']")
#             if scan:
#                 print("登录成功")
#                 return True
#         except:
#             print("登录失败")
#             return False

#
# # 连接Appium Server,初始化自动化环境
# driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# driver_p = webdriver.Remote('http://localhost:4725/wd/hub', desired_caps_and5)
#
# login_pwd(driver,1,1)
# login_pwd(driver_p,2,2)

if __name__ == '__main__':
    t1 = threading.Thread(target=run_first,name = 'thread1')
    t2 = threading.Thread(target=run_two,name='thread2')
    start_time = time.time()
    t1.start()
    t1.join()
    t2.start()
    print("当前活跃的线程有:{}".format(threading.current_thread()))

    print("正在运行的所有线程:{}".format(threading.enumerate()))

    print("正在运行的线程数量:{}".format(threading.active_count()))

    t2.join()
    end_time = time.time()
    print("程序运行耗时:{}".format(end_time - start_time))



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动化测试实现多线程 的相关文章

  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 为什么 Python 在导入脚本时只保存脚本的字节码?

    既然执行Python字节码会比运行原始源代码更快 因为Python不需要重新编译 为什么Python在导入脚本时只保存编译后的字节码呢 为每个执行的脚本保存 pyc 文件不是更好吗 无论如何 Python 解释器的启动时间都需要时间 即使您
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • django 模板 - 如何动态访问变量?

    假设我有一个具有以下上下文的 django 模板 data1 this is data1 data2 this is data2 data name data2 现在我知道了data name 假设它是 data2 是否可以用它来访问变量d
  • Django 多对多关系(类别)

    我的目标是向我的 Post 模型添加类别 我希望以后能够按不同类别 有时是多个类别 查询所有帖子 模型 py class Category models Model categories 1 red 2 blue 3 black title
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • Django 2、python 3.4 无法解码 urlsafe_base64_decode(uidb64)

    我正在尝试通过电子邮件激活用户 电子邮件有效 编码有效 我使用了 django1 11 中的方法 该方法运行成功 在 Django 1 11 中 以下内容成功解码为 28 其中 uidb64 b Mjg force text urlsafe
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 是否可以在Python中将日+月(不是年)与当前日+月进行比较?

    我正在获取 5 月 10 日 格式的数据 我试图弄清楚它是今年还是明年 该日期仅一年 因此 5 月 10 日表示 2015 年 5 月 10 日 而 5 月 20 日表示 2014 年 5 月 20 日 为此 我想将字符串转换为日期格式并进
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • 是否可以使用 Anaconda 包作为 Google Cloud Functions 的依赖项?

    我正在使用 Python 运行时编写 Google Cloud Function 我需要包含一些无法使用的依赖项pip 如文档中所述here https cloud google com functions docs writing spe
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import

随机推荐

  • 远程办公之:向日葵X 使用教程

    一 X版本简介 向日葵远程控制软件 X版本 是集主被控一体的全新客户端 偏向个人用户 只需要安装一个软件就能达到远程协助 查看主机列表 绑定硬件设备等功能 彻底结束了运行两个程序的历史 让远程操作真正做到 轻装上阵 方便用户实现快速的远程协
  • 【Leetcode】662. 二叉树最大宽度

    题目描述 题解 还记得二叉树层序遍历https blog csdn net fisherish article details 115791079 还有二叉堆的概念 结点如果为 i 那么左子节点值为 i 2 右子节点值为 i 2 1 结合一
  • 开发 mirai QQ机器人起步教程

    前言 虽然该文最终是达到以python开发mirai机器人的目的 但起步教程 尤其是环境配置上仍然有大量的相同操作 对其他编程语言仍有借鉴之处 假设你已经安装好了 Java Python等运行必须的环境 mirai生态 mirai官方生态文
  • vue学习笔记:三种for循环用法

    vue学习笔记 三种for循环用法 需求 遍历books数组 计算出总价格 price是单价 count是数量 for的第一种用法 也是最普通的一种 let totalPrice 0 for let i 0 i lt this books
  • 2018焦作网络赛E

    区间更新加法与乘法 x取反是2 64 x 1 由于取模所以取反变成 x 1 就区间 1再 1就可以了 最后区间询问求和 include
  • IDEA配置运行非Maven项目-非常详细

    文章目录 一 写在前面 1 1 为啥会有此篇博文 1 2 准备 二 正文 2 1 使用IDEA打开 Open 项目 2 2 打开项目结构 Project Structure 2 2 1 打开方式 2 2 2 项目结构配置内容总览 2 2 3
  • DANA简介

    Dynamically Allocated Neural Network DANA Accelerator https github com bu icsg dana spinalHDL Doc https spinalhdl github
  • 04-----git查看相应信息的操作

    git branch a 查看所有分支 git log p master remotes origin master 查看本地的master分支和remotes origin master分支的差别 git status 可以查看到工作区
  • shell 脚本学习

    1 bin bash 指定解释器是 bash 解释器有几种 2 a 1 给a赋值为1 注意中间不能有空格 赋值时不能有空格 3 unset a 取消变量a 4 readonly a 10 声明a为只读变量 并且赋值为10 注意这时就不能用u
  • Flutter环境搭建报错:What went wrong: A problem occurred configuring root project 'android'

    window下 在AS中搭建Flutter环境 创建Flutter项目报错 报错信息如下 文件加载失败 需要更换gradle文件中的镜像 找到 gradle文件 2 更改镜像 更改镜像 repositories google jcenter
  • 软件2.0时代之三:毛新生谈他眼中的Web2.0

    软件2 0时代之三 毛新生谈他眼中的Web2 0 2007 08 31 来自 CSDN 共有评论 7 条 发表评论 收藏到我的网摘 Web是一个 活物 是一个时时新 日日新 每天都在生长着的世界上最大的开放分布式系统 Web和以前的IT系统
  • How to Install one Plug-in into Eclipse

    How to Install One New Plug in Old Way before Eclipse 3 4 Installed new plug ins by dumping them in the eclipse plugins
  • 笔试

    文章目录 前言 36 异步FIFO的设计 1 先从同步FIFO说起 2 异步FIFO介绍 3 空满判断 4 跨时钟域问题 5 关于格雷码的转换 6 代码实现异步FIFO 7 几点思考 8 写在后面 往期精彩 前言 嗨 来啦 今天学习一个 比
  • 对象数组去重——数组删除所有含有固定id的对象

    一 重要方法 filter 方法可以创建一个新的数组 新数组中的元素是通过检查指定数组中符合条件的所有元素 1 数组去重 86 77 77 86 gt 86 77 去除重复元素依靠的是indexOf总是返回第一个元素的位置 后续的重复元素位
  • The inferior stopped because it received a signal from the Operating System.

    前景提要 要理解这个错误的根源 根源 用户的指针指向了系统的内存区域 表象 程序异常结束 exe crashed 编译可以通过 dedug时出现 The inferior stopped because it received a sign
  • 阿里云 OSS介绍

    1 什么是阿里云 OSS OSS 为 Object Storage Service 即对象存储服务 是阿里云提供的海量 安全 低成本 高可靠的云存储服务 OSS 具有与平台无关的 RESTful API 接口 可以在任意应用 任意时间 任意
  • 代码重复率检查工具jsinspect 检查重复代码,去掉冗余代码。

    jscpd jsinspect npm install g jsinspect 检测复制粘贴和结构类似的JavaScript代码
  • Flutter 图片裁剪

    参考一 参考二 参考三
  • 「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

    OceanBase 4 1 体验 前言 OCP Express在线升级功能 租户级物理备库 TP 事务处理 和AP 分析处理 优化 TP 性能优化 AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4 1的初体验
  • 自动化测试实现多线程

    自动化测试实现多线程 进程 进程就是一个程序在一个数据集上的一次动态执行过程 我们编写的程序用来描述进程要完成哪些功能以及如何完成 线程 线程页脚轻量级进程 他是一个基本的CPU执行单元 是进程中的实现 线程的出现是为了降低上下文切换的小号