2015-04-17 78 views
2

我有一個適用於Selenium測試的工作pytest環境。我在conftest.py中使用了一個參數化的fixture,它允許我測試所有不同的瀏覽器,而不必重寫測試。我想將一個命令行參數傳遞給我的腳本,這樣我就可以只運行一個特定的瀏覽器,而不是所有的瀏覽器。爲此,我需要修改傳入我的燈具的變量。到目前爲止,我還沒有弄清楚如何做到這一點。我的下面的例子不起作用,可能是因爲pytest單獨從我的啓動腳本描述的變量中分析conftest.py。py.test conftest - 基於sys.argv修改燈具參數

#conftest.py 
browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie } 
@pytest.yield_fixture(params=browsers.keys()) 
def browser(request): 
    driver = browsers[request.param]() 
    yield driver 
    driver.quit() 

#test_simple.py 
def test_simple(browser): 
    browser.get("http://stackoverflow.com") 

#main.py 
browsers = {} 
if __name__ == "__main__": 
    if len(sys.argv) > 1: 
     for arg in sys.argv[1:]: 
      if arg == "-ff": 
       browsers = { "ff" : webdriver.Firefox } 
      elif arg == "-ie": 
       browsers = { "ie" : webdriver.Ie } 
      elif arg == "-all": 
       browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie } 

    pytest.main() 

我怎麼能值傳遞給在conftest.py參數化夾具?


回答

1

參見:Pass different values to a test function, depending on command line options

因爲進口過程中出現的參數化定義使用命令行選項不能真正改變參數化,但如果用戶指定一個在命令行中,你可以輕鬆地跳過其他瀏覽器測試:

# conftest.py 
import pytest 

browsers = {"ff": 'FIREFOX', 'ie': 'INTERNETEXPLORER'} 

def pytest_addoption(parser): 
    parser.addoption("--browser", default='', 
     type='choice', choices=sorted(browsers), 
     help="runs tests only for given browser")  

@pytest.yield_fixture(params=browsers.keys()) 
def browser(request): 
    selected = request.config.getoption('browser') 
    if selected and selected != request.param: 
     pytest.skip('browser {} selected in the command line'.format(selected)) 
    driver = browsers[request.param] 
    yield driver 

隨着此,當用戶運行pytest沒有任何值傳遞給--browser,所有測試照常運行:

============================= test session starts ============================= 
platform win32 -- Python 2.7.6 -- py-1.4.26 -- pytest-2.7.0.dev1 -- X:\temp\sandbox\.env27\Scripts\python.exe 
plugins: xdist 
collecting ... collected 2 items 

test_simple.py::test_simple[ie] PASSED 
test_simple.py::test_simple[ff] PASSED 

========================== 2 passed in 0.01 seconds =========================== 

但是,如果例如在用戶通過--browser=ie,火狐測試則s撇號:

============================= test session starts ============================= 
platform win32 -- Python 2.7.6 -- py-1.4.26 -- pytest-2.7.0.dev1 -- X:\temp\sandbox\.env27\Scripts\python.exe 
plugins: xdist 
collecting ... collected 2 items 

test_simple.py::test_simple[ie] PASSED 
test_simple.py::test_simple[ff] SKIPPED 

===================== 1 passed, 1 skipped in 0.01 seconds ===================== 
+0

我已經閱讀了文檔並實現了一些示例,但我一直無法使其正常工作。問題是我需要將瀏覽器的字典鍵傳遞給瀏覽器夾具,但是沒有一種明顯的方法來檢查命令行選項並更新瀏覽器字典,以便在瀏覽器夾具實際運行。 – user4794170

+0

看起來不錯。謝謝! – user4794170

0

只需使用ENV變量:

#conftest.py 
browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie } 
@pytest.yield_fixture(params=browsers.keys()) 
def browser(request): 
    driver = browsers[request.param]() 
    yield driver 
    driver.quit() 

#test_simple.py 
def test_simple(browser): 
    browser.get("http://stackoverflow.com") 

#main.py 
browsers = {} 
browserToRun = os.environ.get('BROWSER_TO_RUN') 
if __name__ == "__main__": 
      if browserToRun == "ff": 
       browsers = { "ff" : webdriver.Firefox } 
      elif browserToRun == "ie": 
       browsers = { "ie" : webdriver.Ie } 
      elif browserToRun == "all": 
       browsers = { "ff" : webdriver.Firefox, "ie" : webdriver.Ie } 

    pytest.main() 

和運行測試,如:

BROWSER_TO_RUN=ff run_tests.py