Qt test, как остановить выполнение при выдаче сигнала

В настоящее время я тестирую приложение Qt. Я должен построить тест, чтобы проверить правильность ввода и вывода CSV-файлов.

Проблема:

Данные читаются асинхронно, и моя тестовая программа завершается до того, как данные загружаются, и это вывод, который я получаю.

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

Поток программы:

Есть класс AsyncLoader, который загружает данные. После того, как чтение данных закончено, он посылает сигнал complete ().

Итак, я изменил тестовую программу, чтобы включить 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"

Но с этим я получаю «ошибку подпроцесса: Не смог начать«

Есть ли способ проверить асинхронный модуль?

Я использую Qt версии 5.4.2, QMake версии 3.0

1

Решение

Я пытаюсь ответить на ваш вопрос «Есть ли способ проверить асинхронный модуль?» вместо того, чтобы давать подсказки о том, как сделать это в той или иной структуре.

Дело в том, что в модульном тестировании вы обычно стремитесь к тестам, которые дают детерминированные результаты, независимо от того, выполняете ли вы их в системе разработки или в целевой системе. То есть вы пытаетесь исключить влияние переключения задач на ваши тесты. (Конечно, вы также хотите иметь другие виды тестов, но тогда вы находитесь в области интеграционных тестов и в области недетерминированных результатов тестов).

Чтобы отделить свой код от планировщика в модульном тестировании, вы, вероятно, будете использовать некоторые из следующих подходов:

  • Отделите логику от синхронизации. Например, если у вас есть точка синхронизации в середине функции, вы можете извлечь код до и после точки синхронизации в отдельных функциях и протестировать эти функции отдельно.

  • Удвойте функции синхронизации. Например, вы можете создать заглушки или макеты для функции mutex_lock. Каждый раз, когда вызывается ваш double, вы можете сделать так, чтобы он имитировал изменения, которые параллельный поток мог бы сделать за это время.

Много хороших аспектов и ссылок можно найти здесь: Как мне выполнить модульное тестирование многопоточного кода?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]