How to use multiple pytest conftest files in one test run with a duplicated parser.addoption?

佐手、 提交于 2020-01-03 01:41:32

问题


I have a pytest testing project running selenium tests that has a structure like:

    ProjRoot
|
|_Pytest.ini
|_____________TestFolderA
|                   |
|                   |_test_folderA_tests1.py
|                   |_test_folderA_tests2.py
|
|____________TestFolderB                
|                   |
|                   |_test_folderB_test1.py
|                   |_test_folderA_tests2.py
|                   
|
|___________TestHelperModules
|                   |
|                   |_VariousTestHelperModules
|
|____________DriversAndTools
                    |___(contains chromedriver.exe, firefox profile folder etc)

I have a confTest.py file which I currently run in the ProjRoot, which I use as a setup and tear down for establishing the browser session for each test that is run. It runs each test twice. Once for Chrome and once for Firefox. In my tests I just utilise the resulting driver fixture. The conftest file is as below:

#conftest.py

import pytest
import os
import rootdir_ref
from selenium.webdriver.common.keys import Keys
import time

from webdriverwrapper.pytest import *
from webdriverwrapper import Chrome
from webdriverwrapper import DesiredCapabilities
from webdriverwrapper import Firefox
from webdriverwrapper import FirefoxProfile



#when running tests from command line we should be able to pass --url=www..... for a different website, check what order these definitions need to be in
def pytest_addoption(parser):
    parser.addoption('--url', default='https://test1.testsite.com.au')

@pytest.fixture(scope='function')
def url(request):
     return request.config.option.url

browsers = {
    'firefox': Firefox,
    'chrome': Chrome,
}

@pytest.fixture(scope='function', 
                params=browsers.keys())
def browser(request):

    if request.param == 'firefox':
        firefox_capabilities = DesiredCapabilities.FIREFOX
        firefox_capabilities['marionette'] = True
        firefox_capabilities['handleAlerts'] = True
        theRootDir = os.path.dirname(rootdir_ref.__file__)
        ffProfilePath = os.path.join(theRootDir, 'DriversAndTools', 'FirefoxSeleniumProfile')
        geckoDriverPath = os.path.join(theRootDir, 'DriversAndTools', 'geckodriver.exe')
        profile = FirefoxProfile(profile_directory=ffProfilePath)
        print (ffProfilePath)
        print (geckoDriverPath)
        b = browsers[request.param](firefox_profile=profile, capabilities=firefox_capabilities, executable_path=geckoDriverPath)

    elif request.param == 'chrome':
        desired_cap = DesiredCapabilities.CHROME
        desired_cap['chromeOptions'] = {}
        desired_cap['chromeOptions']['args'] = ['--disable-plugins', '--disable-extensions']
        theRootDir = os.path.dirname(rootdir_ref.__file__)
        chromeDriverPath = os.path.join(theRootDir, 'DriversAndTools', 'chromedriver.exe')
        b = browsers[request.param](chromeDriverPath)

    else:
        b = browsers[request.param]()
    request.addfinalizer(lambda *args: b.quit())

    return b


@pytest.fixture(scope='function')
def driver(browser, url):
    driver = browser
    driver.maximize_window()
    driver.get(url)
    return driver

What I’d like to do is have a conftest file in each Test Folder instead of the ProjRoot. But if I take this existing conftest file and put it in each test folder and then run pytest from the project root using

python –m pytest 

letting pytest pickup the test directories from pytest.ini (expecting the test folders to run with their respectively contained conftest files) I have issues with the parser.addoption --url already having been added. The end of the error message is:

ClientScripts\conftest.py:19: in pytest_addoption
    parser.addoption('--url', default='https://test1.coreplus.com.au/coreplus01')
..\..\..\VirtEnv\VirtEnv\lib\site-packages\_pytest\config.py:521: in addoption
    self._anonymous.addoption(*opts, **attrs)
..\..\..\VirtEnv\VirtEnv\lib\site-packages\_pytest\config.py:746: in addoption
    raise ValueError("option names %s already added" % conflict)
E   ValueError: option names {'--url'} already added

The purpose of the --url addoption is so I can override the defaults in the conftest file at commandline if I want to point them all to a different url at the same time, but otherwise let them default to running to different url's as specified in their conftest files.


回答1:


I had a similar issue. Error was gone after removing all cached files and venv.



来源:https://stackoverflow.com/questions/43466681/how-to-use-multiple-pytest-conftest-files-in-one-test-run-with-a-duplicated-pars

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!