2014-10-16 98 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

相關問題