Russian Qt Forum
Ноябрь 24, 2024, 14:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [Решено] Разработка ПО на Qt через тестирование (Test-Driven Development)  (Прочитано 19292 раз)
8Observer8
Гость
« : Февраль 11, 2014, 20:40 »

Внимание! Эта тема перетекла, в следующую тему, в шапку которой я буду добавлять изменения/добавления. Вам достаточно будет подписаться на неё. О всех измененияx/добавленияx я буду извещать: http://www.prog.org.ru/topic_26944_0.html

Привет!

Осваиваю эту технологию разработки: TDD. Писал по этому поводу небольшую пошаговую инструкцию: http://www.prog.org.ru/topic_26413_0.html

Возник следующий вопрос. Создал проект, который буду тестировать и проект, с помощью которого буду тестировать. Во втором проекте я прописал путь к классу, который хочу протестировать:

Код:
#include "../QtCalculator/calculator.h"

Заголовочный файл видим, а вот реализацию (.cpp) как подключить?
« Последнее редактирование: Июнь 26, 2014, 09:01 от 8Observer8 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 11, 2014, 20:58 »

в .pro файле допиши хедер в HEADERS, а реализацию — в SOURCES
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #2 : Февраль 11, 2014, 21:03 »

Большущее спасибо!  Улыбающийся
Записан
8Observer8
Гость
« Ответ #3 : Февраль 11, 2014, 21:30 »

Я вот так написал, работает:

Код:
INCLUDEPATH += "../QtCalculator/calculator.h"

SOURCES += tst_testqtcalculatortest.cpp ../QtCalculator/calculator.cpp

А если у меня метод исключение выбрасывает? Например, деление на ноль. Как мне тестить это в Qt? В CppUnit есть такой макрос:

Код:
std::vector<int> v;
CPPUNIT_ASSERT_THROW( v.at( 50 ), std::out_of_range );
« Последнее редактирование: Февраль 11, 2014, 21:33 от 8Observer8 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Февраль 12, 2014, 00:14 »

try/catch
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #5 : Февраль 12, 2014, 10:25 »

try/catch

Не могу придумать, как в тесте написать проверку деления на ноль, если тесты оформлять в таком виде:

Код:
void TestQtCalculatorTest::testCaseDiv_data()
{
    QTest::addColumn<double>("arg1");
    QTest::addColumn<double>("arg2");
    QTest::addColumn<double>("expected");

    QTest::newRow("div") << 4.0 << 2.0 << 2.0;
    QTest::newRow("div") << -5.0 << 5.0 << -1.0;
    //QTest::newRow("div") << 0.0 << 0.0 << 0.0;
}

void TestQtCalculatorTest::testCaseDiv()
{
    QFETCH(double, arg1);
    QFETCH(double, arg2);
    QFETCH(double, expected);

    Calculator calc;
    double actual = calc.div(arg1, arg2);
    double delta = 0.0001;

    bool result = qFuzzyCompare(expected, actual, delta);
    QString message = QString("expected = %1; actual = %2; delta = %3;").arg(expected).arg(actual).arg(delta);
    QVERIFY2(result, message.toStdString().c_str());
}
« Последнее редактирование: Февраль 12, 2014, 10:29 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #6 : Февраль 12, 2014, 11:42 »

Возникла очень большая проблема. Как тестировать GUI если все элементы private?
Код:
private:
    Ui::Dialog *ui;

Я вижу, что единственный выход - сделать их public, чтобы можно было тестировать из другого проекта.

Взял пример из самого Qt, из папки examples/qtestlib/tutorial4 И хочу протестировать свой калькулятор.


Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Февраль 12, 2014, 12:22 »

try/catch
это я поспешил — деление на 0 не выбрасывает исключение. вообще, при делении конечного ненулевого числа на 0 результатом будет бесконечность соответствующего знака, а 0/бесконечность/NaN на 0 — NaN.
Цитировать
Как тестировать GUI если все элементы private?
можно написать публичные аксессоры
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 12, 2014, 13:03 »

это я поспешил — деление на 0 не выбрасывает исключение. вообще, при делении конечного ненулевого числа на 0 результатом будет бесконечность соответствующего знака, а 0/бесконечность/NaN на 0 — NaN.
Любая арифметика выдаст Nan если хоть один из аргументов Nan, т.е. размножается очень быстро. +INF и др что показывает напр MSVC не имеет самостоятельного значения - это вариант Nan'а который можно узнать с помощью fp_classify (не помню точно, обычно это не нужно).

