Основнi моменти модульного тестування в qt

21
Основнi моменти модульного тестування в Qt Framework Герасимчук Назар магiстр 2-го року навчання, факультет кiбернетики, Київський нацiональний унiверситет iм. Т. Шевченка 3 жовтня 2012 р. Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 1 / 21

Upload: trolaorg

Post on 14-Apr-2017

534 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: Основнi моменти модульного тестування в Qt

Основнi моменти модульного тестування вQt Framework

Герасимчук Назар

магiстр 2-го року навчання,факультет кiбернетики,

Київський нацiональний унiверситет iм. Т. Шевченка

3 жовтня 2012 р.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 1 / 21

Page 2: Основнi моменти модульного тестування в Qt

Змiст

Модульне тестуванняЩо це таке?Порiвняння з iншими видами тестування.Причини використання.Причини НЕ використання.

Парктичне використанняКiлька слiв про Qt.Реалiзацiя модульного тестування в Qt.Приклад.

Висновки

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 2 / 21

Page 3: Основнi моменти модульного тестування в Qt

Тестування

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 3 / 21

Page 4: Основнi моменти модульного тестування в Qt

Модульне тестування

Що це таке?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

Модульне тестування

«Заглушки»«Заглушки» – зам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

Модульне тестування

Скiльки треба тестiв? //фiлософське питання

Код з невiдтестованим частинами не має бути опублiкований.Повне покриття тестами не гарантує роботоздатностi.Безглуздо писати тести заради лише 100% покриття.Питання «Як я можу зламати?»ефективнiше питання «Як я можу пiдтвердити правильнiсть?».Тести повиннi базуватися на специфiкацiї.На кожну вимогу повинен бути тест.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 6 / 21

Page 7: Основнi моменти модульного тестування в Qt

Модульне тестування

Порiвняння з iншими видами тестування.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 7 / 21

Page 8: Основнi моменти модульного тестування в Qt

Модульне тестування

Причини використання.Написання тест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

Модульне тестування

Причини НЕ використання.Написання тестiв займає багато часу.Запуск тестiв займає багато часу.Це – не моя робота тестувати код.Лiнь.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 9 / 21

Page 10: Основнi моменти модульного тестування в Qt

Парктичне використання

К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

Парктичне використання

Реалiзацiя модульного тестування в Qt.QtTestLib – легка бiблiотека призначена для тестування, введена в Qtз 4.1:

юнiт-тестування,тестування GUI.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 11 / 21

Page 12: Основнi моменти модульного тестування в Qt

Принцип роботи 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

Принцип роботи 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

Принцип роботи 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

Принцип роботи 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

Принцип роботи 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

Принцип роботи 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

Парктичне використання

ПрикладРеалiзуємо мiнiмальне модульне тестування для:

Вiконної програми – тестування GUI, а саме – емуляцiянатискання клавiш клавiатури та клiкiв мишкою та перевiркаотриманих результатiв.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 18 / 21

Page 19: Основнi моменти модульного тестування в Qt

Висновки

Пагано проектований код майже неможливо автоматичнотестувати.Бажання тестувати код змушує бiльш грамотно проектуватиархiтектуру.

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 19 / 21

Page 20: Основнi моменти модульного тестування в Qt

Використан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

Дякую за увагу!

Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 21 / 21