Qt测试如何在发出信号时停止执行
Qt test how to stop execution when a signal is emitted
我目前正在测试 Qt 应用程序。我必须构建一个测试来检查 csv 文件的正确输入和输出。
问题:
正在异步读取数据,我的测试程序在加载数据之前结束,这是我得到的输出。
QFATAL: Received signal 11
FAIL! : Received a fatal error
程序流程:
有一个 class 加载数据的 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"
但是有了这个,我得到了 "subprocess error: FailedToStart"
有没有办法测试异步单元?
我使用的是 Qt 5.4.2 版,QMake 3.0 版
我尝试回答您的问题 'Is there a way to test an asynchronous unit?' 而不是给出有关如何在一个或另一个框架中执行此操作的提示。
关键是,在单元测试中,您通常针对的是产生确定性结果的测试,而与您 运行 它们是在开发系统还是目标系统上无关。也就是说,您尝试消除任务切换对测试的影响。 (当然,你也想有其他类型的测试,但你在集成测试领域,在非确定性测试结果的领域)。
要在单元测试中将您的代码与调度程序分开,您可能会使用以下一些方法:
将逻辑与同步分开。例如,如果您在函数中间有一个同步点,则可以将同步点前后的代码提取到单独的函数中,并分别测试这些函数。
双倍同步功能。例如,您可以为 mutex_lock 函数创建存根或模拟。每当你的双打被调用时,你就可以让它模拟并行线程可能同时完成的更改。
许多好的方面和链接可以在这里找到:How should I unit test threaded code?
我目前正在测试 Qt 应用程序。我必须构建一个测试来检查 csv 文件的正确输入和输出。
问题:
正在异步读取数据,我的测试程序在加载数据之前结束,这是我得到的输出。
QFATAL: Received signal 11
FAIL! : Received a fatal error
程序流程:
有一个 class 加载数据的 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"
但是有了这个,我得到了 "subprocess error: FailedToStart"
有没有办法测试异步单元?
我使用的是 Qt 5.4.2 版,QMake 3.0 版
我尝试回答您的问题 'Is there a way to test an asynchronous unit?' 而不是给出有关如何在一个或另一个框架中执行此操作的提示。
关键是,在单元测试中,您通常针对的是产生确定性结果的测试,而与您 运行 它们是在开发系统还是目标系统上无关。也就是说,您尝试消除任务切换对测试的影响。 (当然,你也想有其他类型的测试,但你在集成测试领域,在非确定性测试结果的领域)。
要在单元测试中将您的代码与调度程序分开,您可能会使用以下一些方法:
将逻辑与同步分开。例如,如果您在函数中间有一个同步点,则可以将同步点前后的代码提取到单独的函数中,并分别测试这些函数。
双倍同步功能。例如,您可以为 mutex_lock 函数创建存根或模拟。每当你的双打被调用时,你就可以让它模拟并行线程可能同时完成的更改。
许多好的方面和链接可以在这里找到:How should I unit test threaded code?