QTest с QtCreator, кнопка запускает все тесты серого цвета - PullRequest
2 голосов
/ 27 апреля 2020

Я начал проект с использованием Qt. Я хочу добавить несколько тестов в этот проект. Я хочу разделить тесты по разным категориям.

  1. Тесты для экспорта данных
  2. Тесты для вычисления данных
  3. Тесты для манипулирования данными ...

Для этого я создал этот простой .pro файл:

QT += testlib
QT += gui
CONFIG += qt warn_on depend_includepath testcase

TEMPLATE = app

SOURCES +=  \
    export_test/tst_export_all_log.cpp \
    export_test/tst_export_last_log.cpp \
    main.cpp

HEADERS += \
    TestSuite.h \
    export_test/ExportTest.h

Вот соответствующий основной файл Это простой основной файл, который выполняет функцию QTest::qExec во всех тестах. Категории могут быть включенным или отключенным благодаря DEFINE переменной

#include <QtTest>

#include "export_test/ExportTest.h"

#define EXPORT_TEST 1

int main(int argc, char *argv[]) {
    int status = 0;

    auto runTests = [&](const auto &tests) {
        for (auto test : tests) {
            status |= QTest::qExec(test, argc, argv);
        }
    };

#if EXPORT_TEST
    runTests(ExportTest::suite());
#endif
    return status;
}

Вот класс ExportTest. Идея состоит в том, чтобы создать объект * stati c, который автоматически регистрируется внутри вектора, статически инициализированного в методе suite().

#pragma once

#include <QObject>

template <typename T>
class TestSuite : public QObject {
  public:
    TestSuite() { suite().push_back(this); }

    static std::vector<QObject *> &suite() {
        static std::vector<QObject *> vector;
        return vector;
    }
};


class ExportTest : public TestSuite<ExportTest> {
    Q_OBJECT
  public:
    using TestSuite<ExportTest>::TestSuite;
};

Вот "реализация" одного теста

#include <QtTest>
#include <QCoreApplication>

#include "ExportTest.h"

class export_last_log : public ExportTest {
    Q_OBJECT

  public:
  private slots:

    void test_case1();
};

void export_last_log::test_case1() { QCOMPARE(1, 2); }

#include "tst_export_last_log.moc"

static export_last_log export_last_log;

Кажется, все работает, когда я запускаю его, я получаю следующее:

********* Start testing of export_all_log *********
Config: Using QtTest library 5.9.9, Qt 5.9.9 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.3.1 20160406 (Red Hat 5.3.1-6))
PASS   : export_all_log::initTestCase()
PASS   : export_all_log::test_case1()
PASS   : export_all_log::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted, 0ms
********* Finished testing of export_all_log *********
********* Start testing of export_last_log *********
Config: Using QtTest library 5.9.9, Qt 5.9.9 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.3.1 20160406 (Red Hat 5.3.1-6))
PASS   : export_last_log::initTestCase()
FAIL!  : export_last_log::test_case1() Compared values are not the same
   Actual   (1): 1
   Expected (2): 2
   Loc: [../../src/core_tests/export_test/tst_export_last_log.cpp(15)]
PASS   : export_last_log::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped, 0 blacklisted, 0ms
********* Finished testing of export_last_log *********

Однако невозможно запустить тесты на вкладке "8. Результаты теста" QtCreator. Все кнопки выделены серым цветом. Невозможно легко определить, какой тест провалился, представление пустое.

Может быть, я не совсем понял, как мы можем провести тестирование с помощью Qt? Или, может быть, я забыл что-то сделать в файле .pro, чтобы заставить QtCreator распознавать его как тесты?

...