是否可以继承 setup() 和 tearDown() 方法?
Is it possible to inherit setup() and tearDown() methods?
我主要使用 C# / Java 进行自动化工作,并且一直在研究 Python 的速度。
在 C# 中,我可以编写实现 WebDriver
实例的 class,以及 [SetUp]
和 [TearDown]
方法。然后,每个包含测试用例的 class 都可以从这个 class 继承,所以我不需要为我编写的每个测试 class 编写我的 SetUp 和 TearDown。
SetUp
/ TearDown
fixture 的另一个好处是我可以在所有测试中使用相同的 WebDriver
实例。 SetUp
将创建 WebDriver
实例,并将其传递给测试用例 class,其中测试用例可用于初始化 PageObjects 和执行点击等。测试完成后,WebDriver
实例被传递回 TearDown
进行清理。这是高效且易于使用的。
我的问题:我不明白 Python 关于如何实现此功能的最佳实践。
我已通读 Python unittest 文档 here and read up on Python multiple inheritance here with little luck. I have also read this SO discussion here,但它已有 10 多年历史,包含许多两极分化的观点。我确实以讨论作为入门的指导,但我不想在没有理解的情况下盲目编写代码。
我对如何实际继承 setUp()
、tearDown()
和我的 webdriver
实例感到困惑。我不想声明一个新的 webdriver
实例,并为每个测试 class 重写 setUp()
和 tearDown()
方法,因为这似乎效率低下。
这是我尝试过的方法:
这是 SetUp
/ TearDown
fixture,用于处理所有测试用例的设置和拆卸,并跟踪单例 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_Whosebug(self):
super.setUp()
print("Running test 2")
super.driver.get("https://www.whosebug.com")
assert "Stack Overflow" in self.driver.title
super.teardown()
if __name__ == '__main__':
unittest.main()
这是我的 class 声明显示的错误:AttributeError: module 'BaseTestFixture' has no attribute 'SetUpTearDownFixture'
是否可以为所有 Python 个测试用例实施单个 WebDriver
、setUp()
和 tearDown()
?
你们很亲近。 Python 约定是你的模块应该用下划线命名,所以我将 BaseTestFixture.py 重命名为 base_test_fixture.py,模块中的 class 将是模块名称。
那会给我们,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):
如果您仍然遇到问题,问题可能出在您的包的目录结构中,请通过编辑上面的问题与我们分享,以指明您的目录和文件的结构。
此外,在您的测试中,由于测试 class 继承了 self.driver,您只需将其称为 self.driver(无超级)。
此外,unittest 会自动调用 setUp() 和 tearDown(),因此您不必显式调用它们。
我主要使用 C# / Java 进行自动化工作,并且一直在研究 Python 的速度。
在 C# 中,我可以编写实现 WebDriver
实例的 class,以及 [SetUp]
和 [TearDown]
方法。然后,每个包含测试用例的 class 都可以从这个 class 继承,所以我不需要为我编写的每个测试 class 编写我的 SetUp 和 TearDown。
SetUp
/ TearDown
fixture 的另一个好处是我可以在所有测试中使用相同的 WebDriver
实例。 SetUp
将创建 WebDriver
实例,并将其传递给测试用例 class,其中测试用例可用于初始化 PageObjects 和执行点击等。测试完成后,WebDriver
实例被传递回 TearDown
进行清理。这是高效且易于使用的。
我的问题:我不明白 Python 关于如何实现此功能的最佳实践。
我已通读 Python unittest 文档 here and read up on Python multiple inheritance here with little luck. I have also read this SO discussion here,但它已有 10 多年历史,包含许多两极分化的观点。我确实以讨论作为入门的指导,但我不想在没有理解的情况下盲目编写代码。
我对如何实际继承 setUp()
、tearDown()
和我的 webdriver
实例感到困惑。我不想声明一个新的 webdriver
实例,并为每个测试 class 重写 setUp()
和 tearDown()
方法,因为这似乎效率低下。
这是我尝试过的方法:
这是 SetUp
/ TearDown
fixture,用于处理所有测试用例的设置和拆卸,并跟踪单例 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_Whosebug(self):
super.setUp()
print("Running test 2")
super.driver.get("https://www.whosebug.com")
assert "Stack Overflow" in self.driver.title
super.teardown()
if __name__ == '__main__':
unittest.main()
这是我的 class 声明显示的错误:AttributeError: module 'BaseTestFixture' has no attribute 'SetUpTearDownFixture'
是否可以为所有 Python 个测试用例实施单个 WebDriver
、setUp()
和 tearDown()
?
你们很亲近。 Python 约定是你的模块应该用下划线命名,所以我将 BaseTestFixture.py 重命名为 base_test_fixture.py,模块中的 class 将是模块名称。
那会给我们,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):
如果您仍然遇到问题,问题可能出在您的包的目录结构中,请通过编辑上面的问题与我们分享,以指明您的目录和文件的结构。
此外,在您的测试中,由于测试 class 继承了 self.driver,您只需将其称为 self.driver(无超级)。
此外,unittest 会自动调用 setUp() 和 tearDown(),因此您不必显式调用它们。