【问题标题】:Python: Unit Test opening mulitiple browser windowsPython:单元测试打开多个浏览器窗口
【发布时间】:2017-06-16 06:31:14
【问题描述】:

我正在解决我在使用 Selenium 和 Python 3.5 时遇到的问题。我正在尝试将 unittest 框架实现到我的自动化中,但是每当我创建测试套件时,测试会在实际执行测试用例之前打开多个浏览器窗口。

通过排除过程,我将其归结为这部分代码:

def primary():
    primary = unittest.TestSuite()
    primary.addTest(unittest.makeSuite(PrimaryMethods, 'setUp'))
    primary.addTest(unittest.makeSuite(PrimaryMethods, 'test_ModuleLoop_header'))
    primary.addTest(unittest.makeSuite(PrimaryMethods, 'test_ModuleLoop_nonheader'))
    primary.addTest(unittest.makeSuite(PrimaryMethods, 'tearDown'))
    return primary

if __name__ == '__main__':
    TEST_RUNNER = unittest.TextTestRunner()
    TEST_SUITE = primary()
    TEST_RUNNER.run(primary)

当我删除创建测试套件的部分并仅在 if 语句中使用 unittest.main() 时,它仅在一个浏览器窗口中运行良好。但是,我知道随着我的测试用例变得越来越复杂,我会想开始使用测试套件。有谁知道在继续测试用例之前,其中的什么会使 setUp 自行运行 4 次?

这是我的设置和拆解部分:

   def setUp(self):   
    driver = webdriver.Firefox
    init () #for colorama

    def tearDown(self):
    driver = webdriver.Firefox
    driver.close()
    driver.quit()

我取出正在运行的代码并将其修改回包含 def primary() 和 TEST_RUNNER.run(primary) 代码。我从 setUp 部分中删除了 init() 调用,因此除了加载浏览器之外,setUp 中没有任何内容。当我在整个脚本中放置断点时,这是我看到的行为:

  1. def setUp(self) 在开始时立即调用
  2. def setUp(self) 再次调用
  3. 如果 name == 'ma​​in' 和 def primary() 被调用
  4. driver = webdriver.Firefox 被调用
  5. 第一个浏览器打开
  6. driver = webdriver.Firefox 被第二次调用。两个测试用例和tearDown都没有动。
  7. 第二个浏览器打开
  8. tearDown(self) 被调用。
  9. 第二个浏览器已关闭
  10. driver = webdriver.Firefox 被第三次调用。
  11. 第三个浏览器打开
  12. tearDown(self) 被调用
  13. 第三个浏览器关闭
  14. driver = webdriver.Firefox 被第四次调用。
  15. 第一个测试用例终于开始了

【问题讨论】:

  • 发布其余代码,或至少足以提供相关上下文。您提到问题是“启动浏览器”,该代码在哪里?
  • 我将我的设置添加到主要问题中。
  • 我建议发布一个显示问题的可运行代码的完整示例,而不是它的点点滴滴

标签: python unit-testing selenium


【解决方案1】:

我想我已经找到了解决办法。我删除了 def primary() 中将 setUp 和 tearDown 添加到测试套件的行,现在它无需重复打开浏览器即可运行。我猜它试图将 setUp 和 tearDown 作为自己的测试用例运行,但还在测试套件中调用 setUp 和 tearDown。

我还修改了测试套件创建代码,以更好地适应 Python 文档的建议。根据我看到的文档,看起来应该在跨测试用例类收集测试用例时使用 Makesuite。显然它仍然会运行而不会出现任何错误。

所有这些都让我有了这个:

def primary():
    primary = unittest.TestSuite()
    primary.addTest(PrimaryMethods('test_ModuleLoop_header'))
    primary.addTest(PrimaryMethods ('test_ModuleLoop_nonheader'))
    return primary

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多