2

私のプロジェクトには、QtTest フレームワークで行った単体テストがいくつかあります。これはコンソール アプリケーションであり、実際には QtTest 以外に Qt から何も使用していません。

私のコンピューターでは正常に動作しますが、Travis で継続的インテグレーションをセットアップすると、次のようになります。

lib_testapp: cannot connect to X server 

別のスレッドで見たようにアプリを実行しようとし-platform offscreenましたが、何も変わらないようです。

.pro には次の行があります。

TEMPLATE = app
CONFIG  += console c++11
QT      += testlib

main.cppはこのように見えます:

class WatermarkingTests: public QObject
{
    Q_OBJECT
private slots:
void initTestCase() { }
void test1() { someTest(); }
void cleanupTestCase() { }
};

QTEST_MAIN(WatermarkingTests)
#include "main.moc"

someTest()への呼び出しを行う純粋な数学関数QVERIFYです。ありがとう!

4

1 に答える 1

2

あなたの問題は次の行です:

QTEST_MAIN(WatermarkingTests)

ドキュメントから:

QTEST_MAIN (テストクラス)

アプリケーション オブジェクトと TestClass をインスタンス化する main() 関数を実装し、定義された順序ですべてのテストを実行します。このマクロを使用して、スタンドアロンの実行可能ファイルをビルドします。

QT_GUI_LIB が定義されている場合、アプリケーション オブジェクトは QApplication になり、それ以外の場合は QCoreApplication になります。qmake が使用され、構成に QT += gui が含まれている場合、QT_GUI_LIB が自動的に定義されます。

QTつまり、変数にはデフォルトでコアと gui が含まれているため、QCoreApplication ではなく QApplication を取得します。これを回避するには、次のステートメントを使用する必要があります。

QT = core testlib

Qt 5 では、代わりに次のマクロのみを使用できることに注意してください。

QTEST_GUILESS_MAIN( テストクラス)

QCoreApplication オブジェクトと TestClass をインスタンス化する main() 関数を実装し、定義された順序ですべてのテストを実行します。このマクロを使用して、スタンドアロンの実行可能ファイルをビルドします。

QTEST_MAIN() のように動作しますが、QApplication オブジェクトの代わりに QCoreApplication をインスタンス化します。テスト ケースが QApplication によって提供される機能を必要としない場合、このマクロを使用しますが、イベント ループは依然として必要です。

この関数は Qt 5.0 で導入されました。

于 2014-01-01T21:03:02.820 に答える