python-3.x - 是否可以继承 setup() 和 tearDown() 方法?
问题描述
我主要在 C#/Java 中使用自动化,并且一直在研究 Python 的速度。
在 C# 中,我可以编写一个实现WebDriver
实例的类[SetUp]
以及[TearDown]
方法。然后,每个包含测试用例的类都可以从这个类继承,所以我不需要为我编写的每个测试类编写我的 SetUp 和 TearDown。
SetUp
/ TearDown
fixture的另一个好处是我可以WebDriver
在所有测试中使用相同的实例。SetUp
将创建WebDriver
实例,并将其传递给测试用例类,其中测试用例可用于初始化 PageObjects 和执行点击等。测试完成后,WebDriver
实例被传回以TearDown
进行清理。这是高效且易于使用的。
我的问题:我不了解如何实现此功能的 Python 最佳实践。
我在这里阅读了 Python unittest 文档,并在这里阅读了 Python 多重继承,但运气不佳。我也在这里阅读了这个 SO 讨论,但它已有 10 多年的历史,并且包含许多两极分化的观点。我确实使用讨论作为开始的指导,但我不想在不理解的情况下盲目地编写代码。
我对如何实际继承setUp()
,tearDown()
和我的webdriver
实例感到困惑。我不想声明一个新实例,并为每个测试类webdriver
重新编写setUp()
和方法,因为这似乎效率低下。tearDown()
这是我尝试过的:
这是SetUp
/TearDown
夹具,用于处理所有测试用例的设置和拆卸,并跟踪单例WebDriver
实例。
项目目录结构:
base_test_fixture.py
from selenium import webdriver
import unittest
class BaseTestFixture(unittest.TestCase):
driver = None
def setUp(self):
print("Running SetUp")
self.driver = webdriver.Chrome()
def tearDown(self):
print("Running Teardown")
self.driver.close()
self.driver.quit()
这里是test_webdriver.py
:
import unittest
import BaseTestFixture
class TestWebDriver(BaseTestFixture.SetUpTearDownFixture):
def test_should_start_webdriver(self):
super.setUp()
print("Running test 1")
super.driver.get("https://www.google.com")
assert "Google" in self.driver.title
super.tearDown()
def test_should_navigate_to_stackoverflow(self):
super.setUp()
print("Running test 2")
super.driver.get("https://www.stackoverflow.com")
assert "Stack Overflow" in self.driver.title
super.teardown()
if __name__ == '__main__':
unittest.main()
这是我的类声明显示的错误:AttributeError: module 'BaseTestFixture' has no attribute 'SetUpTearDownFixture'
是否可以为所有 Python 测试用例实现单个WebDriver
、setUp()
和?tearDown()
解决方案
你很亲密。Python 的约定是你的模块应该用下划线命名,所以我会将 BaseTestFixture.py 重命名为 base_test_fixture.py,并且模块中的类将是模块名称的驼峰版本。
这会给我们base_test_fixture.py:
from selenium import webdriver
from unittest import TestCase
class BaseTestFixture(TestCase):
和 test_web_driver.py:
import unittest
from base_test_fixture import BaseTestFixture
class TestWebDriver(BaseTestFixture):
如果您仍然遇到问题,则问题可能出在您的包的目录结构中,因此请通过编辑上面的问题以指示您的目录和文件的结构与我们分享。
此外,在您的测试中,由于测试类继承了 self.driver,您只需将其称为 self.driver(不是 super.)。
此外,setUp() 和 tearDown() 由 unittest 自动调用,因此您不必显式调用它们。
推荐阅读
- python - 如何在python的sparqlwrapper中添加特殊类别
- angular - 跨域请求被阻止的 CORS - 使用 angular cli 解决 [仅限开发人员]
- datatable - 列隐藏在数据表中后的索引不匹配
- javascript - Facebook 如何检测我是否在浏览器上阻止了 javascript?
- javascript - 如何在单击按钮时更改另一个项目的 ID?
- javascript - 在 UpdateView Django 中显示 ImageField
- r - 从 ggplot2 中的特定 geom_point() 绘制对角线
- loops - 在 jinja 循环中打印空格
- algorithm - 如何在具体问题中实现 Ford-Fulkerson?
- r - rowSums(X %*% C * X) 的语义是什么