多进程执行分布式自动化测试
admin
2023-07-18 04:22:13
0

场景:
进入搜狗,输入搜索关键字进行搜索
利用多进程分布式实现

from multiprocessing import Pool
import os, time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from multiprocessing import Manager, current_process
import traceback

#定义测试行为函数:此处为打开搜狗搜索内容
def node_task(name, lock, arg, successTestCases, failTestCases):
    """

    :param name: 执行进程名
    :param lock:进程间的共享资源锁
    :param arg:node节点计算机、浏览器字典 ,如:{"node": "http://127.0.0.1:6666/wd/hub", "browserName": "chrome"}
    :param successTestCases:成功执行用例列表
    :param failTestCases:失败用例列表
    :return:返回成功执行、失败执行的用例列表
    """
    procName = current_process().name

    print("当前进程名:",procName)
    time.sleep(1.2)
    #获取节点计算机地址
    node_host = arg["node"]
    #获取浏览器
    browser = arg["browserName"]
    print(arg["node"])
    print(arg["browserName"])
    print('Run task %s (%s)...\n' % (name, os.getpid()))
    #获取用例执行的开始时间
    start = time.time()
    #获取driver对象
    driver = webdriver.Remote(
        #节点计算机
        command_executor="%s" %arg["node"],
        desired_capabilities={
            #浏览器
            "browserName": "%s" %arg["browserName"],
            "video": "True",
            "platform": "WINDOWS"})

    try:
        driver.maximize_window()
        driver.get("http://www.sogou.com")
        assert "搜狗" in driver.title
        element = driver.find_element_by_id("query")
        element.send_keys("测试开发")
        element.send_keys(Keys.RETURN)
        time.sleep(3)
        assert "测试开发" in driver.page_source
        #获取共享锁
        lock.acquire()
        #用例执行成功,用例加入成功列表
        successTestCases.append("TestCase: " + str(name))
        #释放共享锁
        lock.release()
        print("TestCase: " + str(name) + " done!")

    except AssertionError as e:
        #断言失败,打印异常信息
        print("AssertionError occur!" " testCase " + str(name))
        print(traceback.print_exc())
        #保存异常现场图片
        driver.save_screenshot("e:\\screenshot" + str(name) + ".png")
        #获取共享锁
        lock.acquire()
        #存储失败用例信息
        failTestCases.append("TestCase: " + str(name))
        #释放共享锁
        lock.release()
        print("测试用例执行失败")
    except Exception as e:
        print("Exception occur!")
        print(traceback.print_exc())
        driver.save_screenshot("e:\\screenshot" + str(name) + ".png")
        #获取共享锁,存储失败用例信息,并释放锁
        with lock:
            failTestCases.append("TestCase: " + str(name))
        print("测试 用例执行失败")

    finally:
        #退出驱动,并关闭所有窗口
        driver.quit()
    end = time.time()
    #打印用例执行时间
    print("Tast %s run %.2f seconds." % (name, (end - start)))

#封装多进程执行函数
def run(nodeSeq):
    """
    :param nodeSeq: 节点机器和浏览器字典,列表
    :return: 返回成功、失败用例列表successTestCases, failTestCases
    """
    #定义共享manager对象
    manager = Manager()
    #创建进程间共享的用例执行成功列表
    successTestCases = manager.list([])
    # 创建进程间共享的用例执行失败列表
    failTestCases = manager.list([])

    #创建一个共享资源锁,各进程共享
    lock = manager.Lock()
    #打印父进程ID
    print("Parent process %s." % os.getpid())
    #创建包含3个进程的进程池
    p = Pool(processes=3)
    #获取用例数量
    testCaseNumber = len(nodeSeq)
    #循环索引遍历用例列表,多进程执行node_task函数(搜狗搜索)
    for i in range(testCaseNumber):
        p.apply_async(node_task, args=(i + 1, lock, nodeSeq[i], successTestCases, failTestCases))

    print("Waiting for all subprocesses done...")
    #关闭p
    p.close()
    #等待各个子进程执行结束
    p.join()

    return successTestCases, failTestCases

#封装写测试结果函数
def resultReport(testCaseNumber, successTestCases, failTestCases):
    """

    :param testCaseNumber: 用例个数
    :param successTestCases: 成功执行列表
    :param failTestCases: 失败执行列表
    :return: 无
    """
    print("测试报告: \n")
    print("共执行测试用例:" + str(testCaseNumber) + "个\n")
    print("执行成功的测试用例: " + str(len(successTestCases)) + "个")
    if len(successTestCases) > 0:
        for t in successTestCases:
            print(t)
    else:
        print("没有执行成功的测试用例")
    print("执行失败的测试用例: " + str(len(failTestCases)) + "个")
    if len(failTestCases) > 0:
        for t in failTestCases:
            print(t)
    else:
        print("没有执行失败的测试用例")

if __name__ == "__main__":
    nodeList = [
        {"node": "http://127.0.0.1:6666/wd/hub", "browserName": "internet explorer"},
        {"node": "http://127.0.0.1:6666/wd/hub", "browserName": "chrome"},
        {"node": "http://127.0.0.1:6666/wd/hub", "browserName": "firefox"}]

    testCaseNumber = len(nodeList)
    #执行多进程函数
    successTestCases, failTestCases = run(nodeList)
    print("All processes done")
    #写测试结果
    resultReport(testCaseNumber, successTestCases, failTestCases)

相关内容

热门资讯

又一位!杰出天体物理学者自美归... 【文/观察者网 柳白】一位凭借黑洞研究成果斩获北美最杰出青年科学家专项奖学金的物理学家,已经放弃美国...
今年丢准考证的高考生已出现 今天2026年高考正式开启,然而似曾相识的场景,每年都会提前出现……据武汉警方消息,6月2日晚8时1...
美国考虑动用伊朗资产,帮助海湾... 据凤凰卫视援引路透社报道,美国政府试图将伊朗资产重新分配给波斯湾国家,用于重建工作,以及修复伊朗未来...
一天一个价!鸡蛋价格大涨近8成 “鸡蛋昨天4.99元/斤,今天就5.29元了,一天一个价。”据齐鲁晚报报道,6月1日中午,在济南市历...
英法德三国领导人将与泽连斯基会... 【环球网报道】据英国天空新闻网、《卫报》等媒体报道,英国首相斯塔默将于当地时间7日在伦敦唐宁街10号...
伊朗驻墨西哥大使:伊朗队被告知... 【环球网报道 记者 索炎琦】据法新社等媒体报道,伊朗驻墨西哥大使帕桑迪德周六(6日)表示,参加202...
中国气象局升级暴雨应急响应为三... 预计6月7日至8日,西南地区东部、江南、华南等地有大到暴雨,其中,四川东南部、重庆中部、贵州东部和南...
办理临时身份证、免费乘车……各... 高考在即,为了给高考考生营造良好的考试环境,各地在交通、供电、食品安全、天气等多方面推出暖心服务。在...
菲防长绕后厨躲中国记者幕后:代... 据央视·玉渊谭天报道,菲律宾防长更换路线,绕道后厨,避开中国媒体,这几天相信很多人都看到了这条视频。...
荔枝和龙眼杂交成功了,预计五六... 荔枝和龙眼有“宝宝”了!近日,在广州天河区的国家荔枝种质资源圃内,广东省农业科学院果树研究所研究人员...