В настоящее время я тестирую приложение 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
Я пытаюсь ответить на ваш вопрос «Есть ли способ проверить асинхронный модуль?» вместо того, чтобы давать подсказки о том, как сделать это в той или иной структуре.
Дело в том, что в модульном тестировании вы обычно стремитесь к тестам, которые дают детерминированные результаты, независимо от того, выполняете ли вы их в системе разработки или в целевой системе. То есть вы пытаетесь исключить влияние переключения задач на ваши тесты. (Конечно, вы также хотите иметь другие виды тестов, но тогда вы находитесь в области интеграционных тестов и в области недетерминированных результатов тестов).
Чтобы отделить свой код от планировщика в модульном тестировании, вы, вероятно, будете использовать некоторые из следующих подходов:
Отделите логику от синхронизации. Например, если у вас есть точка синхронизации в середине функции, вы можете извлечь код до и после точки синхронизации в отдельных функциях и протестировать эти функции отдельно.
Удвойте функции синхронизации. Например, вы можете создать заглушки или макеты для функции mutex_lock. Каждый раз, когда вызывается ваш double, вы можете сделать так, чтобы он имитировал изменения, которые параллельный поток мог бы сделать за это время.
Много хороших аспектов и ссылок можно найти здесь: Как мне выполнить модульное тестирование многопоточного кода?
Других решений пока нет …