Стоит ли выходить из браузера после каждого автоматического теста на основе Selenium? - PullRequest
3 голосов
/ 13 марта 2019

Я пытаюсь сделать свой тест селена как можно более атомарным и независимым, поэтому я решил выйти из браузера и создать новый экземпляр Webdriver после каждого запуска теста. Этот подход стал более понятным для меня и был подкреплен несколькими темами, обсуждающими эту проблему. е. г. Этот ответ на связанный вопрос:

Вы закрываете веб-драйвер после одного конкретного теста. Это хороший подход, но вам нужно будет запускать новый веб-драйвер для каждого нового теста, который вы хотите запустить.

Однако я также сталкивался с мнением о том, что выход из браузера после каждого теста является ненужным и неэффективным. е. г. Часть этого блога о Selenium:

Не рекомендуется загружать браузер перед каждым тестом. Скорее, гораздо лучше загрузить браузер перед всеми тестами, а затем закрыть его после выполнения всех тестов, так как это сэкономит ресурсы и время выполнения теста.

Поскольку я довольно новичок во всем этом, я изо всех сил пытаюсь выбрать между этими двумя. Пока что время выполнения моих тестов не представляет особой проблемы (поскольку у меня их всего несколько), но когда я начинаю расширять свой набор тестов, я беспокоюсь, что это может стать проблемой.

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

У DebanjanB отличный ответ. Я из ткани, что нет единого универсального ответа.

Нужно найти веселый баланс. В зависимости от того, какую платформу вы используете, вы можете придумать. Мне нравится pytest за уникальное использование светильников.

Для этого вы можете выполнять тесты или наборы тестов в любом случае, в зависимости от того, что вам нужно. Вы можете сбалансировать время загрузки браузера и время выполнения для того, что имеет смысл.

Как пример в pytest:

conftest.py:

import pytest
from selenium import webdriver

@pytest.fixture(scope='module')
def module_browser(request):
    """Fixture lasts for an entire file of tests."""
    driver = webdriver.Chrome()
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

@pytest.fixture(scope='function')
def function_browser(request):
    """Fixture lasts for just a test function."""
    driver = webdriver.Chrome()
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

Теперь module_browser() позволяет вам получить браузер для всего тестового модуля. funtion_browser() дает вам новый браузер для каждой тестовой функции.

Позволяет себе представить ... у вас есть куча тестов, в которые нужно войти, и они делают косметические проверки на стандартном аккаунте:

conftest.py продолжение ...

@pytest.fixture(scope='module')
def logged_in_browser(request):
    """Provide a logged in browser for simple tests."""
    driver = webdriver.Opera()
    # Now go and log this browser in, 
    # so we can use the logged in state for tests.
    log_in_browser(username='RedMage', password='masmune')   
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

Это примерно то же самое, но позволяет оставить браузер открытым на несколько тестов, и он вошел в систему. Если вход в систему занимает, скажем, 5 секунд, и у вас есть 30 тестов, которые атомарно проверяют косметические вещи, вы можете несколько минут.

Эта гибкость позволит вам быстрее выполнять некоторые тесты, а некоторые - в более чистом состоянии. Нам может понадобиться каждый из них для запуска пакета и при этом мы сможем получить прирост эффективности в срок. Единого универсального ответа не существует.

Использование прибора в pytest позволяет вам выбирать, что вы хотите для каждого теста ... должен ли он быть чистым браузером или должен быть быстрее.

Затем в тестах мы видим такие вещи: test_things.py

def test_logged_out_assets(function_browser):
    driver = function_browser  # just for clarity here.
    driver.get('http://example.com/')
    check_some_stuff(driver)

language_subdomain_list = ['www', 'es', 'de', 'ru', 'cz']
@pytest.parametrize(language_subdomain, language_subdomain_list)
def test_logged_out_assets_multlingual(module_browser, language_subdomain):
    """
    Check the assets come up on each language subdomain.

    This test will run for each of the subdomains as separate tests.
    5 in all.
    """
    driver = module_browser  # for clarity in example.
    url = "http://{}.example.com".format(language_subdomain)
    driver.get(url)
    check_some_stuff(driver)

def test_logged_in_assets(logged_in_browser):
    """
    Check specific assets while logged in.

    Remember, our web browser already is logged in when we get it!
    """
    driver = logged_in_browser  # for clarity in example.
    check_some_assets(driver)

Py.test Светильники: https://docs.pytest.org/en/latest/fixture.html

2 голосов
/ 13 марта 2019

Прямой ответ, на самом деле нет определенных правил для выхода или повторного использования того же клиента браузера при выполнении тесты с использованием Selenium.Возможно, решение будет основано на предварительных требованиях тестовых случаев .

Если ваши тесты независимы, было бы целесообразноquit() текущий Webdriver и Browser Client экземпляр и создать новый экземпляр Webdriver и Browser Client после каждого запуска теста, который инициирует новую и чистую комбинацию WebDriver / Browser Client , как обсуждалось в закрытии браузера после прохождения теста .

Хотя это может побудить некоторые накладные расходы вызвать новую комбинацию WebDriver / Browser Client , но это может обеспечить столь необходимую подушку от CPU и Использование памяти , как описано в:

Incase, тесты не являются независимыми, а тесты основаны на том же сеанс , куки и т. д., параметры, повторное использование тех же WebDriver / Browser Client имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...