前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动化的分布式

自动化的分布式

作者头像
赵云龙龙
发布2021-04-23 11:16:39
8800
发布2021-04-23 11:16:39
举报
文章被收录于专栏:python爱好部落python爱好部落

当团队自动化用例达到一定数量后,如果仅在一台执行机上执行,执行时间就可能会达到几个小时以上,无法满足版本发布节点的时间要求,如何减少总的自动化用例执行时间就是不得不解决的问题,本文介绍采用pytest、selenium grid实现自动化用例的并发分布式执行方案。 Selenium Grid 是 selenium 的三大组件之一,允许用户同时在不同的机器和系统上测试不同的浏览器,可以分布式的来执行我们的自动化测试,也可以测试不同浏览器的兼容性。

Selenium Grid 的组成:

hub节点(控制器) 中心节点,控制节点。 管理各个 node 节点的注册信息和状态。 接受并转发客户端(测试脚本)请求到合适的 node 节点。 node 节点(执行器) 子节点,代理点。 负责注册配置信息到 hub 节点(平台,浏览器,浏览器版本) 负责接收来自 hub 节点转发的请求以执行具体用例。 也可单独作为远程节点执行测试用例。

环境准备

  • 在需要执行脚本的机器上安装 jdk 和配置环境变量。
  • 然后下载 selenium-server-standalone-x.x.x.jar, 版本对应自己使用selenium 的版本。

首先你得查看你本机的selenium版本号 用这个命令可以查看:

pip show selenium

然后去下载对应的版本,下载地址:https://npm.taobao.org/mirrors/selenium

因为我只有一台电脑用来调测,所以Hub和Node节点我都部署在一台执行机上,规划如下

Hub节点   192.168.31.200:4444
Node节点1 192.168.31.200:5555
Node节点2 192.168.31.200:5556

打开cmd窗口,启动Hub节点

java -jar selenium-server-standalone-3.141.59.jar -role hub -port 4444

参数解释:

java -jar selenium-server-standalone-3.12.0.jar 运⾏jar包 -role hub 以 hub 的⻆⾊运⾏ -port 8888 指定hub运⾏的端⼝(默认为4444) -maxSession 10 最⼤的处理会话

打开两个新的cmd窗口,启动Node1、Node2节点 参数解释:

  • -Dwebdriver.chrome.driver="chromedriver.exe" 指定 chromeDriver 驱动所在的路径(本地)
  • -jar selenium-server-standalone-3.12.0.jar 执行jar包
  • -role node 以 node 角色执行。
  • -hub " http://192.168.1.104:18888/grid/register/" 将node 节点信息,注册到 对应的 hub 节点上。
  • -port 18881 node节点使用的端口。
  • -browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
    • browserName=chrome 运行的浏览器。
    • maxInstances=2 最多支持两个浏览器示例。
    • version=75 浏览器版本号。
    • platform=WINDOWS 运行的平台

注:Node节点需要下载正确的webdriver,并将webdriver路径加入到系统环境变量中,本文仅以chrome webdriver进行举例,如需其他浏览器执行用例,请类比自行完成相关配置。

java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.31.200:4444/grid/register/ -browser "browserName=chrome,maxinstance=5,platform=WINDOWS" -port 5555
java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.31.200:4444/grid/register/ -browser "browserName=chrome,maxinstance=5,platform=WINDOWS" -port 5556

浏览器访问URL:http://192.168.31.200:4444/grid/console 可以看到两个Node节点已正常注册,至此selenium grid部署完成。实际情况下,Node节点往往需要部署到多个不同的服务器或虚拟机上,单台服务器或虚拟机往往也有必要部署多个Node节点以节省硬件资源需求。

另外,selenium需要通过Remote方式执行,以chrome为例,关键部分的代码如下:

from selenium import webdriver
 
driver = webdriver.Remote(command_executor="http://192.168.31.200:4444/wd/hub"),
                          desired_capabilities={
                             "browserName": "chrome",
                             "javascriptEnabled": True
                          })
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("search content")
driver.find_element_by_xpath('//input[@type="submit"]').click()

相比于非Remote方式,仅仅是新建webdriver实例的方式不同,如果以前的测试代码是以本地方式执行,则仅需将webdriver.Chrome创建实例方法修改为webdriver.Remote方法,其中command_executor参数仅需传入Hub节点的连接,实际执行时Hub节点会自动选择已注册的Node节点进行执行,同时Hub节点也会自动检测到失效的节点并及时将其剔除。

好了,我们来跑一下:

import pytest
from selenium import webdriver
import time, os
import allure


data = [('beerbox', 'xxx'), ('snake', 'xxx')]
id = ["adminlogin", "guestlogin"]


@pytest.fixture()
def driver():
    _driver = webdriver.Remote(command_executor="http://10.128.36.179:4444/wd/hub",
    desired_capabilities = {
        "browserName": "chrome",
        "javascriptEnabled": True
    })

    yield _driver
    _driver.quit()

@allure.story("differnt user login")
@allure.description("{} log in".format(id))
@pytest.fixture(autouse=True, params=data, ids=id)
def login(request, driver):
    username = (request.param)[0]
    password = (request.param)[1]

    driver.get("https://testerhome.com/account/sign_in")
    time.sleep(2)
    username_loc = driver.find_element_by_id("user_login")
    username_loc.clear()
    with allure.step("input username {}".format((request.param)[0])):
        username_loc.send_keys(username)
    password_loc = driver.find_element_by_id("user_password")
    password_loc.clear()
    password_loc.send_keys(password)
    driver.find_element_by_name("commit").click()

    yield
    with allure.step("logout or quit"):
        driver.delete_all_cookies()
    # driver.find_element_by_class_name("dropdown-toggle nav-link").click()
    # driver.find_element_by_link_text("退出")


def test_login(login, driver):
    time.sleep(3)
    assert 1 == 1


@allure.step("go to profile page")
@allure.description("just check profile page")
def test_profile(driver):
    time.sleep(3)
    driver.find_element_by_id("navbar-user-menu").click()
    assert 1 == 1


@allure.step("go to 个人资料设置 page")
@allure.description("just check 个人资料设置 page")
def test_setting(driver):
    time.sleep(3)
    driver.find_element_by_link_text("个人资料设置").click()
    driver.back()
    assert 1 == 1


@allure.step("go to 记事本 page")
@allure.description("just check 记事本 page")
def test_node(driver):
    time.sleep(3)
    driver.find_element_by_link_text("记事本").click()
    driver.back()
    assert 1 == 1


if __name__ == "__main__":
    # pytest.main(["-vs", "test_home.py","-n=4"])
    pytest.main(["-vs", "test_home.py", "--alluredir", "./report", "-n=4"])
    os.system("allure serve ./report")

可以看到机器上两个node轮流跑,跑出来的结果,54秒,

比单进程跑1分10秒 要快10几秒。 如果我们进程设置为2,那么结果又是如何呢?

发现比一台机器上2个进程跑,会快10多秒。

selenium 分布式,再结pytest-xdist, 确实能提高效率。 对于分布式,最好的是结合docker。这样测试效率会大大提高。

对于昨天考虑的,指定某些机器执行某些case, 可以考虑调度,在jenkins pipline里并行调度,这样就能节省很多时间。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档