Тесты производительности браузера через селен

Мы используем protractor для тестирования внутренних приложений AngularJS.

Помимо функциональных тестов, мы проверяем регрессии производительности с помощью protractor-perf, который основан на nodejs browser-perf. Потому что "Производительность - это функция" .

С protractor-perf мы можем измерять и утверждать разные характеристики производительности при выполнении действий браузера :

browser.get('http://www.angularjs.org');

perf.start(); // Start measuring the metrics
element(by.model('todoText')).sendKeys('write a protractor test');
element(by.css('[value="add"]')).click();
perf.stop(); // Stop measuring the metrics 

if (perf.isEnabled) { // Is perf measuring enabled ?
    // Check for perf regressions, just like you check for functional regressions
    expect(perf.getStats('meanFrameTime')).toBeLessThan(60); 
};

Теперь для другого внутреннего приложения мы имеем набор тестов на основе селена, написанных на Python.

Можно ли проверить регрессии производительности с помощью selenium-python или переписать тесты с помощью protractor, чтобы иметь возможность писать тесты производительности браузера?

Ответы

Ответ 1

Существует возможность приблизиться к что делает browser-perf, собирая хромовые журналы производительности и их анализ.

Чтобы получить журналы производительности, включите журналы performance, настроив loggingPrefs желаемые возможности:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = {'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=caps)

driver.get('https://stackoverflow.com')

logs = [json.loads(log['message'])['message'] for log in driver.get_log('performance')]

with open('devtools.json', 'wb') as f:
    json.dump(logs, f)

driver.close()

В этот момент файл devtools.json будет содержать кучу записей трассировки:

[
  {
    "params": {
      "timestamp": 1419571233.19293,
      "frameId": "16639.1",
      "requestId": "16639.1",
      "loaderId": "16639.2",
      "type": "Document",
      "response": {
        "mimeType": "text/plain",
        "status": 200,
        "fromServiceWorker": false,
        "encodedDataLength": -1,
        "headers": {
          "Access-Control-Allow-Origin": "*",
          "Content-Type": "text/plain;charset=US-ASCII"
        },
        "url": "data:,",
        "statusText": "OK",
        "connectionId": 0,
        "connectionReused": false,
        "fromDiskCache": false
      }
    },
    "method": "Network.responseReceived"
  },
  {
    "params": {
      "timestamp": 1419571233.19294,
      "encodedDataLength": 0,
      "requestId": "16639.1"
    },
    "method": "Network.loadingFinished"
  },
  ..
]

Теперь вопрос в том, что с ним делать.

Один вариант, который изначально предлагался во время конференции Google Test Automation Conference, должен отправить журналы webpagetest.org. В java есть пример здесь, но на данный момент мне не повезло реализовать его в Python.

В теории, отчет пользовательского интерфейса, созданный webpagetest.org, будет выглядеть так:

enter image description here

Они также предоставляют метрики в JSON/XML и других форматах, которые могут быть дополнительно проанализированы.

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


browser-perf также использует функцию ведения журнала для сбора журналов трассировки и анализа данных.

Ответ 2

Можно провести регрессионное тестирование производительности с помощью Selenium. Однако, как вы уже заметили. Основная суть Selenium заключается в том, что он имитирует поведение пользователей. Это означает, что Selenium выполнит действие (например, нажав кнопку), если пользователь сможет выполнить одно и то же действие. Также, принимая во внимание определенный код, обходные пути (т.е. Жесткие ожидания, различные проверки и пользовательский код), требующие даже возможности запуска Selenium script. Это означает, что "определение" тестирования производительности с использованием Selenium будет немного отличаться от традиционного тестирования производительности.

То, что вы хотите сделать, - это таймер (запуск/останов) для каждого действия, выполняемого Selenium. Например: нажатие на кнопку и запись в файл для последующего использования.

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

Selenium и Webdriver (Selenium 2.0) поставляются с этой функцией из коробки. Поэтому для этого нужно выполнить некоторую специальную кодировку.