2016-02-19 6 views
1

В настоящее время я тестирую приложение Qt. Я должен построить тест для проверки правильности ввода и вывода файлов csv.Qt test Как прекратить выполнение при выходе сигнала

Проблема:

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

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

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

Существует класс AsyncLoader, который загружает данные. По завершении чтения данных он выдает завершенный() сигнал.

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

вы бы рассмотреть возможность использования рамок модульного тестирования, как GTEST? – gda2004

+0

@ gda2004, я раньше не пытался использовать google-тест с qt-приложением. Дайте ему шанс, если это не сработает – akashrajkn

+2

@askshrajkn В настоящее время я использую gtest с фреймворком qt, вам просто нужно реорганизовать свой код, чтобы слот был минимальным вызовом функции или метода. Затем вы можете написать тест с использованием gtest. Это может помочь вам изолировать проблему. – gda2004

ответ

1

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

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

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

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

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

Многие хорошие аспекты и ссылки можно найти здесь: How should I unit test threaded code?