为什么pytest.mark.parametrize不适用于pytest中的类?

时间:2014-10-16 14:25:35

标签: python python-2.7 pytest

以下代码不收集任何测试用例(我希望找到4个)。为什么呢?

import pytest
import uuid

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

class TestClass:
    def __init__(self):
        self.browser = webdriver.Remote(
            desired_capabilities=webdriver.DesiredCapabilities.FIREFOX,
            command_executor='http://my-selenium:4444/wd/hub'
        )

    @pytest.mark.parametrize('data', [1,2,3,4])    
    def test_buybuttons(self, data):
        self.browser.get('http://example.com/' + data)
        assert '<noindex>' not in self.browser.page_source

    def __del__(self):
        self.browser.quit()

如果我删除__init____del__方法,它将正确收集测试。但我如何设置和撕裂测试? :/

1 个答案:

答案 0 :(得分:3)

pytest不会使用__init__方法收集测试类,更详细地解释为什么可以在此处找到:py.test skips test class if constructor is defined

您应该使用fixtures来定义设置和拆卸操作,因为它们更强大,更灵活。

如果您现有的测试已经有设置/拆卸方法,并希望将它们转换为pytest,这是一种简单的方法:

class TestClass:

    @pytest.yield_fixture(autouse=True)
    def init_browser(self):
        self.browser = webdriver.Remote(
            desired_capabilities=webdriver.DesiredCapabilities.FIREFOX,
            command_executor='http://my-selenium:4444/wd/hub'
        )
        yield  # everything after 'yield' is executed on tear-down
        self.browser.quit()


    @pytest.mark.parametrize('data', [1,2,3,4])    
    def test_buybuttons(self, data):
        self.browser.get('http://example.com/' + data)
        assert '<noindex>' not in self.browser.page_source

可在此处找到更多详细信息:autouse fixtures and accessing other fixtures