2015-04-17 3 views
2

У меня есть рабочая среда pytest для тестирования селена. Я использую параметризованный прибор в conftest.py, который позволяет мне тестировать все различные браузеры, не переписывая тест. Я хотел бы передать аргумент командной строки для моего сценария, чтобы я мог запустить его только в определенном браузере, а не во всех из них. Для этого мне нужно будет изменить переменные, переданные в мое устройство. До сих пор я не мог понять, как это сделать. Мой пример ниже не работает, скорее всего, потому, что 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, FireFox тесты тогда s kipped:

============================= 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

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