すべてのQTest
単体テストを配置し、テストを実行するスタンドアロン テスト アプリケーションをビルドするサブプロジェクトがあります (つまり、Qt Creator 内から実行します)。で実行できる複数のテスト クラスがありqExec()
ます。ただし、複数のテスト クラスを実行する適切な方法がわかりません。
現在、私はこの方法でそれを行っています(MVCE):
tests.pro
QT -= gui
QT += core \
testlib
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
TARGET = testrunner
HEADERS += test_foo.h
SOURCES += main.cpp
main.cpp
#include <QtTest>
#include <QCoreApplication>
#include "test_foo.h"
int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
TestFooClass testFoo;
TestBarClass testBar;
// NOTE THIS LINE IN PARTICULAR.
return QTest::qExec(&testFoo, argc, argv) || QTest::qExec(&testBar, argc, argv);
}
test_foo.h
#include <QtTest>
class TestFooClass: public QObject
{
Q_OBJECT
private slots:
void test_func_foo() {};
};
class TestBarClass: public QObject
{
Q_OBJECT
private slots:
void test_func_bar() {};
};
ただし、ドキュメントにqExec()
は、これは間違った方法であると書かれています。
スタンドアロン テスト アプリケーションの場合、テスト出力をファイルに記録し、個々のテスト関数を実行するためのコマンド ライン オプションが正しく動作しないため、この関数を複数回呼び出すことはできません。
もう 1 つの大きな欠点は、すべてのテスト クラスの単一の概要がなく、個々のクラスについてのみまとめられていることです。これは、それぞれが数十のテストを持つ数十のクラスがある場合に問題になります。すべてのテストに合格したかどうかを確認するには、上にスクロールして、各クラスの合格/不合格のすべての「合計」を確認する必要があります。次に例を示します。
********* Start testing of TestFooClass *********
PASS : TestFooClass::initTestCase()
PASS : TestFooClass::test_func_foo()
PASS : TestFooClass::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestFooClass *********
********* Start testing of TestBarClass *********
PASS : TestBarClass::initTestCase()
PASS : TestBarClass::test_func_bar()
PASS : TestBarClass::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestBarClass *********
テストが失敗した場合、ゼロ以外の値が返されるとドキュメントに記載されていることを考えると、私のqExec() || qExec()
作品にも驚いています。これは、次のすべての呼び出しが発生しないことを意味しますが、そうではないようです。qExec()
qExec()
複数のテストクラスを実行する適切な方法は何ですか? そして、何百もの単体テストに失敗したかどうかを一目で確認できるようにします。