Основнi моменти модульного тестування в qt
TRANSCRIPT
Основнi моменти модульного тестування вQt Framework
Герасимчук Назар
магiстр 2-го року навчання,факультет кiбернетики,
Київський нацiональний унiверситет iм. Т. Шевченка
3 жовтня 2012 р.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 1 / 21
Змiст
Модульне тестуванняЩо це таке?Порiвняння з iншими видами тестування.Причини використання.Причини НЕ використання.
Парктичне використанняКiлька слiв про Qt.Реалiзацiя модульного тестування в Qt.Приклад.
Висновки
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 2 / 21
Тестування
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 3 / 21
Модульне тестування
Що це таке?Unit testing – iзольована перевiрка кожного окремого елементу(модуль, функцiя, клас) шляхом запуску тестiв в штучномусередовищi.
Цiль: виявлення локалiзованих в модулi помилок, а також визначенняступеня готовностi системи до переходу на iнший рiвень розробки iтестування.
Основна iдея: оцiнюючи кожен елемент iзольовано i пiдтверджуючикоректнiсть його роботи, точно встановити помилку значно простiше,нiж якби елемент був частиною системи.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 4 / 21
Модульне тестування
«Заглушки»«Заглушки» – замiнюють компоненти, якi використовуютьсямодулем i виконують наступнi дiї:
не виконують нiчого,повертають постiйне значення,вiдображають спрощену реалiзацiю компоненту,iмiтують аварiйнi умови.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 5 / 21
Модульне тестування
Скiльки треба тестiв? //фiлософське питання
Код з невiдтестованим частинами не має бути опублiкований.Повне покриття тестами не гарантує роботоздатностi.Безглуздо писати тести заради лише 100% покриття.Питання «Як я можу зламати?»ефективнiше питання «Як я можу пiдтвердити правильнiсть?».Тести повиннi базуватися на специфiкацiї.На кожну вимогу повинен бути тест.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 6 / 21
Модульне тестування
Порiвняння з iншими видами тестування.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 7 / 21
Модульне тестування
Причини використання.Написання тестiв. . .
. . . дозволяє ввiйти в робочий ритм.
. . . дає впевненiсть в працездатностi коду.
. . . дає запас стiйкостi при подальшiй iнтеграцiї чи змiнах коду.
. . . є своєрiдним документуванням.
. . . сприяє рефакторингу в сторону декомпозицiї i доопрацюваннюархiтектури.. . .
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 8 / 21
Модульне тестування
Причини НЕ використання.Написання тестiв займає багато часу.Запуск тестiв займає багато часу.Це – не моя робота тестувати код.Лiнь.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 9 / 21
Парктичне використання
Кiлька слiв про QtQt – кросплатформовий iнструментарiй розробки ПЗ мовоюпрограмування C++.Включає класи необхiднi при розробцi: вiд графiчного iнтерфейсуi закiнчуючи класами для роботи з мережею, базами даних,OpenGL, OpenCV, SVG i XML.Дозволяє керувати потоками, працювати з мережею, i забезпечуєкрос-платформовий доступ до файлiв.З коробки є пiдтримка iнфраструктури тестування QtTestLib.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 10 / 21
Парктичне використання
Реалiзацiя модульного тестування в Qt.QtTestLib – легка бiблiотека призначена для тестування, введена в Qtз 4.1:
юнiт-тестування,тестування GUI.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 11 / 21
Принцип роботи QtTestLibПростий приклад тестуючого класу
class testDate: public QObject{
Q_OBJECTprivate slots:
void testValidity();void testMonth();
};
void testDate::testValidity(){
QDate date( 1967, 3, 11 );QVERIFY( date.isValid() );
}void testDate::testMonth(){
QDate date;date.setYMD( 1967, 3, 11 );QCOMPARE( date.month(), 3 );QCOMPARE( QDate::longMonthName(date.month()),
QString("March") );}
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 12 / 21
Принцип роботи QtTestLibРезультат виконання – успiшно
********* Start testing of testDate *********Config: Using QTest library 4.8.1PASS : testDate::initTestCase()PASS : testDate::testValidity()PASS : testDate::testMonth()PASS : testDate::cleanupTestCase()Totals: 4 passed, 0 failed, 0 skipped********* Finished testing of testDate *********
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 13 / 21
Принцип роботи QtTestLibРезультат виконання – неуспiшно
********* Start testing of testDate *********Config: Using QTest library 4.8.1PASS : testDate::initTestCase()PASS : testDate::testValidity()FAIL! : testDate::testMonth() Compared values are not the same
Actual (date.month()): 4Expected (3): 3Loc: [tutorial1.cpp(25)]
PASS : testDate::cleanupTestCase()Totals: 3 passed, 1 failed, 0 skipped********* Finished testing of testDate *********
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 14 / 21
Принцип роботи QtTestLibКерування даними – слот перевiрки
void testDate::testMonth(){
QFETCH(int, year);QFETCH(int, month);QFETCH(int, day);QFETCH(QString, monthName);
QDate date;date.setYMD( year, month, day);QCOMPARE( date.month(), month );QCOMPARE( QDate::longMonthName(date.month()), monthName );
}
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 15 / 21
Принцип роботи QtTestLibКерування даними – слот наповнення даними
void testDate::testMonth_data(){
QTest::addColumn<int>("year"); // the year we are testingQTest::addColumn<int>("month"); // the month we are testingQTest::addColumn<int>("day"); // the day we are testingQTest::addColumn<QString>("monthName"); // the name of the month
QTest::newRow("1967/3/11") << 1967 << 3 << 11 << QString("March");QTest::newRow("1966/1/10") << 1966 << 1 << 10 << QString("January");QTest::newRow("1999/9/19") << 1999 << 9 << 19 << QString("September");// more rows of dates can go in here...
}
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 16 / 21
Принцип роботи QtTestLibКерування даними – результат виведення
********* Start testing of testDate *********Config: Using QTest library 4.8.1INFO : testDate::initTestCase() enteringPASS : testDate::initTestCase()INFO : testDate::testValidity() enteringINFO : testDate::testValidity() QVERIFY(date.isValid())
Loc: [tutorial2.cpp(19)]PASS : testDate::testValidity()INFO : testDate::testMonth() enteringINFO : testDate::testMonth(1967/3/11) COMPARE()...INFO : testDate::testMonth(1999/9/19) COMPARE()
Loc: [tutorial2.cpp(44)]INFO : testDate::testMonth(1999/9/19) COMPARE()
Loc: [tutorial2.cpp(45)]PASS : testDate::testMonth()INFO : testDate::cleanupTestCase() enteringPASS : testDate::cleanupTestCase()Totals: 4 passed, 0 failed, 0 skipped********* Finished testing of testDate *********
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 17 / 21
Парктичне використання
ПрикладРеалiзуємо мiнiмальне модульне тестування для:
Вiконної програми – тестування GUI, а саме – емуляцiянатискання клавiш клавiатури та клiкiв мишкою та перевiркаотриманих результатiв.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 18 / 21
Висновки
Пагано проектований код майже неможливо автоматичнотестувати.Бажання тестувати код змушує бiльш грамотно проектуватиархiтектуру.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 19 / 21
Використанi джерела
«Я не пишу юнит-тесты, потому что. . . » – отговоркиhttp://habrahabr.ru/post/112685/
Модульное тестирование – личный опытhttp://habrahabr.ru/post/110909/
KDE TechBase – Development/Tutorials/Unittestshttp://techbase.kde.org/Development/Tutorials/Unittests
CIT Forum – Сергей Мартыненко «Модульное тестирование. Зачем, как икто»http://citforum.ru/SE/testing/unit_testing/
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 20 / 21
Дякую за увагу!
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 21 / 21