Презентація про використання модуля QtTestLib для проведення модульного тестування як коду так і частково графічного інтерфейсу. Автор: Герасимчук Назар, КНУ, 2012.
http://tro.trola.org/wp/
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Основнi моменти модульного тестування в Qt
1. Основнi моменти модульного тестування в
Qt Framework
Герасимчук Назар
магiстр 2-го року навчання,
факультет кiбернетики,
Київський нацiональний унiверситет iм. Т. Шевченка
3 жовтня 2012 р.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 1 / 21
2. Змiст
Модульне тестування
Що це таке?
Порiвняння з iншими видами тестування.
Причини використання.
Причини НЕ використання.
Парктичне використання
Кiлька слiв про Qt.
Реалiзацiя модульного тестування в Qt.
Приклад.
Висновки
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 2 / 21
4. Модульне тестування
Що це таке?
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
5. Модульне тестування
«Заглушки»
«Заглушки» – замiнюють компоненти, якi використовуються
модулем i виконують наступнi дiї:
не виконують нiчого,
повертають постiйне значення,
вiдображають спрощену реалiзацiю компоненту,
iмiтують аварiйнi умови.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 5 / 21
6. Модульне тестування
Скiльки треба тестiв? //фiлософське питання
Код з невiдтестованим частинами не має бути опублiкований.
Повне покриття тестами не гарантує роботоздатностi.
Безглуздо писати тести заради лише 100% покриття.
Питання «Як я можу зламати?»
ефективнiше питання «Як я можу пiдтвердити правильнiсть?».
Тести повиннi базуватися на специфiкацiї.
На кожну вимогу повинен бути тест.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 6 / 21
7. Модульне тестування
Порiвняння з iншими видами тестування.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 7 / 21
8. Модульне тестування
Причини використання.
Написання тестiв. . .
. . . дозволяє ввiйти в робочий ритм.
. . . дає впевненiсть в працездатностi коду.
. . . дає запас стiйкостi при подальшiй iнтеграцiї чи змiнах коду.
. . . є своєрiдним документуванням.
. . . сприяє рефакторингу в сторону декомпозицiї i доопрацюванню
архiтектури.
. . .
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 8 / 21
9. Модульне тестування
Причини НЕ використання.
Написання тестiв займає багато часу.
Запуск тестiв займає багато часу.
Це – не моя робота тестувати код.
Лiнь.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 9 / 21
10. Парктичне використання
Кiлька слiв про Qt
Qt – кросплатформовий 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
11. Парктичне використання
Реалiзацiя модульного тестування в Qt.
QtTestLib – легка бiблiотека призначена для тестування, введена в Qt
з 4.1:
юнiт-тестування,
тестування GUI.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 11 / 21
12. Принцип роботи QtTestLib
Простий приклад тестуючого класу
class testDate: public QObject
{
Q_OBJECT
private 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
13. Принцип роботи QtTestLib
Результат виконання – успiшно
********* Start testing of testDate *********
Config: Using QTest library 4.8.1
PASS : 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
14. Принцип роботи QtTestLib
Результат виконання – неуспiшно
********* Start testing of testDate *********
Config: Using QTest library 4.8.1
PASS : testDate::initTestCase()
PASS : testDate::testValidity()
FAIL! : testDate::testMonth() Compared values are not the same
Actual (date.month()): 4
Expected (3): 3
Loc: [tutorial1.cpp(25)]
PASS : testDate::cleanupTestCase()
Totals: 3 passed, 1 failed, 0 skipped
********* Finished testing of testDate *********
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 14 / 21
15. Принцип роботи 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
16. Принцип роботи QtTestLib
Керування даними – слот наповнення даними
void testDate::testMonth_data()
{
QTest::addColumn<int>("year"); // the year we are testing
QTest::addColumn<int>("month"); // the month we are testing
QTest::addColumn<int>("day"); // the day we are testing
QTest::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
17. Принцип роботи QtTestLib
Керування даними – результат виведення
********* Start testing of testDate *********
Config: Using QTest library 4.8.1
INFO : testDate::initTestCase() entering
PASS : testDate::initTestCase()
INFO : testDate::testValidity() entering
INFO : testDate::testValidity() QVERIFY(date.isValid())
Loc: [tutorial2.cpp(19)]
PASS : testDate::testValidity()
INFO : testDate::testMonth() entering
INFO : 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() entering
PASS : testDate::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped
********* Finished testing of testDate *********
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 17 / 21
18. Парктичне використання
Приклад
Реалiзуємо мiнiмальне модульне тестування для:
Вiконної програми – тестування GUI, а саме – емуляцiя
натискання клавiш клавiатури та клiкiв мишкою та перевiрка
отриманих результатiв.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 18 / 21
19. Висновки
Пагано проектований код майже неможливо автоматично
тестувати.
Бажання тестувати код змушує бiльш грамотно проектувати
архiтектуру.
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 19 / 21
20. Використанi джерела
«Я не пишу юнит-тесты, потому что. . . » – отговорки
http://habrahabr.ru/post/112685/
Модульное тестирование – личный опыт
http://habrahabr.ru/post/110909/
KDE TechBase – Development/Tutorials/Unittests
http://techbase.kde.org/Development/Tutorials/Unittests
CIT Forum – Сергей Мартыненко «Модульное тестирование. Зачем, как и
кто»
http://citforum.ru/SE/testing/unit_testing/
Герасимчук Назар (КНУ) Модульнi тести (unit tests) 3 жовтня 2012 р. 20 / 21