@cjhuittによって投稿された回答に関連する
これは、各テストオブジェクトを手動で呼び出す必要がない例です。
私はこのようなことを避けようとします:
MyTestClass1 t1; t1.run();
MyTestClass2 t2; t2.run();
//etc...
私の解決策は、静的リストに自分自身を追加する基本クラスからテストオブジェクトを継承させることです
。メインプログラムは、そのリスト内のすべてのテストオブジェクトを実行します。このようにして、サポートするフレームワークコードを変更する必要はありません。変更されるのは、テストクラス自体だけです。
これが私がそれをする方法です:
qtestsuite.h-テストオブジェクトの基本クラス
#ifndef QTESTSUITE_H
#define QTESTSUITE_H
#include <QObject>
#include <vector>
class QTestSuite : public QObject
{
Q_OBJECT
public:
static std::vector<QObject*> m_suites;
public:
explicit QTestSuite();
};
#endif // QTESTSUITE_H
qtestsuite.cpp
#include "qtestsuite.h"
#include <iostream>
std::vector<QObject*> QTestSuite::m_suites;
QTestSuite::QTestSuite() : QObject()
{
m_suites.push_back(this);
}
testall.cpp-テストを実行します
#include "qtestsuite.h"
#include <QtTest/QtTest>
#include <iostream>
int main(int, char**)
{
int failedSuitesCount = 0;
std::vector<QObject*>::iterator iSuite;
for (iSuite = QTestSuite::m_suites.begin(); iSuite != QTestSuite::m_suites.end(); iSuite++)
{
int result = QTest::qExec(*iSuite);
if (result != 0)
{
failedSuitesCount++;
}
}
return failedSuitesCount;
}
mytestsuite1.cpp-サンプルテストオブジェクト、これらをさらに作成します
#include "qtestsuite.h"
#include <QtTest/QtTest>
class MyTestSuite1: public QTestSuite
{
Q_OBJECT
private slots:
void aTestFunction();
void anotherTestFunction();
};
void MyTestSuite1::aTestFunction()
{
QString str = "Hello";
QVERIFY(str.toUpper() == "this will fail");
}
void MyTestSuite1::anotherTestFunction()
{
QString str = "Goodbye";
QVERIFY(str.toUpper() == "GOODBYE");
}
static MyTestSuite1 instance; //This is where this particular test is instantiated, and thus added to the static list of test suites
#include "mytestsuite1.moc"
また、.proファイルを作成するには
qmake -project "CONFIG += qtestlib"