4.2. Тестування навантаження Web-додатків - alpaev.com

  1. Тепер запишемо простий тест.
  2. Тепер розглянемо навантажувальні тести.
  3. Запуск тестів і аналіз результатів
  4. Порівняння результатів тестування навантаження
  5. Модифікація навантажувальних тестів і завдань з тестових скриптів
  6. Кілька важливих зауважень по тестування навантаження

TestComplete дозволяє проводити тестування навантаження додатків, які для передачі даних використовують протоколи HTTP, HTTPS або SOAP (тобто в основному web-додатків). Для цього спочатку записується трафік, який генерується при спілкуванні локального комп'ютера з сервером, а потім, використовуючи записаний трафік, емулює дії користувачів. При цьому неважливо, який браузер використовується при запису, а при відтворенні записаних скриптів можна емулювати будь-який браузер.

Загальна схема при створенні навантажувальних тестів:

  1. записати дії
  2. Внести зміни в записаний трафік
  3. Створити скрипти, які будуть запускати записані дії
  4. Проаналізувати результати запуску

Перш ніж почати запис навантажувальних тестів, необхідно додати в проект відповідний елемент HTTP Load Testing. Для цього клацнемо правою кнопкою миші на імені проекту, виберемо пункт меню Add - New Item і в діалоговому вікні вибрати елемент HTTP Load Testing.
Перш ніж почати запис навантажувальних тестів, необхідно додати в проект відповідний елемент HTTP Load Testing
Після цього в нашому проекті з'явиться новий елемент LoadTesting з трьома дочірніми елементами:

  1. Station - тут перераховані всі робочі станції, які використовуються для навантажувального тестування (за замовчуванням використовується тільки один локальний комп'ютер - Master)
  2. Tasks - завдання, тобто запити, які відправляються сервера, і відповіді від нього
  3. Tests - навантажувальні тести. Їх можна створювати як візуально в редакторі, так і в скриптах

Тепер запишемо простий тест.

Для цього ми скористаємося сайтом http://ya.ru/ і браузером Firefox. Перед початком запису ми відкриємо в Firefox тільки один цей сайт.
У TestComplete почнемо запис (Test - Record - Record Script) і на панелі, що з'явилася Recording натиснемо кнопку Record an HTTP Task.
Для цього ми скористаємося сайтом   http://ya
При цьому з'явиться вікно Specify Load Testing Test, в якому ми введемо імена для навантажувального тесту і ім'я нового завдання.

Після цього натиснемо ОК і почнемо виконання дій, які хочемо записати для навантажувального тесту. При цьому записується тільки трафік, а робота з елементами управління (наприклад, натискання на кнопки, переміщення миші і т.п.) ігноруються.

Для запису простого тесту перейдемо в браузер (де у нас вже відкрито сайт ya.ru ) Введемо в рядок пошуку будь-якої текст (наприклад, "testcomplete") і натиснемо кнопку Знайти. Як тільки сторінка з результатами пошуку повністю завантажиться, зупинимо запис і подивимося, що в підсумку записалося.

Власне, скрипт містить лише один рядок, яка запускає навантажувальний тест:

function Test4 ()
{
LoadTesting.Tests.TestByName ( "New Test"). Execute ();
}

У Tasks додана завдання "Task 1 - ya.ru". Якщо двічі клацнути по цьому завданню, можна подивитися її подробиці.
У Tasks додана завдання Task 1 - ya
Поле Target Server дозволяє задати ім'я сервера, на якому проводиться тестування. Це може бути корисно, наприклад, в тому випадку, якщо запис скриптів проводиться на одному сервері, а запуск буде проводиться на іншому. У цьому випадку нам не доведеться міняти ім'я сервера для кожного підключення, а змінити його один раз в цьому полі.

У списку Connections зліва ми бачимо список записаних підключень, тобто запитів до сервера і відповідей від нього. Як видно з нашого прикладу, запити можуть відправлятися не до одного сервера, а до кількох (наприклад, якщо на сайті встановлена ​​реклама, яка береться з інших джерел, розташованих на інших серверах). Зазвичай такі підключення не потрібно тестувати, а тому їх можна сміливо видалити із завдання. Для цього необхідно натиснути правою кнопкою по непотрібному підключенню і вибрати пункт Delete.

У правій частині панелі відображаються 2 вкладки - Request (Запит) і Respond (Відповідь). Це запити і відповіді для обраного в списку ліворуч підключення. Галочка Raise Events на кожній вкладці дозволяє включити генерацію OnLoadTestingRequest і OnLoadTestingResponse події відповідно. За замовчуванням генерація цих подій відключена в TestComplete, так як включення цієї події для всіх підключень може істотно уповільнити виконання скриптів.

На вкладці Request знаходиться поле Request Method, в якому вказується використаний метод (GET або POST), запитана сторінка з параметрами (наприклад, / yandsearch? Text = testcomplete) і протокол доступу (наприклад, HTTP / 1.1). Всі ці параметри можна при необхідності змінити безпосередньо в завданню або з скриптів.

Також на вкладці Request знаходяться всі параметри підключення, які також можна при необхідності змінювати. Наприклад, параметр User-Agent дозволяє задати, який браузер буде використовувати при емуляції підключень.
На вкладці Response також перераховані параметри відповіді від сервера і його вміст. Наприклад, на скріншоті нижче показаний приклад відповіді від сервера (картинка):
Також на вкладці Request знаходяться всі параметри підключення, які також можна при необхідності змінювати

Тепер розглянемо навантажувальні тести.

При записи навантажувального тесту TestComplete автоматично створив один тест (ми його назвали New Test), його параметри можна побачити, якщо двічі клацнути на елементі проекту LoadTesting - Tests - New Test.
При записи навантажувального тесту TestComplete автоматично створив один тест (ми його назвали New Test), його параметри можна побачити, якщо двічі клацнути на елементі проекту LoadTesting - Tests - New Test
В кожному тесті може бути кілька користувачів (поле User Name), кожен з яких в свою чергу може запускати відразу декілька примірників навантажувального тесту (кількість одночасних запусків визначається полем User Count, а завдання - полем Task). Також для кожного користувача можна вказати комп'ютер, який буде використовуватися для запуску записаного трафіку (поле Workstation), браузер, який буде використовуватися при емуляції (Browser), затримка старту в мілісекундах (Start Delay), швидкість підключення (Connection Speed), а також вказати , чи потрібно для цього користувача виправляти Host Field (якщо галочка включена, то Host Field буде замінюватися на значення з поля Target Server).

Так як результати відображаються окремо для кожного користувача, рекомендується давати віртуальним користувачам легко відрізняються імена, щоб легше було аналізувати результати:
Так як результати відображаються окремо для кожного користувача, рекомендується давати віртуальним користувачам легко відрізняються імена, щоб легше було аналізувати результати:   Зверніть увагу на опцію Run Concurrently у вікні навантажувального тесту
Зверніть увагу на опцію Run Concurrently у вікні навантажувального тесту. Якщо ця опція включена, то при запуску цього навантажувального тесту всі завдання віртуальних користувачів будуть запускатися одночасно, а якщо опція вимкнена - то завдання будуть запущені по черзі.

Запуск тестів і аналіз результатів

Точно так же, як ми створили навантажувальний тест для сайту ya.ru раніше в цьому розділі, ми створили аналогічний тест для сайту google.com, додали в тест New Test ще одного користувача (див. скріншот вище) і тепер готові запустити тести.

Для цього клацнемо правою кнопкою миші на тесті в дереві проекту і виберемо пункт меню Run.
Для цього клацнемо правою кнопкою миші на тесті в дереві проекту і виберемо пункт меню Run
Після того, як тест відпрацює, ми побачимо результати в такому вигляді:

Лог складається з двох закладок (в лівому нижньому куті екрану):

  • Load testing Log - на цій вкладці можна подивитися різні результати по кожному користувачеві і підключенню
  • Default Log - тут відображаються всі помилки, попередження і повідомлення по кожному підключенню

Розглянемо уважно вкладку Load Testing Log. Тут знаходяться три панелі:

  1. Панель користувачів. По осі X на графіку відображаються користувачі, а по осі Y - час, який знадобився кожному користувачеві на виконання тесту. У наведеному вище прикладі видно, що першому користувачеві знадобилося трохи більше однієї секунди для виконання тесту, а останнім - 11 секунд.
    У таблиці праворуч від графіка можна подивитися, яке завдання виконував кожен користувач, скільки в точності часу знадобилося кожному користувачеві часу і скільки підключень вони зробили за час виконання тесту. Наприклад, з результатів, показаних вище, видно, що на виконання запитів до Гуглу витрачалося від 1 до 4 секунд, а на запити до Яндексу - від 8 до 11 секунд.
    При виборі будь-якої рядки в таблиці користувачів змінюється інформація на другий панелі - панелі підключень.
  2. Панель підключень. Тут можна подивитися детальну інформацію по кожному підключенню для користувача, обраного в першій панелі. Інформація також відображається у вигляді таблиці і наочного графіка.
    Наприклад, у наведеному вище прикладі ми бачимо, що найбільше часу займають запити до сервера kiks.yandex.ua. Це може послужити приводом для з'ясування причин такого довгого відповіді від сервера, так як отриманий результат істотно відрізняється від середніх результатів запитів до інших серверів, а значить саме цей сервер може бути "слабкою ланкою".
    У таблиці Connections відображається дуже багато інформації по кожному підключенню (наприклад, час, кількість переданих та отриманих байт, продуктивність і т.п.), тому заголовки стовпців важко прочитати. Уважно подивіться, можливо деякі з колонок вам не потрібні, тоді їх можна приховати, клацнувши правою кнопкою миші на заголовку таблиці і вибравши пункт Field Chooser.
  3. Панель запитів. У цій панелі можна подивитися детальну інформацію по кожному запиту обраного підключення.

За замовчуванням графіки подаються у вигляді звичайного графіка, проте можна вибрати представлення у вигляді стовпчастий діаграми (chart). Для цього треба просто вибрати відповідну закладку на графіку.
За замовчуванням графіки подаються у вигляді звичайного графіка, проте можна вибрати представлення у вигляді стовпчастий діаграми (chart)
Потім, клацнувши правою кнопкою миші на діаграмі, можна вибрати, яку саме інформацію TestComplete повинен відображати на графіку.

Використання діаграми замість графіка зручно тим, що за допомогою клацання мишею по якому-небудь елементу графіка, TestComplete автоматично підсвічує сообтветствующую рядок в таблиці справа.

Вкладка Default Log являє собою звичайний лог TestComplete-а, в якому можна подивитися інформацію про помилки, попередження і повідомлення про виконані підключених.
Вкладка Default Log являє собою звичайний лог TestComplete-а, в якому можна подивитися інформацію про помилки, попередження і повідомлення про виконані підключених

Порівняння результатів тестування навантаження

Якщо ви хочете порівнювати результати тестування навантаження якогось тесту, вам необхідно спочатку включити цей тест в групу. Для цього відкрийте навантажувальний тест в редакторі TestComplete і введіть ім'я групи в поле Result Group:
Якщо ви хочете порівнювати результати тестування навантаження якогось тесту, вам необхідно спочатку включити цей тест в групу
Тепер після декількох запусків вашого тесту, ви можете порівняти отримані результати один з одним. Це може бути корисно, якщо в додатку були зроблені зміни, які повинні були прискорити роботу програми, або навпаки, зроблені зміни могли вплинути на продуктивність і необхідно перевірити наскільки сильно.

Для порівняння результатів будь-якої групи в дереві проекту виберіть пункт ProjectSuite Analysis - Project Analysis - Group Name:
Для порівняння результатів будь-якої групи в дереві проекту виберіть пункт ProjectSuite Analysis - Project Analysis - Group Name:   При цьому відкриється вікно, в якому результати запусків тесту представлені в зручному для порівняння вигляді:
При цьому відкриється вікно, в якому результати запусків тесту представлені в зручному для порівняння вигляді:

Модифікація навантажувальних тестів і завдань з тестових скриптів

До сих пір ми працювали з навантажувальні тестами через редактор TestComplete, однак може виникнути необхідність вносити зміни, так би мовити, "на льоту", тобто під час роботи скрипта.

Наприклад, якщо ми тестуємо пошук на сайті, а сервер кешує результати пошуку, то навантаження фактично буде даватися на сервер один раз: при першому виконанні запиту. Всі наступні результати будуть видані з кеша.

У такій ситуації нам треба для кожного запиту до сервера формувати новий рядок, яку ви можете знайти буде проводитися в навантажувальних тестах.

У наступному прикладі ми створимо 5 віртуальних користувачів, кожному з яких призначимо завдання (Task) і навантажувальний тест (Test, який також буде створено в скрипті), а потім запустимо створений навантажувальний тест, одночасно призначивши йому групу (щоб можна було порівнювати результати прогону тестів ).

function TestLoadTesting ()
{
var i;
// Створюємо новий тест
var ti = LoadTesting.CreateTestInstance ( "New Created Test");

// масив для користувачів
var aUsers = new Array (5);

// призначаємо кожному користувачеві завдання і тест
for (i = 0; i <aUsers.length; i ++)
{
aUsers [i] = LoadTesting.CreateVirtualUser ( "New created user" + i.toString ());
aUsers [i] .Task = LoadTesting.HTTPTaskByName ( "Task 2 - google.com");
aUsers [i] .TestInstance = ti;
}

// запускаємо навантажувальний тест
ti.Run ( "New result group");
}

А в наступному прикладі ми модифікуємо раніше записану завдання для кожного користувача таким чином, щоб кожен з віртуальних користувачів шукав не просто рядок "testcomplete", а рядок "textcompleteN", де N - порядковий номер користувача (замість порядкового номера можна, наприклад, написати функцію , яка буде генерувати випадкову рядок по заданому зразку, ми використовуємо приклад з порядковим номером лише для спрощення прикладу).

function TestLoadTesting ()
{
var i;
var sHeader;
// Створюємо новий тест
var ti = LoadTesting.CreateTestInstance ( "New Created Test");

// масив для користувачів
var aUsers = new Array (5);

// призначаємо кожному користувачеві завдання і тест
for (i = 0; i <aUsers.length; i ++)
{
aUsers [i] = LoadTesting.CreateVirtualUser ( "New created user" + i.toString ());
aUsers [i] .Task = LoadTesting.HTTPTaskByName ( "Task 2 - google.com");
aUsers [i] .TestInstance = ti;

// модифікуємо завдання для кожного користувача
sHeader = aUsers [i] .Task.Connection (0) .Request (0) .RequestHeader;
aUsers [i] .Task.Connection (0) .Request (0) .RequestHeader = aqString.Replace (sHeader, "testcomplete", "testcomplete" + i.toString ());
}

// запускаємо навантажувальний тест
ti.Run ( "New result group");
}

Кілька важливих зауважень по тестування навантаження

  1. При записи навантажувальних тестів переконайтеся, що працює тільки один додаток, що працює по HTTP, HTTPS або SOAP протоколу, - то, в якому записуються тести. Наприклад, додаток MSN Messenger також працює по HTTP протоколу і при передачі даних може вплинути на записані тести. Також в настройках TestComplete можна вказати списки додатків або хостів, трафік з яких TestComplete ігноруватиме (Tools - Options - Engines - HTTP Load Testing)
  2. TestComplete не може емулювати більше 300 віртуальних користувачів на одному комп'ютері. Якщо вам необхідно емулювати більшу кількість віртуальних користувачів, вам доведеться розподілити тестування навантаження на кілька комп'ютерів. Як це зробити, розказано в главі 15 Розподілене тестування .
  3. Якщо ви тестируете додаток, написане на ASP.NET, то деякі елементи управління можуть мати параметри, які постійно змінюються, а значить відповіді від сервера при записі і відтворенні будуть завжди відрізнятися. Щоб вирішити цю проблему, двічі клацніть на елементі LoadTesting в дереві проектів і додайте ці параметри в список Auto-Updated Parameters

    Тут же можна задати параметри серверів, які використовують NTLM або Kerberos типи аутентифікації.
  4. Якщо ви використовуєте проксі-сервер, вам необхідно вказати його параметри в опціях TestComplete (Tools - Options - Engines - HTTP Load Testing)
  5. Якщо у вас на комп'ютері встановлений антивірус, він може блокувати запис трафіку. Зверніться до довідки TestComplete, розділ "TestComplete Network Activities - Possible Issues With Antiviruses" щоб дізнатися, як вирішити цю проблему

Наприклад, / yandsearch?