1

I am currently testing a Qt application. I have to build a test to check the correct input and output of csv files.

Problem:

The data is being read asynchronously and my test program is ending before the data is loaded and this is the output i get.

QFATAL: Received signal 11
FAIL! : Received a fatal error

Program flow:

There is a class AsyncLoader that loads the data. After the data read is finished, it emits a completed() signal.

So, I modified the test program to include an QEventLoop. The code is shown below

#pragma once

#include <QEventLoop>
#include <QSignalSpy>
#include "asyncloader.h"
#include "alphaevent.h"
#include "mainwindow.h"
#include <QtTest/QtTest>

class Test1: public QObject
{
    Q_OBJECT

private slots:
    void initTestCase();
    void mainWindowTester();
    void cleanupTestCase();
};

void Test1::initTestCase()
{
  qDebug()<<"hello";
}

void Test1::mainWindowTester()
{    
  AlphaEvent *fs1 = new AlphaEvent(this);

  fs1->setOperation(AlphaEvent::FileOpen);
  fs1->setPath(QString("/home/user/PC5.csv"));

  MainWindow *mw1 = new MainWindow();    

  QEventLoop loop;
  loop.connect(mw1, SIGNAL(completed(FileEvent*)), SLOT(quit()));
  mw1->dataSetIORequest(fs1);
  loop.exec();

  int pqr = mw1->_package->dataSet->rowCount();
  int pqr1 = mw1->_package->dataSet->columnCount();

  qDebug() << "pqr== "<< pqr;
  qDebug() << "-----------------------------------------------";
  QVERIFY(pqr==5);

void Test1::cleanupTestCase()
{
}    

QTEST_MAIN(Test1)
#include "test1.moc"

But with this, I get a "subprocess error: FailedToStart"

Is there a way to test an asynchronous unit?

I am using Qt version 5.4.2, QMake version 3.0

4

1 に答える 1

1

「非同期ユニットをテストする方法はありますか?」というあなたの質問に答えようとします。あるフレームワークや別のフレームワークでそれを行う方法についてヒントを与えるのではなく。

要点は、単体テストでは通常、開発システムで実行しているかターゲット システムで実行しているかに関係なく、決定論的な結果を生成するテストを目指しているということです。つまり、テストに対するタスク切り替えの影響を排除しようとします。(確かに、他の種類のテストも必要ですが、その場合は統合テストの領域にあり、非決定論的なテスト結果の領域にあります)。

単体テストでコードをスケジューラから分離するには、次のアプローチのいくつかを使用する可能性があります。

  • 同期からロジックを分離します。たとえば、関数の途中に同期ポイントがある場合、同期ポイントの前後のコードを別の関数に抽出し、これらの関数を別々にテストできます。

  • 同期機能を 2 倍にします。たとえば、mutex_lock 関数のスタブまたはモックを作成できます。double が呼び出されるたびに、その間に並列スレッドが行った可能性のある変更をシミュレートすることができます。

多くの優れた側面とリンクがここにあります:スレッド化されたコードを単体テストするにはどうすればよいですか?

于 2016-02-19T20:14:07.783 に答える