2014-10-16 1 views
1

Следующий код не собирает никаких тестовых примеров (я ожидаю, что 4 будет найдено). Зачем?Почему pytest.mark.parametrize не работает с классами в pytest?

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__ методы, это будет правильно собирать тесты. Но как я могу настроить и опрокинуть тест? :/

ответ

2

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

Смежные вопросы