gpt4 book ai didi

python - 如何在测试套件中并行执行测试

转载 作者:行者123 更新时间:2023-12-04 16:08:27 25 4
gpt4 key购买 nike

我设法通过对 selenium 集线器和节点使用 webdriver 并行运行测试。在运行测试之前调用此代码。

cls.driver = webdriver.Remote(
command_executor="http://localhost:4444/wd/hub",
desired_capabilities={
"browserName": "chrome",
})

cls.driver.maximize_window()
cls.driver.get(cls.serverUrl)
p = multiprocessing.Process(target=cls.driver.get(cls.serverUrl), args=())
p.start()
p.join()

通过这种方式,我可以通过从 Eclipse 手动执行来启动多个浏览器。但是,我想在测试套件中自动执行此操作。但是在测试套件中,所有测试都是按顺序开始的。如果有人知道如何继续,那就太好了。

最佳答案

预赛

我准备了一些示例测试以供使用。这些是一些简单的页面标题检查。我们有一个模块 test_google.py两个单元测试检查 www.google.com 的标题和 mail.google.com :

# test_google.py

import unittest
from selenium import webdriver


class GoogleTests(unittest.TestCase):

def setUp(self):
self.driver = webdriver.Chrome()

def tearDown(self):
self.driver.close()


def test_google_page_title(self):
self.driver.get('https://www.google.com')
assert self.driver.title == 'Google'

def test_gmail_page_title(self):
self.driver.get('https://mail.google.com')
assert self.driver.title == 'Gmail'

第二个模块是 test_stackoverflow.py包含一个检查 stackoverflow.com 标题的测试:
# test_stackoverflow.py

import unittest
from selenium import webdriver


class StackoverflowTests(unittest.TestCase):

def setUp(self):
self.driver = webdriver.Chrome()

def tearDown(self):
self.driver.close()


def test_so_page_title(self):
self.driver.get('https://stackoverflow.com')
assert 'Stack Overflow' in self.driver.title

使用裸机运行测试 unittest转轮产量:
$ python setup.py test
running test
running egg_info
...
running build_ext
test_gmail_page_title (test_google.GoogleTests) ... ok
test_google_page_title (test_google.GoogleTests) ... ok
test_so_page_title (test_stackoverflow.StackoverflowTests) ... ok

----------------------------------------------------------------------
Ran 3 tests in 11.657s

OK

迁移到 pytest
安装 pytest来自 pip :
$ pip install pytest
pytest支持开箱即用的单元测试,所以我们不需要接触测试,我们可以立即运行它们。试用 pytest运行者:
$ pytest -v
================ test session starts ================
platform darwin -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-47439103, inifile:
collected 3 items

test_google.py::GoogleTests::test_gmail_page_title PASSED
test_google.py::GoogleTests::test_google_page_title PASSED
test_stackoverflow.py::StackoverflowTests::test_so_page_title PASSED

================ 3 passed in 13.81 seconds ================

并行运行测试

这需要 pytest-xdist pytest 的插件.通过 pip 安装:
$ pip install pytest-xdist

该插件现已安装,但默认情况下不会激活,因此如果您运行 pytest再次,你不会注意到任何区别。使用 numprocesses并行化测试执行的关键。这表示保留用于运行测试的进程数,这里我使用 auto产生与我的机器拥有的 CPU 一样多的进程的值(value):
$ pytest -v --numprocesses=auto
================ test session starts ================
platform darwin -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-47439103, inifile:
plugins: xdist-1.20.1, forked-0.2
[gw0] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw1] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw2] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw3] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw0] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw1] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw2] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw3] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
gw0 [3] / gw1 [3] / gw2 [3] / gw3 [3]
scheduling tests via LoadScheduling

test_google.py::GoogleTests::test_google_page_title
test_stackoverflow.py::StackoverflowTests::test_so_page_title
test_google.py::GoogleTests::test_gmail_page_title
[gw0] PASSED test_google.py::GoogleTests::test_gmail_page_title
[gw1] PASSED test_google.py::GoogleTests::test_google_page_title
[gw2] PASSED test_stackoverflow.py::StackoverflowTests::test_so_page_title

================ 3 passed in 7.81 seconds ================

您将看到所有三个测试都由同时打开的三个 chrome 实例并行运行。每个测试都在自己的进程中运行,因此它们不会相互干扰。另外,请注意 GoogleTests 中的两种测试方法类也并行运行,因此这不仅限于不同模块或类中的测试。

setup.py 集成

当我第一次开始迁移到 pytest 时,我的条件之一是命令 python setup.py test应该仍然有效,所以我们不需要记住额外的 pytest命令来运行测试,因此我们也不必调整我们所有的实用程序脚本或在我们的集成服务器上构建作业,所以这里是更新您的 setup.py 的步骤脚本:
  • 添加以下包以测试需求:
    from setuptools import setup

    setup(
    ...
    tests_require=[
    'pytest',
    'pytest-runner', # this one is needed to install distutils command for pytest
    'pytest-xdist'
    ],
    )
  • setup.cfg 添加别名:
    [aliases]
    test=pytest
  • pytest 添加配置部分在 setup.cfg :
    [tool:pytest]
    addopts=--verbose --numprocesses=auto

  • 现在,如果你运行 python setup.py test , 将调用正确的运行器和 xdist默认情况下插件将处于事件状态。

    补充说明

    我个人非常喜欢 pytest因为它提供的不仅仅是简单的测试执行 - 您可以将测试编写为纯函数(不需要包装到 TestCase 类中),收集测试而不执行它们,轻松地仅重新运行最近失败的测试,使用多个 Hook 代码覆盖率测量不同格式的报告等等。引用 official docs欲知更多详情,真的值得花时间阅读!

    关于python - 如何在测试套件中并行执行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47439103/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com