Python:单元测试打开多个浏览器窗口

时间:2017-01-30 23:15:13

标签: python unit-testing selenium

我正在解决我使用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次?

这是我的setUp和tearDown部分:

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

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

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

  1. def setUp(self)立即在开始时调用
  2. def setUp(self)再次调用
  3. 如果名称 ==' 主要'和def primary()被称为
  4. driver = webdriver.Firefox被称为
  5. 首先打开浏览器
  6. driver = webdriver.Firefox第二次被调用。两个测试用例和tearDown没有被触及。
  7. 第二个浏览器打开
  8. 泪滴(自我)被召唤。
  9. 第二个浏览器已关闭
  10. driver = webdriver.Firefox第三次被召唤。
  11. 第三个浏览器打开
  12. tearDown(self)被称为
  13. 第三个浏览器关闭
  14. driver = webdriver.Firefox第四次被召唤。
  15. 第一个测试用例终于开始了

1 个答案:

答案 0 :(得分:0)

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

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

所有这些让我想到了这个:

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