Skip to content
/ QtTest Public

Qt использование QtTest вместе с travis-ci.org

Notifications You must be signed in to change notification settings

levelp/QtTest

Repository files navigation

Модульное тестирование в Qt

Модульные тесты: Входные данные -> Тестируемый класс -> Ожидаемый результат

Если мы не знаем какой результат ожидать => мы не можем написать тест.

Но запустив тест один раз и посмотрев результат мы можем написать так называемый регрессионный тест. Т.е. тест, который страхует нас от регрессий - ухудшения качества ПО (когда что-то что уже работало в какой-то версии "ломается" в следующей).

Для использования модульных тестов надо подключить модуль testlib.

# testlib - библиотека для модульного тестирования
QT       += testlib core gui

Пример

Тестируемая функция:

// Сумма: a + b
int sum(int a, int b){
  return a + b;
}

Модульный тест к ней:

// Класс, который содержит тесты
class AllTests : public QObject {
  Q_OBJECT
private slots: // должны быть приватными
  // Тестирование функции суммирования
  void testSum(){
    QCOMPARE(sum(2,2), 4);
    QCOMPARE(sum(2,3), 5);
  }
};

В основной программе все тесты можно запустить так:

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

Подключаем все модули для тестирования

#include "inttostr.h"
#include "functions.h"
#include "myclass.h"
#include "squareeq.h"
// И свой заголовочный файл
#include "alltests.h"

Тестирование вычисления максимума

  MyClass a(this);
  // QCOMPARE( вызов_тестируемой_функции, ожидаемое_значение );
  QCOMPARE(a.max(2, 3), 3);  // 1 тест
  QCOMPARE(a.max(2, 4), 4);  // 2 тест
  QCOMPARE(a.max(5, 1), 5);
  QCOMPARE(a.max(1, 2), 2);
  QCOMPARE(a.max(-10, -20), -10);

Тестирование вычисления факториала

  QCOMPARE( ::factorial(1), 1LL );
  QCOMPARE( ::factorial(2), 2 * 1LL );
  QCOMPARE( ::factorial(3), 3 * 2 * 1LL );
  QCOMPARE( ::factorial(4), 4 * 3 * 2 * 1LL );
  QCOMPARE( ::factorial(5), 5 * 4 * 3 * 2 * 1LL );
  QCOMPARE( ::factorial(6), 6 * 5 * 4 * 3 * 2 * 1LL );
  QCOMPARE( ::factorial(7), 7 * 6 * 5 * 4 * 3 * 2 * 1LL );
  QCOMPARE( ::factorial(8), 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1LL );
  QCOMPARE( ::factorial(9), 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1LL );

  // Проверка исключения (ожидаемое исключение)
  try {
    ::factorial(-1);
    // Если мы оказались в этом месте программы,
    // то метод факториал не сгенерировал исключение
    QFAIL("Exception expected!");
  } catch(QString q) {
    QCOMPARE( q, QString("N > 0"));
  }

Квадратное уравнение TDD - Test Driven Development

  SquareEq a;
  Roots roots = a.quadraticEquation(1, 0, 0);

  QCOMPARE(roots.numberOfRoots, 1);
  QCOMPARE(roots.x[0], 0.0);

  roots = a.quadraticEquation(4, 0, 0);
  QCOMPARE(roots.numberOfRoots, 1);
  QCOMPARE(roots.x[0], 0.0);

  roots = a.quadraticEquation(1, 0, -1);
  QCOMPARE(roots.numberOfRoots, 2);
  QCOMPARE(roots.x[0], 1.0);
  QCOMPARE(roots.x[1], -1.0);

  roots = a.quadraticEquation(1, 0, 1);
  QCOMPARE(roots.numberOfRoots, 0);

  roots = a.quadraticEquation(0, 1, 1);
  QCOMPARE(roots.numberOfRoots, 1);
  QCOMPARE(roots.x[0], -1.0);

  roots = a.quadraticEquation(0, 0, 1);
  QCOMPARE(roots.numberOfRoots, 0);

  roots = a.quadraticEquation(0, 2, 1);
  QCOMPARE(roots.numberOfRoots, 1);
  QCOMPARE(roots.x[0], -0.5);
  QCOMPARE(a.calc(0, 2, 1, roots.x[0]), 0.0);

  // 0*x*x + 0*x + 0 = 0
  try {
    a.quadraticEquation(0, 0, 0);
    QFAIL("Exception expected!");
  } catch(QString q) {
    QCOMPARE( q, QString("Бесконечное число решений"));
  }

Число в строку alltests.cpp

Класс, который содержит тесты Тестирование вычисления максимума Новый тест для вычисления факториала Тест для квадратного уравнения Число в строку до 100 Число в строку от 100 до 199 Число в строку от 200 до 999 Число в строку от 1000 до 999999 Тестирование функции суммирования alltests.h

Сумма: a + b Факториал Численное интегрирование Метод трапеций

functions.cpp

Сумма: a + b = c Факториал function - указатель на функцию возвращающую 1 Численное интегрирование Метод трапеций functions.h

Константная функция Константная функция y = x 0..1 -> 0.5 y = x^2 x^3/3 0..1 -> 1/3 integraltest.cpp

Тестирование интегрирования константной функции integraltest.h

#define DEBUG1 Число в строку Обрезаем лишние пробелы в начале и конце Первая буква в верхнем регистре inttostr.cpp

Модуль с функцией для тестирования Целое число N в строку inttostr.h

Подключаем модульные тесты Вывод числа в строку Выведем все числа в файл (чтобы посмотреть на них вручную) freopen("testing.txt", "w", stdout); QTest::qExec(new SimpleTests()); QTest::qExec(new AllTests, argc, argv); writeNumbersToFile(); main.cpp

return 10; myclass.cpp

Тестируемый класс Вычисление максимума Вычисление минимума myclass.h

И QCOMPARE(2 * 2 + 1, 4); simpletests.cpp

Вызывается при инициализации всех тестов simpletests.h

Генерируем исключение Нет решений Линейное уравнение Квадратное уравнение squareeq.cpp

Корни квадратного уравнения Решение квадратного уравнения squareeq.h

About

Qt использование QtTest вместе с travis-ci.org

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published