Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Конфігураційне тестування
Спеціальний вид тестування, спрямований на перевірку сумісності об'єкта тестування з різним апаратним та програмним забезпеченням. Конфігураційне тестування необхідно для гарантованої сумісності об'єкта тестування з максимально можливим обладнанням, для забезпечення надійної роботи. Також КУ має враховувати тип операційної системи. RUP має розгалужений механізм по плануванню і одночасного запуску конфігураційних тестів на різних платформах одночасно. Тест повинен враховувати такі критерії, як: встановлене програмне забезпечення (і їх версії), наявність і версії драйверів обладнання, наявність обладнання (довільній комбінаціях). Мета Тестування: Методика: До початку тестування відкрити максимальне число загальновідомих додатків; Тестування проводиться на різних платформах. Критерії завершення: Всі виявлені дефекти оброблені і задокументовані. Інсталяційне тестування Останній вид тесту в нашому списку, але перша функція, з якої користувач розпочне ознайомлення з програмним продуктом. Даний вид тестування перевіряє здатність об'єкта тестування коректно і без збоїв встановитися на комп'ютер користувача (доустановити, оновитися) з обробкою всіх можливих виняткових ситуацій (брак місця, збій харчування). Мета Тестування: 1. нова інсталяція, нова машина, що не інстальований на неї раніше; 2. оновлення існуючої версії (перевстановлення); 3. оновлення зі старої версії (апгрейд) 4. спроба установки старої версії поверх нової.
Методика: Критерії завершення: Виняткові ситуації обробляються коректно. Всі виявлені дефекти оброблені і задокументовані. Тестування навантаження за допомогою Selenium Введення
Навіщо взагалі це знадобилося? Ми переслідували дві мети - введення автоматичних тестів для наших web-додатків і створення навантажувальних тестів на основі функціональних тестів. Чому для тесту використовувався саме Selenium, а не більш підходящий інструмент - LoadRunner, jMeter? За допомогою LoadRunner's навантажувальний тест був проведений, але результати були поставлені під сумніви - при емуляції двохсот користувачів сторінки завантажувалася за 2 секунди плюс-мінус 2%, хоча при відкритті цих же сторінок з браузера відображення відбувалося більш ніж за 3 секунди. Так що хотілося провести навантажувальні тести максимально наближені до реальності, а це можна зробити тільки за допомогою повної емуляції поведінки користувача. Для цього якраз підходили інструменти для функціонального тестування з їх роботою з браузерами - сайт відкривався б через звичайний браузер, тобто так як робив би це користувач.
Про Selenium
Загальна архітектура
Додаток розділений на рівні (для наочності на схемі елементи кожного рівня мають осмислені назви, а не просто Тест 1, Методи 2). Перший рівень - рівень «запускальщика» тестів. Він просто запускає тести. У налаштуваннях конфігурується кількість потоків, кількість запусків тесту, класи тесту. Другий рівень - самі тести. Вони виконують бізнес операції - авторизацію, відкривають списки документів, відкривають документи, переходять по вкладках документів. Для початку перерахованих дій буде достатньо для забезпечення мінімальної роботи з системою. Надалі вони будуть додаватися. Поділ на ці рівні дає таку ж вигоду - можна запускати тести як з «запускальщика», так і без - просто запуск одного тесту з середовища розробки. Винесення атомарних користувальницьких операцій на окремий рівень дозволить надалі відмовитися від написання тестів на Java, а розробити свій DSL для того, що б тести могли писати будь-які люди.
Запуск тестів
Final Int threadCount = readThreadCount (); Final Int invocationCount = readInvocationCount (); Final List < Class> testClasses = readTestClasses (); ExecutorService taskExecutor = Executors.newFixedThreadPool (threadCount); for ( Int I = 0; i < threadCount; i ++) { taskExecutor.execute ( New TestRunner (invocationCount, testClasses)); } taskExecutor.shutdown (); taskExecutor.awaitTermination (Long.MAX_VALUE, TimeUnit.NANOSECONDS);
Код класу запускає тести
Public Class TestRunner Implements Runnable { Public Void Run () { JUnitCore jUnitRunner = New JUnitCore (); jUnitRunner.addListener ( New TimeListener ()); for ( Int I = 0; i < invocationCount; i ++) { for (Class clazz: testClasses) { jUnitRunner.run (clazz); } Thread.sleep (invocationTimeOut); } } }
Код listener 'а
Public Class TimeListener extends RunListener { Private EtmPoint Point; Public Void testStarted (Description description) throws Exception { point = EtmManager.getEtmMonitor (). createPoint (description.getClassName () + "." + description.getMethodName (); ); } Public Void testFinished (Description description) throws Exception { point.collect (); } Public Void testFailure (Failure failure) throws Exception { log.error ( " Error in test." , failure.getException ()); } }
Тести
Для написання тестів використовувався jUnit. Хоча також можна використовувати TestNG, який підтримує паралельний запуск тестів (а при навантажувальному тестуванні це обов'язкова вимога). Але обраний був саме jUnit з двох причин: 1) у компанії він широко поширений і давно використовується 2) потрібно було все одно писати свій «запускальщик» який би дозволив, не змінюючи тести, запускати їх в різних потоках (у TestNG паралельний запуск налаштовується в самих тестах) і збирати статистику щодо їх виконання. Крім тестів були написані додаткові модулі - pool webdriver'ов (тут слово webdriver використовується в термінології Selenium'а), pool користувачів, pool документів, rule (у термінології jUnit) по зняттю скріншотів при помилку, rule з видачі webdriver тесту, rule авторизації. Pool webdriver'ов - це клас, який управляє отриманням webdriver з сервера Selenium'а і розподіляє їх між тестами. Потрібен для того, що б абстрагувати роботу з Selenium'ом - тести будуть отримувати webdriver'и і віддавати їх цьому pool'у. Webdriver'и при цьому не закриваються (не викликається метод close). Це потрібно тому, що б не перезапускати браузер. Тобто таким чином виходить «реіспользованіе» webdriver'ов іншими тестами. Але повторне використання має свої мінуси - при поверненні webdriver'а в pool потрібно «підчистити» за собою - видалити всі cookie або, якщо це зробити не можна, виконати logout. Pool користувачів потрібний в основному при навантажувальному тестуванні, коли потрібно запускати однакові тести від різних користувачів. Він всього лише по колу віддає логін / пароль чергового користувача. Rule по зняттю скріншотів про помилку, потрібен, як випливає з назви, знімати скріншот про помилку виконання тесту. Він зберігає його в папку і записує в лог назва скриншота зі stacktrace'ом помилки. Дуже допомагає в подальшому «побачити» помилку, а не тільки прочитати її в логах. ( internetka.in.ua/selenium-rule-screenshot/ ) Rule авторизації потрібен так само для автоматизації, тільки тепер авторизація - щоб в кожному тестовому методі не писати login \ logout.
Збір статистики
BasicEtmConfigurator.configure (); EtmMonitor etmMonitor = EtmManager.getEtmMonitor (); etmMonitor.start (); HttpConsoleServer server = New HttpConsoleServer (etmMonitor); server.start ();
Збір статистики походив з двох місць - збирався загальний час виконання тестових методів (з рівня «запускальщика») і час виконання атомарних користувальницьких операцій (з третього рівня). Для вирішення першої проблеми використовувався спадкоємець RunListener'а, в якому перевизначаються методи початку і закінчення тесту і в них збиралася інформація про виконання. Рішення другої проблеми можна було виконати «в лоб» - на початку і наприкінці кожного методу, час виконання якого потрібно записувати, писати код для відліку цього часу. Але так як методів вже зараз більше п'яти, а надалі їх буде набагато більше, то хотілося б це автоматизувати. Для цього скористуємось AOP, а конкретно AspectJ. Був написаний простим аспектом, який додавав підрахунок часу виконання всіх public методів з класів з одними операціями. Час підраховувався тільки успішно виконаних методів, що б методи, що вилетіли з помилкою на середині виконання, не псували статистику. Так само виявився один недолік при зборі статистики за назвами методів - так як методи по роботі з одними операціями були універсальні і викликалися усіма тестами, але статистику потрібно було збирати за типами документів. Тому статистика збиралася не тільки за назвою методів, але ще й по їхніх аргументах, що ідентифікують тип документа. Код методу аспекту
Around ( " execution (public static * < Пакет з класами користувальницьких операцій>. *. * (..))" ) Public Object profileMethod (ProceedingJoinPoint thisJoinPoint) throws Throwable { EtmPoint point = EtmManager.getEtmMonitor (). CreatePoint (getPointName (thisJoinPoint)); Object result = thisJoinPoint.proceed (); point.collect (); Return Result; }
Метод getPointName формує назву точки зрізу часу на основі назви методу і його параметрів.
|
Последнее изменение этой страницы: 2019-04-09; Просмотров: 72; Нарушение авторского права страницы