【问题标题】:Global variables in python/ pytest Selenium Automationpython/pytest Selenium 自动化中的全局变量
【发布时间】:2021-06-15 20:50:47
【问题描述】:

我正在自动化一个依赖于其他测试的测试。

假设我有测试 setUp、testA、testB、testC。 setUp() 设置启动其他测试所需的服务器或资源。 testA、testB、testC 需要等到 setUp 完成,然后才应该并行启动。我的最终目标是并行化测试。我在没有任何并行执行的情况下成功地按顺序执行测试,因此 setUp -> testA -> testB -> testC 是它们完成的顺序,但实际上 testA、testB、testC 可以并行运行,因此按顺序运行它们是浪费时间。

这是我的项目的结构:

test_dummy.py

class Values:
       can_continue = False ## This holds the boolean value which I am using for other functions to check if they can continue with their test

class SetUp:
      def test_dummy_setUp():
              ## All the code to setUp the environment
              ##Once above code is done then set the can_continue to true
              Values.can_continue = True
class TestA:
      def test_methodA():
             while Values.can_continue is False:
                     sleep(10)
             ## When the can_continue is changed to True by setUp I want it to break out of loop and continue with execution
             ## Code to be executed
class TestB:
      def test_methodB():
             while Values.can_continue is False:
                     sleep(10)
             ## When the can_continue is changed to True by setUp I want it to break out of loop and continue with execution
             ## Code to be executed

当我使用 pytest 在并行执行中使用 3 个内核运行 test_dummy 时,为每个类打开 3 个浏览器(我使用 Seleniumbase 并使用 --distload),并且正如预期的那样,setUp 继续创建资源,而其他两个看到 can_continue 是最初假他们去睡觉。 当 setUp 完成创建资源时,即使在 setUp 中将 can_continue 设置为 True,看起来该更新也不会反映到其他两个方法,并且它们永远处于休眠状态。我可以理解,这可能是因为每个测试类在启动时都创建了一个新对象,并且没有反映更改,或者这可能根本不是正确的方法。我是 Python 新手,现在的范围让我很困惑。

我的最终目标是拥有一个可供所有三个类 SetUp、TestA、TestB 访问的变量,并且任何类所做的更改也必须立即对其他类可见。在 python 中实现这一目标的最佳方法是什么?

谢谢

【问题讨论】:

  • 让测试相互依赖不是一个好习惯。为什么不直接创建一个方法setup() 并在每次测试开始时调用它?在 NUnit (C#) 中,我们有一个 OneTimeSetUp 属性,我们可以将它放在一个方法上,使其在所有测试用例之前运行。我会在 python 中寻找一个并行...如果它不存在,我会感到震惊。
  • 嗨,杰夫,我尝试过使用 setup()。默认 setup() 为模块中的每个测试运行,这不是我想要的。 setup() 在开始时只需要运行一次,所有测试都必须等待设置完成,一旦完成,我希望测试并行执行。我尝试了从固定装置到在不同文件中使用全局变量和变量的所有方法,但到目前为止没有运气,或者我在某处做错了什么。
  • 我猜这其中的一些取决于 setup() 的实际作用,但您没有足够详细地描述它。一般来说,setup() 应该在每次测试之前运行,而不是一次。如果测试的每个实例都没有运行 setup(),则不能并行运行所有测试。最佳实践是每个测试启动一个浏览器,完成一个测试,然后关闭浏览器。这样每次运行都尽可能干净,并与其他测试隔离。

标签: python selenium pytest


【解决方案1】:

您似乎需要使用 pytest 固定装置。在夹具中设置测试,然后将夹具传递给测试。夹具将在测试之前执行。

代码如下所示:

@pytest.fixture
def setup():
      #setup everything here.

def test_methodA(setup):         
     ## Code to be executed
def test_methodB(setup):         
     ## Code to be executed

编辑:更新了代码以简化它。您不需要添加锁定变量并继续检查它。而且,如果您使用 pytest-xdist 并行化测试,这将正常工作。我不知道 SeleniumHub 如何并行化测试。

【讨论】:

  • setUp 和值不一定必须在类中。 test-dummy_setUp 可以是独立的方法,而 can_continue 可以是全局变量,它们不在某个类中。我只是将它们包装在课堂上,看看它是否有任何作用。我是python新手,只用了一周,所以如果你能说出你将如何修改代码的结构,那么我可以试着从中理解。
猜你喜欢
  • 1970-01-01
  • 2022-12-21
  • 2022-11-04
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多