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

ava*_*sin 3 python pytest python-2.7

以下代码不会收集任何测试用例(我希望找到 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()
Run Code Online (Sandbox Code Playgroud)

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

Bru*_*ira 6

pytest不会使用__init__方法收集测试类,可以在此处找到更详细的解释:如果定义了构造函数,则 py.test 将跳过测试类

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

如果您的现有测试已经具有设置/拆卸方法并希望将它们转换为 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
Run Code Online (Sandbox Code Playgroud)

更多详细信息可以在这里找到:自动使用装置和访问其他装置