如何为 pytest 创建一个 BaseTest class
How do I create a BaseTest class for pytest
我正在尝试创建一个 class,它将被我的所有其他测试 class 继承。我似乎对如何去做有误解,因为当我尝试 运行 pytest 时,它找不到我的测试并抛出一个 Empty suite 错误。
这就是我现在拥有的。请注意,这是针对使用 Selenium
的网络 ui 测试
base_test.py:
@pytest.mark.usefixtures('chrome_driver_init')
class BaseTest:
def __init__(self):
self.login_page = LoginPage(self.driver)
self.home_page = HomePage(self.driver)
self.details_page = DetailsPage(self.driver)
我只想创建我的网页对象的实例以供我的测试使用 类
test_login.py
class TestLogin(BaseTest):
def test_login(self):
self.login_page.login()
assert 'Login Succesfull' in self.home_page.welcome_text()
welcome_text()
是一个简单的方法,可以找到一个网络元素和 returns 它的文本
最后只是通过我的 conftest.py:
@pytest.fixture()
def chrome_driver_init(request):
driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
request.cls.driver = driver
driver.get(URL)
driver.maximize_window()
yield
driver.quit()
我觉得我的 BaseTest 需要继承一些 pytest class 并调用 super().__init__()
但我无法在网上找到任何关于 class 的文档或答案.
关于如何实现这个的任何想法?
编辑:正如 MrBean 建议的那样,我添加了 self.到我在 BaseTest 中的页面对象。仍然得到相同的结果
所以在进一步挖掘之后,pytest 似乎不会从 类 收集任何具有 __init__(self)
函数的测试用例。我能找到的唯一解决方法是在每次测试开始时声明页面对象。我觉得这非常烦人和多余。如果有人有更好的解决方案请告诉我。
终于想通了。将我的页面对象初始化添加到我的 pytest 夹具中。不需要 BaseTest class。所以我的最终代码是
conftest.py
def page_object_init(request, driver):
request.cls.login_page = LoginPage(driver)
request.cls.home_page = HomePage(driver)
request.cls.details_page = DetailsPage(driver)
@pytest.fixture()
def chrome_driver_init(request):
driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
request.cls.driver = driver
page_object_init(request, driver)
driver.get(URL)
driver.maximize_window()
yield
driver.quit()
test_login.py
class TestLogin(BaseTest):
def test_login(self):
self.login_page.login()
assert 'Login Succesfull' in self.home_page.welcome_text()
感谢 MrBean 为我指明了正确的方向
我正在尝试创建一个 class,它将被我的所有其他测试 class 继承。我似乎对如何去做有误解,因为当我尝试 运行 pytest 时,它找不到我的测试并抛出一个 Empty suite 错误。
这就是我现在拥有的。请注意,这是针对使用 Selenium
的网络 ui 测试base_test.py:
@pytest.mark.usefixtures('chrome_driver_init')
class BaseTest:
def __init__(self):
self.login_page = LoginPage(self.driver)
self.home_page = HomePage(self.driver)
self.details_page = DetailsPage(self.driver)
我只想创建我的网页对象的实例以供我的测试使用 类
test_login.py
class TestLogin(BaseTest):
def test_login(self):
self.login_page.login()
assert 'Login Succesfull' in self.home_page.welcome_text()
welcome_text()
是一个简单的方法,可以找到一个网络元素和 returns 它的文本
最后只是通过我的 conftest.py:
@pytest.fixture()
def chrome_driver_init(request):
driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
request.cls.driver = driver
driver.get(URL)
driver.maximize_window()
yield
driver.quit()
我觉得我的 BaseTest 需要继承一些 pytest class 并调用 super().__init__()
但我无法在网上找到任何关于 class 的文档或答案.
关于如何实现这个的任何想法?
编辑:正如 MrBean 建议的那样,我添加了 self.到我在 BaseTest 中的页面对象。仍然得到相同的结果
所以在进一步挖掘之后,pytest 似乎不会从 类 收集任何具有 __init__(self)
函数的测试用例。我能找到的唯一解决方法是在每次测试开始时声明页面对象。我觉得这非常烦人和多余。如果有人有更好的解决方案请告诉我。
终于想通了。将我的页面对象初始化添加到我的 pytest 夹具中。不需要 BaseTest class。所以我的最终代码是
conftest.py
def page_object_init(request, driver):
request.cls.login_page = LoginPage(driver)
request.cls.home_page = HomePage(driver)
request.cls.details_page = DetailsPage(driver)
@pytest.fixture()
def chrome_driver_init(request):
driver = webdriver.Chrome(options=opts, executable_path=ChromeDriverManager(path=TEST_PATH).install())
request.cls.driver = driver
page_object_init(request, driver)
driver.get(URL)
driver.maximize_window()
yield
driver.quit()
test_login.py
class TestLogin(BaseTest):
def test_login(self):
self.login_page.login()
assert 'Login Succesfull' in self.home_page.welcome_text()
感谢 MrBean 为我指明了正确的方向