Главная страница
Навигация по странице:

  • Задача Предлагаю для примера, реализовать класс Smart, который будет работать с сравнением целых чисел. Что он конкретно будет делать Реализуем метод int min(int, int)

  • Тестирование QObject* классов Проверка класса. Для этого напишем класс который будет тестировать наш класс. Он будет называется Test_Smart.test_smart.h

  • Аргументы тестирования Опция

  • -silent Ограничить сообщения показом только предупреждений и ошибок -v1

  • Раздатка Unit тест qt легкое. Unittesting в Qt


    Скачать 23.96 Kb.
    НазваниеUnittesting в Qt
    Дата02.03.2023
    Размер23.96 Kb.
    Формат файлаdocx
    Имя файлаРаздатка Unit тест qt легкое.docx
    ТипЗадача
    #965351

    Unit-testing в Qt

    В Qt за юнит-тестирование отвечает модуль QTestLib (testlib). Он предоставляет нам набор макросов для тестирования. Есть несколько методов проведения тестов:

    • Завести тестовый проект в дочерней директории вашего проекта и тестировать в нем.

    • Тестировать макросом qExec(..) в основном проекте

    Qt использует: один проект — один тест. Поэтому реализовываются тесты созданием проекта tests в дочерней директории tests основного проекта. В tests лежит класс реализующий тест основного класса. Принцип работы его вы узнаете позже, а основное отличие этого подхода лежит в способе запуска теста. Этот подход требует отсутствие main.cpp и наличие макроса Q_TEST_MAIN(Test_ClassName) в конце test_classname.cpp.

    Задача

    Предлагаю для примера, реализовать класс Smart, который будет работать с сравнением целых чисел. Что он конкретно будет делать? Реализуем метод int min(int, int), который будет возвращать меньшее число и int max(int, int), который вернет большее число.

    Заходим в Qt Creator. Создаем консольное приложение Qt. Добавляем модуль testlib и gui (надо для тестирования GUI) к .pro-файлу. Принято начинать с написания тестов, а потом уже самого класса. Сегодня будем писать класс Smart.


    smart.h

    #ifndef SMART_H

    #define SMART_H

    #include

    #include

    class Smart : public QObject

    {

    Q_OBJECT

    public:

    explicit Smart(QObject *parent, const QStringList& list);

    public slots:

    int max(int a, int b);

    int min(int a, int b);
    };
    #endif // SMART_H


    smart.cpp

    #include "smart.h"
    Smart::Smart(QObject *parent, const QStringList& list) :

    QObject(parent)

    {

    }

    int Smart::max(int a, int b)

    {

    if(a > b)

    return a;

    return b;

    }
    int Smart::min(int a, int b)

    {

    if(a < b)

    return a;

    return b;

    }

    Тестирование QObject* классов

    Проверка класса. Для этого напишем класс который будет тестировать наш класс. Он будет называется Test_Smart.

    test_smart.h

    #ifndef TEST_SMART_H

    #define TEST_SMART_H
    #include
    class Test_Smart : public QObject

    {

    Q_OBJECT

    public:

    explicit Test_Smart(QObject *parent = 0);
    private slots: // должны быть приватными

    void max(); // int max(int, int)

    };
    #endif // TEST_SMART_H


    test_smart.cpp

    #include

    #include "test_smart.h"

    #include "smart.h"

    Test_Smart::Test_Smart(QObject *parent) :

    QObject(parent)

    {

    }
    void Test_Smart::max()

    {

    Smart a;

    QCOMPARE(a.max(1, 0), 1);

    QCOMPARE(a.max(-1, 1), 1);

    QCOMPARE(a.max(4, 8), 8);

    QCOMPARE(a.max(0, 0), 0);

    QCOMPARE(a.max(1, 1), 1);

    QCOMPARE(a.max(-10,-5), -5);

    }

    Запустим наши тесты.

    main.cpp

    #include

    #include

    #include

    #include

    #include

    #include "test_smart.h"
    using namespace std;
    int main(int argc, char *argv[])

    {

    freopen("testing.log", "w", stdout);

    QApplication a(argc, argv);

    QTest::qExec(new Test_Smart, argc, argv);

    return 0;

    }

    Компилируем…

    testing.log

    ********* Start testing of Test_Smart *********

    Config: Using QTest library 4.8.1, Qt 4.8.1

    PASS : Test_Smart::initTestCase()

    PASS : Test_Smart::max()

    PASS : Test_Smart::cleanupTestCase()

    Totals: 3 passed, 0 failed, 0 skipped

    ********* Finished testing of Test_Smart *********

    Это — самый лучший исход тестирования!

    Метод тестирования "табличка". Чтобы не повторять много раз один и тот же самый код (разве что с разными параметрами). Чтобы этого избежать, в Qt реализован метод — «табличка». А как он работает? Создаем метод method_data(), в нем проводим пару нехитрых операций, а потом загружаем все это макросом QFETCH().

    Добавить в test_smart.cpp реализацию нашей «таблички»:

    void Test_Smart::min_data()

    {

    QTest::addColumn("first");

    QTest::addColumn("second");

    QTest::addColumn("result");
    QTest::newRow("min_data_1") << 1 << 0 << 0;

    QTest::newRow("min_data_2") << -1 << 1 << -1;

    QTest::newRow("min_data_3") << 4 << 8 << 4;

    QTest::newRow("min_data_4") << 0 << 0 << 0;

    QTest::newRow("min_data_5") << 1 << 1 << 1;

    QTest::newRow("min_data_6") << -10 << -5 << -10;

    }
    void Test_Smart::min()

    {

    Smart a;

    QFETCH(int, first);

    QFETCH(int, second);

    QFETCH(int, result);

    QCOMPARE(a.min(first, second), result);

    }

    Теперь опять компилируем. Получаем вывод.

    testing.log

    ********* Start testing of Test_Smart *********

    Config: Using QTest library 4.8.1, Qt 4.8.1

    PASS : Test_Smart::initTestCase()

    PASS : Test_Smart::max()

    PASS : Test_Smart::min()

    PASS : Test_Smart::cleanupTestCase()

    Totals: 4 passed, 0 failed, 0 skipped

    ********* Finished testing of Test_Smart *********

    Тестируем GUI


    Иногда, а иногда даже очень часто, нам приходится тестировать графический интерфейс. В QTestLib это тоже реализовано. Давайте протестируем QLineEdit.

    Вот как выглядит наш test_qlineedit.h:

    #ifndef TEST_QLINEEDIT_H

    #define TEST_QLINEEDIT_H
    #include
    class Test_QLineEdit : public QObject

    {

    Q_OBJECT

    private slots: // должны быть приватными

    void edit();

    };
    #endif // TEST_QLINEEDIT_H

    А вот как выглядит, тоже наш test_qlineedit.cpp:

    #include

    #include

    #include "test_qlineedit.h"
    void Test_QLineEdit::edit()

    {

    QLineEdit a;

    QTest::keyClicks(&a, "abCDEf123-");
    QCOMPARE(a.text(), QString("abCDEf123-"));

    QVERIFY(a.isModified());

    }

    Правим main.cpp:

    #include

    #include

    #include

    #include

    #include

    #include "test_smart.h"

    #include "test_qlineedit.h"
    using namespace std;

    int main(int argc, char *argv[])

    {

    freopen("testing.log", "w", stdout);

    QApplication a(argc, argv);

    QTest::qExec(new Test_Smart, argc, argv);

    cout << endl;

    QTest::qExec(new Test_QLineEdit, argc, argv);

    return 0;

    }

    Теперь запускаем тестирование:

    ********* Start testing of Test_Smart *********

    Config: Using QTest library 4.8.1, Qt 4.8.1

    PASS : Test_Smart::initTestCase()

    PASS : Test_Smart::max()

    PASS : Test_Smart::min()

    PASS : Test_Smart::cleanupTestCase()

    Totals: 4 passed, 0 failed, 0 skipped

    ********* Finished testing of Test_Smart *********
    ********* Start testing of Test_QLineEdit *********

    Config: Using QTest library 4.8.1, Qt 4.8.1

    PASS : Test_QLineEdit::initTestCase()

    PASS : Test_QLineEdit::edit()

    PASS : Test_QLineEdit::cleanupTestCase()

    Totals: 3 passed, 0 failed, 0 skipped

    ********* Finished testing of Test_QLineEdit *********

    Вот мы и научились тестировать GUI. Тест показал что QLineEdit работает корректно)).

    Аргументы тестирования


    Опция

    Объяснение

    -o filename

    Выведет результаты тестирования в файл filename

    -silent

    Ограничить сообщения показом только предупреждений и ошибок

    -v1

    Отображать информацию о входе и и выходе тестовых методов

    -v2

    Дополняет опцию -v1 тем, что выводит сообщения для макросов QCOMPARE и QVERIFY

    -vs

    Отображать каждый высланный сигнал и вызванный слот

    -xml

    Осуществлять вывод всей информации в формате XML

    -eventdelay ms

    Заставляем тест остановиться и подождать ms миллисекунд. Эта опция полезна для нахождения ошибок в элементах GUI

    https://habr.com/ru/post/146449/ - откуда


    написать администратору сайта