Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

198 views

Published on

Доклад Юлии Александровой на SQA Days-22. 17-18 ноября 2017. Санкт-Петербург, Россия
www.sqadays.com

Published in: Education
  • Be the first to comment

  • Be the first to like this

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

  1. 1. КОНФИГИ ВМЕСТО КОСТЫЛЕЙ PYTESTCONFIG И ЗАЧЕМ ОН НУЖЕН
  2. 2. КТО ТАКАЯ Я • Юля • 5+ лет в ручном тестировании, • 2 года в автоматизации (Java, NodeJS, Python) • Тестировала веб, десктоп и мобилки в стартапах и интеграторах • А сейчас - Ламода
  3. 3. ЧТО ТАКОЕ LAMODA ~ 11 млн. покупателей Бесконечно длинный, больше 60 штук, список проектов Ламоды, среди которых скромно так затесался мой горячо любимый AB-testing API, а остальные сегодня не особо-то важны WE CODE THE FASHION ± 300 сотрудников в IT
  4. 4. ЧТО ТАКОЕ LAMODA ~ 11 млн. покупателей Бесконечно длинный, больше 60 штук, список проектов Ламоды, среди которых скромно так затесался мой горячо любимый AB-testing API, а остальные сегодня не особо-то важны WE CODE THE FASHION ± 250 сотрудников в IT
  5. 5. ЧТО ТАКОЕ LAMODA ~ 11 млн. покупателей Бесконечно длинный, больше 60 штук, список проектов Ламоды, среди которых скромно так затесался мой горячо любимый AB-testing API, а остальные сегодня не особо-то важны WE CODE THE FASHION ± 250 сотрудников в IT
  6. 6. AB-testingAPI DB AB-testingAPI DB PROD QA
  7. 7. AB-testingAPI DB AB-testingAPI DB PROD QA
  8. 8. AB-testingAPI DB AB-testingAPI DB AB-testingAPI PROD QA PREPROD
  9. 9. AB-testingAPI DB AB-testingAPI PROD PREPROD request response1
  10. 10. AB-testingAPI DB AB-testingAPI PROD PREPROD request request response1 response2
  11. 11. ЗАДАЧА • Надёжные • Простые • Безопасные Добавить регрессионные тесты на препроде
  12. 12. ВАРИАНТЫ РЕШЕНИЯ
  13. 13. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект
  14. 14. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно
  15. 15. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень
  16. 16. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень
  17. 17. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure @allure.severity(pytest.allure.severity_level.CRITICAL) #terminal >>pytest rnd.tests/ --allure_severities=critical
  18. 18. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно @allure.severity(pytest.allure.severity_level.CRITICAL) #terminal >>pytest rnd.tests/ --allure_severities=critical
  19. 19. ВАРИАНТЫ РЕШЕНИЯ @allure.severity(pytest.allure.severity_level.CRITICAL) 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно (не очень) #terminal >>pytest rnd.tests/ --allure_severities=critical
  20. 20. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно (не очень) c. Это тоже лень @allure.severity(pytest.allure.severity_level.CRITICAL) #terminal >>pytest rnd.tests/ --allure_severities=critical
  21. 21. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно (не очень) c. Это тоже лень
  22. 22. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно (не очень) c. Это тоже лень 3. Pytest config
  23. 23. ВАРИАНТЫ РЕШЕНИЯ 1. Отдельный проект a. Это просто b. Это безопасно c. Это лень 2. Allure a. Это просто b. Это безопасно (не очень) c. Это тоже лень 3. Pytest config a. Это просто b. Это безопасно c. Это действительно просто
  24. 24. >> pytest rnd.tests/
  25. 25. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod
  26. 26. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ]
  27. 27. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ] URLs set Tests set
  28. 28. В ИДЕАЛЬНОМ МИРЕ
  29. 29. КАК РАБОТАЕТ PYTEST >> pytest rnd.tests/ --environment = preprod
  30. 30. КАК РАБОТАЕТ PYTEST 1. Configuration >> pytest rnd.tests/ --environment = preprod
  31. 31. КАК РАБОТАЕТ PYTEST 1. Configuration >> pytest rnd.tests/ --environment = preprod 1) строка запуска
  32. 32. КАК РАБОТАЕТ PYTEST 1. Configuration >> pytest rnd.tests/ --environment = preprod 1) строка запуска
  33. 33. КАК РАБОТАЕТ PYTEST 1. Configuration >> pytest rnd.tests/ --environment = preprod 1) строка запуска 2) conftest.py
  34. 34. КАК РАБОТАЕТ PYTEST 1. Configuration >> pytest rnd.tests/ --environment = preprod 1) строка запуска 2) conftest.py 3) строка запуска ещё раз
  35. 35. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection >> pytest rnd.tests/ --environment = preprod
  36. 36. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running >> pytest rnd.tests/ --environment = preprod 1) фикстуры
  37. 37. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running >> pytest rnd.tests/ --environment = preprod 1) фикстуры 2) тесты
  38. 38. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running >> pytest rnd.tests/ --environment = preprod 1) фикстуры 2) тесты 3) очистка
  39. 39. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  40. 40. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  41. 41. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  42. 42. ДОБАВЛЯЕМ АРГУМЕНТ # content of conftest.py import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment")
  43. 43. ДОБАВЛЯЕМ АРГУМЕНТ # content of import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment") conftest.py
  44. 44. CONFTEST.PY
  45. 45. CONFTEST.PY project_root | |——A | |——test_1.py | |——test_2.py | |——conftest.py | |——B | |——test_2.py | |——conftest.py
  46. 46. CONFTEST.PY 1. Фикстуры project_root | |——A | |——test_1.py | |——test_2.py | |——conftest.py | |——B | |——test_2.py | |——conftest.py
  47. 47. CONFTEST.PY 1. Фикстуры root | |——A | |——test_1.py | |——test_2.py | |——conftest.py | |——B | |——test_2.py | |——conftest.py
  48. 48. CONFTEST.PY 1. Фикстуры project_root | |——A | |——test_1.py | |——test_2.py | |——conftest.py | |——B | |——test_2.py | |——conftest.py
  49. 49. CONFTEST.PY 1. Фикстуры 2. Хуки 3. Плагины project_root | |——A | |——test_1.py | |——test_2.py | |——conftest.py | |——B | |——test_2.py | |——conftest.py
  50. 50. ДОБАВЛЯЕМ АРГУМЕНТ # content of import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment") conftest.py
  51. 51. ДОБАВЛЯЕМ АРГУМЕНТ # content of conftest.py import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment")
  52. 52. ДОБАВЛЯЕМ АРГУМЕНТ # content of conftest.py import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment")
  53. 53. ДОБАВЛЯЕМ АРГУМЕНТ # content of conftest.py import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment")
  54. 54. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ] URLs set Tests set
  55. 55. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ] URLs set Tests set
  56. 56. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  57. 57. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  58. 58. # content of conftest.py import pytest def pytest_addoption(parser): parser.addoption("--environment", action="store", default="qa", help="target environment")
  59. 59. # 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
  60. 60. # 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
  61. 61. PYTEST.CONFIG
  62. 62. PYTEST.CONFIG #content of try_test.py def test_view_config(pytestconfig): print(pytestconfig.option) assert False
  63. 63. 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
  64. 64. 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
  65. 65. # 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
  66. 66. # 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'))
  67. 67. # 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'))
  68. 68. # 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'))
  69. 69. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ] URLs set Tests set
  70. 70. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod[ ] URLs set Tests set
  71. 71. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  72. 72. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  73. 73. 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
  74. 74. 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
  75. 75. 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
  76. 76. 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
  77. 77. 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'
  78. 78. 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'
  79. 79. 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'
  80. 80. #content of test_preprod.py @pytest.mark.smoke def test_preprod(some_fixture): assert False #terminal >>pytest rnd_tests --m 'smoke' --environment = 'preprod'
  81. 81. #content of test_preprod.py @pytest.mark.smoke def test_preprod(some_fixture): assert False #terminal >>pytest rnd_tests --m 'smoke' --environment = 'preprod'
  82. 82. 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
  83. 83. 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
  84. 84. 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']}>
  85. 85. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  86. 86. КАК РАБОТАЕТ PYTEST 1. Configuration 2. Collection 3. Running 4. Reporting >> pytest rnd.tests/ --environment = preprod
  87. 87. # 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'
  88. 88. # 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'
  89. 89. # 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'
  90. 90. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/
  91. 91. В ИДЕАЛЬНОМ МИРЕ >> pytest rnd.tests/ --environment = preprod
  92. 92. В ИДЕАЛЬНОМ МИРЕ 1. Настроен раздельный запуск тестов для разных сред 2. Исключены человеческие ошибки при запуске 3. Добавлен минимум кода 4. Добавлено 0 дополнений
  93. 93. В ИДЕАЛЬНОМ МИРЕ 1. Настроен раздельный запуск тестов для разных сред 2. Исключены человеческие ошибки при запуске 3. Добавлен минимум кода 4. Добавлено 0 дополнений
  94. 94. https://docs.pytest.org tech.lamoda.ru julia-shpulia @StickersMM

×