Конфиги вместо костылей. Pytestconfig и зачем он нужен

SQALab
SQALabSQALab
КОНФИГИ ВМЕСТО КОСТЫЛЕЙ
PYTESTCONFIG И ЗАЧЕМ ОН НУЖЕН
КТО ТАКАЯ Я
• Юля
• 5+ лет в ручном тестировании,
• 2 года в автоматизации (Java, NodeJS, Python)
• Тестировала веб, десктоп и мобилки в
стартапах и интеграторах
• А сейчас - Ламода
ЧТО ТАКОЕ LAMODA
~ 11 млн. покупателей
Бесконечно длинный, больше 60
штук, список проектов Ламоды,
среди которых скромно так
затесался мой горячо любимый
AB-testing API, а остальные
сегодня не особо-то важны
WE CODE THE FASHION
± 300 сотрудников в IT
ЧТО ТАКОЕ LAMODA
~ 11 млн. покупателей
Бесконечно длинный, больше 60
штук, список проектов Ламоды,
среди которых скромно так
затесался мой горячо любимый
AB-testing API, а остальные
сегодня не особо-то важны
WE CODE THE FASHION
± 250 сотрудников в IT
ЧТО ТАКОЕ LAMODA
~ 11 млн. покупателей
Бесконечно длинный, больше 60
штук, список проектов Ламоды,
среди которых скромно так
затесался мой горячо любимый
AB-testing API, а остальные
сегодня не особо-то важны
WE CODE THE FASHION
± 250 сотрудников в IT
AB-testingAPI
DB
AB-testingAPI
DB
PROD QA
AB-testingAPI
DB
AB-testingAPI
DB
PROD QA
AB-testingAPI
DB
AB-testingAPI
DB
AB-testingAPI
PROD QA
PREPROD
AB-testingAPI
DB
AB-testingAPI
PROD
PREPROD
request
response1
AB-testingAPI
DB
AB-testingAPI
PROD
PREPROD
request
request
response1
response2
ЗАДАЧА
• Надёжные
• Простые
• Безопасные
Добавить регрессионные тесты на препроде
ВАРИАНТЫ РЕШЕНИЯ
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure @allure.severity(pytest.allure.severity_level.CRITICAL)
#terminal
>>pytest rnd.tests/ --allure_severities=critical
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно @allure.severity(pytest.allure.severity_level.CRITICAL)
#terminal
>>pytest rnd.tests/ --allure_severities=critical
ВАРИАНТЫ РЕШЕНИЯ
@allure.severity(pytest.allure.severity_level.CRITICAL)
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно (не очень)
#terminal
>>pytest rnd.tests/ --allure_severities=critical
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно (не очень)
c. Это тоже лень
@allure.severity(pytest.allure.severity_level.CRITICAL)
#terminal
>>pytest rnd.tests/ --allure_severities=critical
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно (не очень)
c. Это тоже лень
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно (не очень)
c. Это тоже лень
3. Pytest config
ВАРИАНТЫ РЕШЕНИЯ
1. Отдельный проект
a. Это просто
b. Это безопасно
c. Это лень
2. Allure
a. Это просто
b. Это безопасно (не очень)
c. Это тоже лень
3. Pytest config
a. Это просто
b. Это безопасно
c. Это действительно просто
>> pytest rnd.tests/
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
URLs set Tests set
В ИДЕАЛЬНОМ МИРЕ
КАК РАБОТАЕТ PYTEST
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
>> pytest rnd.tests/ --environment = preprod
1) строка запуска
КАК РАБОТАЕТ PYTEST
1. Configuration
>> pytest rnd.tests/ --environment = preprod
1) строка запуска
КАК РАБОТАЕТ PYTEST
1. Configuration
>> pytest rnd.tests/ --environment = preprod
1) строка запуска
2) conftest.py
КАК РАБОТАЕТ PYTEST
1. Configuration
>> pytest rnd.tests/ --environment = preprod
1) строка запуска
2) conftest.py
3) строка запуска ещё раз
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
>> pytest rnd.tests/ --environment = preprod
1) фикстуры
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
>> pytest rnd.tests/ --environment = preprod
1) фикстуры
2) тесты
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
>> pytest rnd.tests/ --environment = preprod
1) фикстуры
2) тесты
3) очистка
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
conftest.py
CONFTEST.PY
CONFTEST.PY
project_root
|
|——A
| |——test_1.py
| |——test_2.py
| |——conftest.py
|
|——B
| |——test_2.py
|
|——conftest.py
CONFTEST.PY
1. Фикстуры project_root
|
|——A
| |——test_1.py
| |——test_2.py
| |——conftest.py
|
|——B
| |——test_2.py
|
|——conftest.py
CONFTEST.PY
1. Фикстуры root
|
|——A
| |——test_1.py
| |——test_2.py
| |——conftest.py
|
|——B
| |——test_2.py
|
|——conftest.py
CONFTEST.PY
1. Фикстуры project_root
|
|——A
| |——test_1.py
| |——test_2.py
| |——conftest.py
|
|——B
| |——test_2.py
|
|——conftest.py
CONFTEST.PY
1. Фикстуры
2. Хуки
3. Плагины
project_root
|
|——A
| |——test_1.py
| |——test_2.py
| |——conftest.py
|
|——B
| |——test_2.py
|
|——conftest.py
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
conftest.py
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
ДОБАВЛЯЕМ АРГУМЕНТ
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
URLs set Tests set
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
URLs set Tests set
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	'something	impossible'
return	url_set
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	'something	impossible'
return	url_set
PYTEST.CONFIG
PYTEST.CONFIG
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
PYTEST.CONFIG
#output
<CmdOptions {'keyword':	'',	'markexpr':	'',	'maxfail':	0,	'continue_on_collection_errors':	False,	'confcutdir':	
None,	'noconftest':	False,	'keepduplicates':	False,	'basetemp':	None,	'verbose':	0,	'quiet':	0,	'reportchars':	'',	
'disablepytestwarnings':	False,	'showlocals':	False,	'tbstyle':	'auto',	'fulltrace':	False,	'color':	'auto',	
'durations':	None,	'showfixtures':	False,	'show_fixtures_per_test':	False,	'importmode':	'prepend',	'capture':	
'fd',	'runxfail':	False,	'pastebin':	None,	'plugins':	[],	'traceconfig':	False,	'debug':	False,	'assertmode':	
'rewrite',	'xmlpath':	None,	'junitprefix':	None,	'resultlog':	None,	'doctestmodules':	False,	'doctestreport':	
'udiff',	'doctestglob':	[],	'doctest_ignore_import_errors':	False,	'allurereportdir':	None,	'allureseverities':	{},	
'allurefeatures':	{},	'allurestories':	{},	'environment':	'qa',	'markers':	False,	'strict':	False,	'inifilename':	None,	
'usepdb':	False,	'usepdb_cls':	None,	'lf':	False,	'failedfirst':	False,	'cacheshow':	False,	'cacheclear':	False,	
'collectonly':	False,	'pyargs':	False,	'ignore':	None,	'version':	False,	'help':	False,	'override_ini':	None,	
'setuponly':	False,	'setupshow':	False,	'setupplan':	False,	'file_or_dir':	['rnd_tests/tests/try_test.py']}>
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
PYTEST.CONFIG
#output
<CmdOptions {'keyword':	'',	'markexpr':	'',	'maxfail':	0,	'continue_on_collection_errors':	False,	'confcutdir':	
None,	'noconftest':	False,	'keepduplicates':	False,	'basetemp':	None,	'verbose':	0,	'quiet':	0,	'reportchars':	'',	
'disablepytestwarnings':	False,	'showlocals':	False,	'tbstyle':	'auto',	'fulltrace':	False,	'color':	'auto',	
'durations':	None,	'showfixtures':	False,	'show_fixtures_per_test':	False,	'importmode':	'prepend',	'capture':	
'fd',	'runxfail':	False,	'pastebin':	None,	'plugins':	[],	'traceconfig':	False,	'debug':	False,	'assertmode':	
'rewrite',	'xmlpath':	None,	'junitprefix':	None,	'resultlog':	None,	'doctestmodules':	False,	'doctestreport':	
'udiff',	'doctestglob':	[],	'doctest_ignore_import_errors':	False,	'allurereportdir':	None,	'allureseverities':	{},	
'allurefeatures':	{},	'allurestories':	{},	'environment':	'qa',	'markers':	False,	'strict':	False,	'inifilename':	None,	
'usepdb':	False,	'usepdb_cls':	None,	'lf':	False,	'failedfirst':	False,	'cacheshow':	False,	'cacheclear':	False,	
'collectonly':	False,	'pyargs':	False,	'ignore':	None,	'version':	False,	'help':	False,	'override_ini':	None,	
'setuponly':	False,	'setupshow':	False,	'setupplan':	False,	'file_or_dir':	['rnd_tests/tests/try_test.py']}>
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	'something	impossible'
return	url_set
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
get_urls(pytestconfig.getoption('--environment'))
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
get_urls(pytestconfig.getoption('--environment'))
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
get_urls(pytestconfig.getoption('--environment'))
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
URLs set Tests set
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod[ ]
URLs set Tests set
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
2. COLLECTION
a. skip/skipif #content	of	test_preprod.py
@pytest.mark.skipif(pytest.config.option.environment==	'qa',	
reason	=	'Preprodtest')
def test_preprod(some_fixture):
assert	False
2. COLLECTION
a. skip/skipif #content	of	test_preprod.py
@pytest.mark.skipif(pytest.config.option.environment==	'qa',	
reason	=	'Preprodtest')
def test_preprod(some_fixture):
assert	False
2. COLLECTION
a. skip/skipif #content	of	test_preprod.py
@pytest.mark.skipif(pytest.config.option.environment==	'qa',	
reason	=	'Preprodtest')
def test_preprod(some_fixture):
assert	False
#content	of	test_qa.py
@pytest.mark.skipif(pytest.config.option.environment==	’preprod',	
reason	=	’QA	test')
def test_qa(some_fixture):
assert	False
2. COLLECTION
a. skip/skipif #content	of	test_preprod.py
@pytest.mark.skipif(pytest.config.option.environment==	'qa',	
reason	=	'Preprodtest')
def test_preprod(some_fixture):
assert	False
#content	of	test_qa.py
@pytest.mark.skipif(pytest.config.option.environment==	’preprod',	
reason	=	’QA	test')
def test_qa(some_fixture):
assert	False
2. COLLECTION
a. skip/skipif
b. --m/mark #content	of	test_preprod.py
@pytest.mark.smoke
def test_preprod(some_fixture):
assert	False
#terminal
>>pytest rnd_tests --m	'smoke'
2. COLLECTION
a. skip/skipif
b. --m/mark #content	of	test_preprod.py
@pytest.mark.smoke
def test_preprod(some_fixture):
assert	False
#terminal
>>pytest rnd_tests --m	'smoke'
>>pytest rnd_tests --m	'not	smoke'
2. COLLECTION
a. skip/skipif
b. --m/mark #content	of	test_preprod.py
@pytest.mark.smoke
def test_preprod(some_fixture):
assert	False
#terminal
>>pytest rnd_tests --m	'smoke'
>>pytest rnd_tests --m	'not	smoke'
#content	of	test_preprod.py
@pytest.mark.smoke
def test_preprod(some_fixture):
assert	False
#terminal
>>pytest rnd_tests --m	'smoke'	 --environment	=	'preprod'
#content	of	test_preprod.py
@pytest.mark.smoke
def test_preprod(some_fixture):
assert	False
#terminal
>>pytest rnd_tests --m	'smoke'	 --environment	=	'preprod'
PYTEST.CONFIG
#output
<CmdOptions {'keyword':	'',	'markexpr':	'',	'maxfail':	0,	'continue_on_collection_errors':	False,	'confcutdir':	
None,	'noconftest':	False,	'keepduplicates':	False,	'basetemp':	None,	'verbose':	0,	'quiet':	0,	'reportchars':	'',	
'disablepytestwarnings':	False,	'showlocals':	False,	'tbstyle':	'auto',	'fulltrace':	False,	'color':	'auto',	
'durations':	None,	'showfixtures':	False,	'show_fixtures_per_test':	False,	'importmode':	'prepend',	'capture':	
'fd',	'runxfail':	False,	'pastebin':	None,	'plugins':	[],	'traceconfig':	False,	'debug':	False,	'assertmode':	
'rewrite',	'xmlpath':	None,	'junitprefix':	None,	'resultlog':	None,	'doctestmodules':	False,	'doctestreport':	
'udiff',	'doctestglob':	[],	'doctest_ignore_import_errors':	False,	'allurereportdir':	None,	'allureseverities':	{},	
'allurefeatures':	{},	'allurestories':	{},	'environment':	'qa',	'markers':	False,	'strict':	False,	'inifilename':	None,	
'usepdb':	False,	'usepdb_cls':	None,	'lf':	False,	'failedfirst':	False,	'cacheshow':	False,	'cacheclear':	False,	
'collectonly':	False,	'pyargs':	False,	'ignore':	None,	'version':	False,	'help':	False,	'override_ini':	None,	
'setuponly':	False,	'setupshow':	False,	'setupplan':	False,	'file_or_dir':	['rnd_tests/tests/try_test.py']}>
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
PYTEST.CONFIG
#output
<CmdOptions {'keyword':	'',	'markexpr':	'',	'maxfail':	0,	'continue_on_collection_errors':	False,	'confcutdir':	
None,	'noconftest':	False,	'keepduplicates':	False,	'basetemp':	None,	'verbose':	0,	'quiet':	0,	'reportchars':	'',	
'disablepytestwarnings':	False,	'showlocals':	False,	'tbstyle':	'auto',	'fulltrace':	False,	'color':	'auto',	
'durations':	None,	'showfixtures':	False,	'show_fixtures_per_test':	False,	'importmode':	'prepend',	'capture':	
'fd',	'runxfail':	False,	'pastebin':	None,	'plugins':	[],	'traceconfig':	False,	'debug':	False,	'assertmode':	
'rewrite',	'xmlpath':	None,	'junitprefix':	None,	'resultlog':	None,	'doctestmodules':	False,	'doctestreport':	
'udiff',	'doctestglob':	[],	'doctest_ignore_import_errors':	False,	'allurereportdir':	None,	'allureseverities':	{},	
'allurefeatures':	{},	'allurestories':	{},	'environment':	'qa',	'markers':	False,	'strict':	False,	'inifilename':	None,	
'usepdb':	False,	'usepdb_cls':	None,	'lf':	False,	'failedfirst':	False,	'cacheshow':	False,	'cacheclear':	False,	
'collectonly':	False,	'pyargs':	False,	'ignore':	None,	'version':	False,	'help':	False,	'override_ini':	None,	
'setuponly':	False,	'setupshow':	False,	'setupplan':	False,	'file_or_dir':	['rnd_tests/tests/try_test.py']}>
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
PYTEST.CONFIG
#content	of	try_test.py
def test_view_config(pytestconfig):
print(pytestconfig.option)
assert	False
#output	with	–m	=	'smoke'
<CmdOptions {'keyword':	'',	'markexpr':	'smoke',	'maxfail':	0,	'continue_on_collection_errors':	False,	
'confcutdir':	None,	'noconftest':	False,	'keepduplicates':	False,	'basetemp':	None,	'verbose':	0,	'quiet':	0,	
'reportchars':	'',	'disablepytestwarnings':	False,	'showlocals':	False,	'tbstyle':	'auto',	'fulltrace':	False,	'color':	
'auto',	'durations':	None,	'showfixtures':	False,	'show_fixtures_per_test':	False,	'importmode':	'prepend',	
'capture':	'fd',	'runxfail':	False,	'pastebin':	None,	'plugins':	[],	'traceconfig':	False,	'debug':	False,	
'assertmode':	'rewrite',	'xmlpath':	None,	'junitprefix':	None,	'resultlog':	None,	'doctestmodules':	False,	
'doctestreport':	'udiff',	'doctestglob':	[],	'doctest_ignore_import_errors':	False,	'allurereportdir':	None,	
'allureseverities':	{},	'allurefeatures':	{},	'allurestories':	{},	'environment':	'qa',	'markers':	False,	'strict':	False,	
'inifilename':	None,	'usepdb':	False,	'usepdb_cls':	None,	'lf':	False,	'failedfirst':	False,	'cacheshow':	False,	
'cacheclear':	False,	'collectonly':	False,	'pyargs':	False,	'ignore':	None,	'version':	False,	'help':	False,	
'override_ini':	None,	'setuponly':	False,	'setupshow':	False,	'setupplan':	False,	'file_or_dir':	
['rnd_tests/tests/try_test.py']}>
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
КАК РАБОТАЕТ PYTEST
1. Configuration
2. Collection
3. Running
4. Reporting
>> pytest rnd.tests/ --environment = preprod
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	get_urls(pytestconfig.getoption('--environment'))
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
def pytest_configure(config):
if	config.option.environment ==	'preprod':
config.option.markexpr =	'smoke'
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	get_urls(pytestconfig.getoption('--environment'))
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
def pytest_configure(config):
if	config.option.environment==	'preprod':
config.option.markexpr =	'smoke'
else:
config.option.markexpr =	'not	smoke'
#	content	of	conftest.py
import	pytest
def pytest_addoption(parser):
parser.addoption("--environment",	action="store",	default="qa",
help="target	environment")
@pytest.fixture(scope="session")
def env_settings(pytestconfig):
url_set =	get_urls(pytestconfig.getoption('--environment'))
return	url_set
#somewhere	else
def get_urls(env):
if	env ==	'preprod':	url =	'http://preprod.lamoda.ru'
else:	url =	'http://qa.lamoda.ru'
return	url
def pytest_configure(config):
if	config.option.environment==	'preprod':
config.option.markexpr =	'smoke'
else:
config.option.markexpr =	'not	smoke'
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/
В ИДЕАЛЬНОМ МИРЕ
>> pytest rnd.tests/ --environment = preprod
В ИДЕАЛЬНОМ МИРЕ
1. Настроен раздельный запуск тестов для разных сред
2. Исключены человеческие ошибки при запуске
3. Добавлен минимум кода
4. Добавлено 0 дополнений
В ИДЕАЛЬНОМ МИРЕ
1. Настроен раздельный запуск тестов для разных сред
2. Исключены человеческие ошибки при запуске
3. Добавлен минимум кода
4. Добавлено 0 дополнений
https://docs.pytest.org
tech.lamoda.ru
julia-shpulia
@StickersMM
1 of 94

Recommended

Готовим стажировку by
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
2.6K views18 slides
Куда приводят мечты? или Искусство развития тестировщика by
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
1.7K views16 slides
Оптимизация Selenium тестов и ускорение их поддержки by
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
1.2K views36 slides
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования by
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
774 views21 slides
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J... by
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
800 views18 slides
Continuous performance testing by
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
645 views23 slides

More Related Content

More from SQALab

Добиваемся эффективности каждого из 9000+ UI-тестов by
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
580 views41 slides
Делаем автоматизацию проектных KPIs by
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
361 views19 slides
Вредные привычки в тест-менеджменте by
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеSQALab
655 views23 slides
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации by
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииSQALab
453 views44 slides
Как hh.ru дошли до 500 релизов в квартал без потери в качестве by
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеSQALab
722 views63 slides
Стили лидерства и тестирование by
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестированиеSQALab
463 views14 slides

More from SQALab(20)

Добиваемся эффективности каждого из 9000+ UI-тестов by SQALab
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
SQALab580 views
Делаем автоматизацию проектных KPIs by SQALab
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
SQALab361 views
Вредные привычки в тест-менеджменте by SQALab
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
SQALab655 views
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации by SQALab
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
SQALab453 views
Как hh.ru дошли до 500 релизов в квартал без потери в качестве by SQALab
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
SQALab722 views
Стили лидерства и тестирование by SQALab
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
SQALab463 views
"Давайте не будем про качество" by SQALab
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
SQALab543 views
Apache.JMeter для .NET-проектов by SQALab
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
SQALab715 views
Тестирование геолокационных систем by SQALab
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
SQALab340 views
Лидер или босс? Вот в чем вопрос by SQALab
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
SQALab600 views
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут... by SQALab
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
SQALab1.6K views
Истинная сила тестировщика - информация by SQALab
Истинная сила тестировщика - информацияИстинная сила тестировщика - информация
Истинная сила тестировщика - информация
SQALab1.7K views
Автоматизация тестирования встроенного ПО by SQALab
Автоматизация тестирования встроенного ПОАвтоматизация тестирования встроенного ПО
Автоматизация тестирования встроенного ПО
SQALab479 views
Правильный подход к составлению профиля нагрузочного тестирования by SQALab
Правильный подход к составлению профиля нагрузочного тестированияПравильный подход к составлению профиля нагрузочного тестирования
Правильный подход к составлению профиля нагрузочного тестирования
SQALab1.7K views
Sustainable Test Automation: Collaborate within Team by SQALab
Sustainable Test Automation: Collaborate within TeamSustainable Test Automation: Collaborate within Team
Sustainable Test Automation: Collaborate within Team
SQALab215 views
Test Data Preparation: Tips and Tricks by SQALab
Test Data Preparation: Tips and TricksTest Data Preparation: Tips and Tricks
Test Data Preparation: Tips and Tricks
SQALab368 views
9 кругов Ада: антипаттерны UI-Автоматизации by SQALab
9 кругов Ада: антипаттерны UI-Автоматизации9 кругов Ада: антипаттерны UI-Автоматизации
9 кругов Ада: антипаттерны UI-Автоматизации
SQALab1.2K views
The secrets in game testing by SQALab
The secrets in game testingThe secrets in game testing
The secrets in game testing
SQALab401 views
Loading time testing and results visualisation of web games by SQALab
Loading time testing and results visualisation of web gamesLoading time testing and results visualisation of web games
Loading time testing and results visualisation of web games
SQALab279 views
What does it take to be a performance tester? by SQALab
What does it take to be a performance tester?What does it take to be a performance tester?
What does it take to be a performance tester?
SQALab327 views

Recently uploaded

Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdf by
Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdfCasuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdf
Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdfDemetrio Ccesa Rayme
16 views121 slides
Виписка з реєстру.pdf by
Виписка з реєстру.pdfВиписка з реєстру.pdf
Виписка з реєстру.pdfssuser46127c
10 views2 slides
Ліцензія.pdf by
Ліцензія.pdfЛіцензія.pdf
Ліцензія.pdfssuser46127c
11 views13 slides
Музей.pdf by
Музей.pdfМузей.pdf
Музей.pdfssuser46127c
6 views4 slides
Рішення про перепрофідювання.pdf by
Рішення про перепрофідювання.pdfРішення про перепрофідювання.pdf
Рішення про перепрофідювання.pdfssuser46127c
9 views3 slides
‎⁨التعلم التعاوني⁩.pdf by
‎⁨التعلم التعاوني⁩.pdf‎⁨التعلم التعاوني⁩.pdf
‎⁨التعلم التعاوني⁩.pdfbandertu
33 views20 slides

Recently uploaded(10)

Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdf by Demetrio Ccesa Rayme
Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdfCasuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdf
Casuisticas de Concurso de Ascenso Docente X4 Ccesa007.pdf
Виписка з реєстру.pdf by ssuser46127c
Виписка з реєстру.pdfВиписка з реєстру.pdf
Виписка з реєстру.pdf
ssuser46127c10 views
Рішення про перепрофідювання.pdf by ssuser46127c
Рішення про перепрофідювання.pdfРішення про перепрофідювання.pdf
Рішення про перепрофідювання.pdf
ssuser46127c9 views
‎⁨التعلم التعاوني⁩.pdf by bandertu
‎⁨التعلم التعاوني⁩.pdf‎⁨التعلم التعاوني⁩.pdf
‎⁨التعلم التعاوني⁩.pdf
bandertu33 views
The Necessity of Hope: Critical Digital Pedagogy Today .pdf by Sean Michael Morris
The Necessity of Hope: Critical Digital Pedagogy Today .pdfThe Necessity of Hope: Critical Digital Pedagogy Today .pdf
The Necessity of Hope: Critical Digital Pedagogy Today .pdf
Про статут.pdf by ssuser46127c
Про статут.pdfПро статут.pdf
Про статут.pdf
ssuser46127c14 views
Витяг з реєстру.pdf by ssuser46127c
Витяг з реєстру.pdfВитяг з реєстру.pdf
Витяг з реєстру.pdf
ssuser46127c14 views
المقاربة بالكفايات تسهم في تشكيل المجتمع محمد بركات متفقد مدارس ... by ssuser4178d6
المقاربة بالكفايات تسهم في تشكيل المجتمع              محمد بركات متفقد مدارس ...المقاربة بالكفايات تسهم في تشكيل المجتمع              محمد بركات متفقد مدارس ...
المقاربة بالكفايات تسهم في تشكيل المجتمع محمد بركات متفقد مدارس ...
ssuser4178d612 views

Конфиги вместо костылей. Pytestconfig и зачем он нужен