Но все это только для флотов - целочисленная арифметика выбрасывает исключение при делении на 0   
Записан
Hrundel
Гость
« Ответ #9 : Февраль 12, 2014, 13:23 »

Возникла очень большая проблема. Как тестировать GUI если все элементы private?
Я вижу, что единственный выход - сделать их public, чтобы можно было тестировать из другого проекта.

Элементы GUI для стабильных фреймворков типа MFC и Qt не тестируют. Тестируют только события которые они выполняют (on_press, on_enter etc.)
Записан
8Observer8
Гость
« Ответ #10 : Февраль 12, 2014, 13:37 »

try/catch
это я поспешил — деление на 0 не выбрасывает исключение. вообще, при делении конечного ненулевого числа на 0 результатом будет бесконечность соответствующего знака, а 0/бесконечность/NaN на 0 — NaN.

У меня метод выбрасывает исключение при попытки деления на ноль:
Код:
double Calculator::div(double a, double b) throw(std::invalid_argument)
{
    if (b != 0) {
        return a/b;
    } else {
        throw std::invalid_argument("Divide by zero");
    }
}

Как мне отлавливать это исключение в таком тесте:

Код:
void TestQtCalculatorTest::testCaseDiv_data()
{
    QTest::addColumn<double>("arg1");
    QTest::addColumn<double>("arg2");
    QTest::addColumn<double>("expected");

    QTest::newRow("div") << 4.0 << 2.0 << 2.0;
    QTest::newRow("div") << -5.0 << 5.0 << -1.0;
    //QTest::newRow("div") << 0.0 << 0.0 << 0.0;
}

void TestQtCalculatorTest::testCaseDiv()
{
    QFETCH(double, arg1);
    QFETCH(double, arg2);
    QFETCH(double, expected);

    Calculator calc;
    double actual = calc.div(arg1, arg2);
    double delta = 0.0001;

    bool result = qFuzzyCompare(expected, actual, delta);
    QString message = QString("expected = %1; actual = %2; delta = %3;").arg(expected).arg(actual).arg(delta);
    QVERIFY2(result, message.toStdString().c_str());
}

Цитировать
Как тестировать GUI если все элементы private?
можно написать публичные аксессоры

Что такое "публичные аксессоры"? Просто изменить private на public?
« Последнее редактирование: Февраль 12, 2014, 13:43 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #11 : Февраль 12, 2014, 13:51 »


В моём классе Dialog все элементы private. А я их сделал public:
Код:
public:
    Ui::Dialog *ui;

Возникла очень большая проблема. Как тестировать GUI если все элементы private?
Я вижу, что единственный выход - сделать их public, чтобы можно было тестировать из другого проекта.

Элементы GUI для стабильных фреймворков типа MFC и Qt не тестируют. Тестируют только события которые они выполняют (on_press, on_enter etc.)

Я не элементы тестирую, а хочу научиться писать пользовательские сценарии. К примеру, такие сценарии для программы "Калькулятор":

- пользователь ввёл в первый Edit: 5 -> ввёл во второй Edit: 7 -> нажал кнопку "Сложить" -> в третьем Edit'е ожидаем увидеть результат: 12
- пользователь ввёл в первый Edit: 5 -> ввёл во второй Edit: 0 -> нажал кнопку "Разделить" -> в третьем Edit'е ожидаем увидеть результат: Деление на ноль
- и т.д.
« Последнее редактирование: Февраль 12, 2014, 14:11 от 8Observer8 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Февраль 12, 2014, 14:09 »

У меня метод выбрасывает исключение при попытки деления на ноль:
Как мне отлавливать это исключение в таком тесте:
Код
C++ (Qt)
try
{
   double actual = calc.div(arg1, arg2);
}
catch (std::invalid_argument e)
{
   // обрабатываешь исключение
}
Что такое "публичные аксессоры"? Просто изменить private на public?
пример:
Код
C++ (Qt)
class A
{
public:
   int a() const { return _a; }
private:
   int _a;
};
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #13 : Февраль 12, 2014, 14:17 »

Вопрос не в этом. А как это в тесте сделать? У меня ожидаемый результат это double:

Код:
QTest::addColumn<double>("expected");

Пока не соображу, как в тесте это описать.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Февраль 12, 2014, 14:34 »

http://stackoverflow.com/questions/14979011/how-to-verify-with-qtest-that-an-exception-is-thrown попробуй
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.