【问题标题】:Qt test how to stop execution when a signal is emittedQt测试如何在发出信号时停止执行
【发布时间】:2016-02-19 15:52:26
【问题描述】:

我目前正在测试一个 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 版

【问题讨论】:

  • 你会考虑使用像 gtest 这样的单元测试框架吗?
  • @gda2004,我之前没有尝试将 google-test 与 qt-application 一起使用。如果这不起作用,会试一试
  • @askshrajkn 我目前正在将 gtest 与 qt 框架一起使用,您只需重构代码,以便插槽是对函数或方法的最小调用。然后您可以使用 gtest 编写测试。它可能会帮助您找出问题所在。
  • @gda2004 你能给我一些资源或例子吗?需要这个插件(github.com/OneMoreGres/qtc-gtest)吗? [我是单元测试新手,请多多包涵]
  • @askshrajkn ibm.com/developerworks/aix/library/… 。我只是将参数转发给一个函数,以便我可以从 gtest 中注入它们

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


【解决方案1】:

我尝试回答您的问题“有没有办法测试异步单元?”而不是提示如何在一个或另一个框架中做到这一点。

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

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

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

  • 双倍同步功能。例如,您可以为 mutex_lock 函数创建存根或模拟。每当您的 double 被调用时,您就可以让它模拟并行线程在此期间可能所做的更改。

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

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 2014-11-25
    • 2012-02-19
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多