Основнi моменти модульного тестування в qt
TRANSCRIPT
![Page 1: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/1.jpg)
Основнi моменти модульного тестування вQt Framework
Герасимчук Назар
магiстр 2-го року навчання,факультет кiбернетики,
Київський нацiональний унiверситет iм. Т. Шевченка
3 жовтня 2012 р.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 1 / 21
![Page 2: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/2.jpg)
Змiст
Модульне тестуванняЩо це таке?Порiвняння з iншими видами тестування.Причини використання.Причини НЕ використання.
Парктичне використанняКiлька слiв про Qt.Реалiзацiя модульного тестування в Qt.Приклад.
Висновки
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 2 / 21
![Page 3: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/3.jpg)
Тестування
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 3 / 21
![Page 4: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/4.jpg)
Модульне тестування
Що це таке?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
![Page 5: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/5.jpg)
Модульне тестування
«Заглушки»«Заглушки» – замiнюють компоненти, якi використовуютьсямодулем i виконують наступнi дiї:
не виконують нiчого,повертають постiйне значення,вiдображають спрощену реалiзацiю компоненту,iмiтують аварiйнi умови.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 5 / 21
![Page 6: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/6.jpg)
Модульне тестування
Скiльки треба тестiв? //фiлософське питання
Код з невiдтестованим частинами не має бути опублiкований.Повне покриття тестами не гарантує роботоздатностi.Безглуздо писати тести заради лише 100% покриття.Питання «Як я можу зламати?»ефективнiше питання «Як я можу пiдтвердити правильнiсть?».Тести повиннi базуватися на специфiкацiї.На кожну вимогу повинен бути тест.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 6 / 21
![Page 7: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/7.jpg)
Модульне тестування
Порiвняння з iншими видами тестування.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 7 / 21
![Page 8: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/8.jpg)
Модульне тестування
Причини використання.Написання тестiв. . .
. . . дозволяє ввiйти в робочий ритм.
. . . дає впевненiсть в працездатностi коду.
. . . дає запас стiйкостi при подальшiй iнтеграцiї чи змiнах коду.
. . . є своєрiдним документуванням.
. . . сприяє рефакторингу в сторону декомпозицiї i доопрацюваннюархiтектури.. . .
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 8 / 21
![Page 9: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/9.jpg)
Модульне тестування
Причини НЕ використання.Написання тестiв займає багато часу.Запуск тестiв займає багато часу.Це – не моя робота тестувати код.Лiнь.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 9 / 21
![Page 10: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/10.jpg)
Парктичне використання
К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
![Page 11: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/11.jpg)
Парктичне використання
Реалiзацiя модульного тестування в Qt.QtTestLib – легка бiблiотека призначена для тестування, введена в Qtз 4.1:
юнiт-тестування,тестування GUI.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 11 / 21
![Page 12: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/12.jpg)
Принцип роботи 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
![Page 13: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/13.jpg)
Принцип роботи 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
![Page 14: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/14.jpg)
Принцип роботи 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
![Page 15: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/15.jpg)
Принцип роботи 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
![Page 16: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/16.jpg)
Принцип роботи 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
![Page 17: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/17.jpg)
Принцип роботи 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
![Page 18: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/18.jpg)
Парктичне використання
ПрикладРеалiзуємо мiнiмальне модульне тестування для:
Вiконної програми – тестування GUI, а саме – емуляцiянатискання клавiш клавiатури та клiкiв мишкою та перевiркаотриманих результатiв.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 18 / 21
![Page 19: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/19.jpg)
Висновки
Пагано проектований код майже неможливо автоматичнотестувати.Бажання тестувати код змушує бiльш грамотно проектуватиархiтектуру.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 19 / 21
![Page 20: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/20.jpg)
Використан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
![Page 21: Основнi моменти модульного тестування в Qt](https://reader038.vdocuments.site/reader038/viewer/2022102811/58820bc21a28abf05e8b6c57/html5/thumbnails/21.jpg)
Дякую за увагу!
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 21 / 21