Qt测试如何在发出信号时停止执行

时间:2016-02-19 15:52:26

标签: c++ qt unit-testing qtestlib qttest

我目前正在测试Qt应用程序。我必须构建一个测试来检查csv文件的正确输入和输出。

问题:

正在异步读取数据,我的测试程序在数据加载之前结束,这是我得到的输出。

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

计划流程:

有一个AsyncLoader类可以加载数据。数据读取完成后,它会发出一个completed()信号。

因此,我修改了测试程序以包含QEventLoop。代码如下所示

#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"

但是有了这个,我得到了一个“子流程错误:FailedToStart

有没有办法测试异步单元?

我正在使用Qt版本5.4.2,QMake版本3.0

1 个答案:

答案 0 :(得分:1)

我试着回答你的问题'有没有办法测试异步单元?'而不是提供关于如何在一个框架或另一个框架中执行此操作的提示。

关键是,在单元测试中,您通常的目标是产生确定性结果的测试,而不管您是在开发系统还是目标系统上运行它们。也就是说,您尝试消除任务切换对测试的影响。 (当然,你也希望进行其他类型的测试,但是你处于集成测试领域,并且在非确定性测试结果领域)。

要在单元测试中将代码与调度程序分开,您可能会使用以下某些方法:

  • 将逻辑与同步分开。例如,如果在函数中间有一个同步点,则可以在单独的函数中提取同步点之前和之后的代码,并分别测试这些函数。

  • 将同步功能加倍。例如,您可以为mutex_lock函数创建存根或模拟。无论何时调用double,您都可以使它模拟并行线程可能在此期间所做的更改。

可以在此处找到许多好的方面和链接:How should I unit test threaded code?