我有这个autouse fixture,它将为每个测试创建一个webdriver实例:
@pytest.fixture(autouse=True)
def use_phantomjs(self):
self.wd = webdriver.PhantomJS()
yield
self.close_wd()
但是,由于我们的某个API存在错误,我们的某些测试无法在PhantomJS上运行。这些测试只能在Chrome(或Firefox)上运行,因此我使用Chrome为webdriver实例创建了另一种方法:
def use_chrome(self):
self.wd = webdriver.Chrome()
我计划在那些测试中使用,但我无法绕过上面的autouse灯具。
有没有办法以某种方式覆盖我们的一些测试的autouse灯具?我已经尝试过对每个测试使用pytest.mark.usefixtures
但是看起来不太理想,必须在每个测试中放置装饰器。有人提到使用元类,但我还没有完全理解它们是如何工作的,所以我想知道是否还有其他方法可能会错过。
答案 0 :(得分:4)
您可以通过多种方式实现此目的,一种方法是使用请求夹具以及pytest标记修复。 您需要做的就是创建一个新的通用夹具
@pytest.fixture(autouse=True)
def browser(request):
_browser = request.node.get_marker('browser')
if _browser:
if _browser.kwargs.get("use") == "chrome" :
# Do chrome related setup
elif _browser.kwargs.get("use") == "phantom" :
# Do Phantom.js related setup
else:
# No mark up ,use default setup
并按此标记您的测试
@pytest.mark.browser(use="chrome")
def test_some_chrome_test():
# browser here would return chrome driver
@pytest.mark.browser(use="phantom")
def test_some_phantomjs_test():
# browser here would return phantom driver
答案 1 :(得分:0)
有一种方法可以按需使用这些功能而无需使用下面的usefixtures
装饰器。
如果您已经使用autouse=True
,那么它将根据其范围自动调用,我认为在任何测试中都没有办法跳过它。
@pytest.fixture(autouse=False)
def use_phantomjs(self):
self.wd = webdriver.PhantomJS()
yield
self.close_wd()
def test_my_test(use_phantomjs):
...
...