48 votes

Quel framework de tests unitaires dois-je utiliser pour Qt?

Je suis juste de commencer un nouveau projet qui a besoin de quelques cross-platform GUI, et nous avons choisi Qt comme le GUI-cadre.

Nous avons besoin d'une unité de cadre de tests, aussi. Jusqu'à il ya un an, nous avons utilisé une " maison de l'unité de cadre de tests en C++-projets, mais nous sommes maintenant à la transition à l'aide de Google de Test pour les nouveaux projets.

Quelqu'un a une expérience avec l'aide de Google de Test de Qt-applications? Est QtTest/QTestLib une meilleure alternative?

Je ne sais pas encore combien nous voulons utiliser Qt dans le non-GUI parties du projet - nous préféreraient probablement juste de l'utilisation de la STL/Boost dans la base de code avec une petite interface basée sur Qt GUI.

EDIT: Il semble que de nombreux tendant vers le QtTest. Est-ce que quelqu'un qui a une expérience de l'intégration avec un serveur d'intégration continue? Aussi, il me semble que d'avoir à gérer une demande distincte pour chaque nouveau cas de test serait causer beaucoup de friction. Est-il une bonne façon de résoudre ce problème? N'Qt Creator ont une bonne façon de manipuler ce genre de cas de test ou auriez-vous besoin d'avoir un projet par cas de test?

38voto

Joe Points 296

Vous n'êtes pas obligé de créer des applications de test séparées. Utilisez simplement qExec dans une fonction main () indépendante similaire à celle-ci:

 int main(int argc, char *argv[])
{
    TestClass1 test1;
    QTest::qExec(&test1, argc, argv);

    TestClass2 test2;
    QTest::qExec(&test2, argc, argv);

    // ...

    return 0;
}
 

Ceci exécutera toutes les méthodes de test dans chaque classe en un seul lot.

Vos fichiers .cl de testclass ressemblent à ceci:

 class TestClass1 : public QObject
{
Q_OBJECT

private slots:
    void testMethod1();
    // ...
}
 

Malheureusement, cette configuration n’est pas vraiment décrite dans la documentation de Qt, bien qu’elle puisse sembler très utile pour beaucoup de gens.

20voto

SSJ_GZ Points 466

J'ai commencé à l'aide de QtTest pour mon application, et très, très rapidement commencé à courir dans les limites de celui-ci. Les deux problèmes principaux ont été:

1) Mes tests courir très vite suffisamment rapidement que la surcharge de chargement d'un fichier exécutable, l'établissement d'un Q(Core)de l'Application (si nécessaire) etc souvent des nains le temps d'exécution des tests eux-mêmes! Relier chaque exécutable prend beaucoup de temps, trop.

La surcharge simplement cessé d'augmenter alors que de plus en plus de classes ont été ajoutées, et il est rapidement devenu un problème - l'un des objectifs de tests unitaires sont d'avoir un filet de sécurité qui court tellement vite qu'il n'est pas un fardeau à tous, et c'était rapidement en train de devenir n'est pas le cas. La solution est de glob plusieurs suites de test dans un exécutable, et tout (comme indiqué ci-dessus), c'est surtout faire-mesure, il n'est pas pris en charge et a d'importantes limites.

2) Pas de gabarit de soutien - un deal-breaker pour moi.

Ainsi, après un certain temps, je suis passé à Google d'Essai - il est beaucoup plus plein de fonctionnalités et sophistiqué framework de test unitaire (en particulier lorsqu'il est utilisé avec Google Maquette) et résout les 1) et 2), et en plus, vous pouvez facilement utiliser la pratique QTestLib des fonctionnalités telles que QSignalSpy et la simulation de l'interface graphique d'événements, etc. C'était un peu d'une douleur à l'interrupteur, mais heureusement, le projet n'a pas avancé trop loin et que de nombreuses modifications peuvent être automatisées.

Personnellement, je ne vais pas utiliser QtTest sur Google Test pour de futurs projets - si offre pas de réels avantages que je peux voir, et elle a d'importants inconvénients.

19voto

mlvljr Points 1281

Joindre à la réponse de Joe.

Voici un petit en-tête que j'utilise (testrunner.h), contenant une classe d'utilitaires générant une boucle d'événement (nécessaire, par exemple, pour tester les connexions d'emplacement de signal et les bases de données en file d'attente) et "exécutant" des classes compatibles QTest:

 #ifndef TESTRUNNER_H
#define TESTRUNNER_H

#include <QList>
#include <QTimer>
#include <QCoreApplication>
#include <QtTest>

class TestRunner: public QObject
{
    Q_OBJECT

public:
    TestRunner()
        : m_overallResult(0)
    {}

    void addTest(QObject * test) {
        test->setParent(this);
        m_tests.append(test);
    }

    bool runTests() {
        int argc =0;
        char * argv[] = {0};
        QCoreApplication app(argc, argv);
        QTimer::singleShot(0, this, SLOT(run()) );
        app.exec();

        return m_overallResult == 0;
    }
private slots:
    void run() {
        doRunTests();
        QApplication::instance()->quit();
    }
private:
    void doRunTests() {
        foreach (QObject * test, m_tests) {
            m_overallResult|= QTest::qExec(test);
        }
    }

    QList<QObject *> m_tests;
    int m_overallResult;
};

#endif // TESTRUNNER_H
 

Utilisez-le comme ceci:

 #include "testrunner.h"
#include "..." // header for your QTest compatible class here

#include <QDebug>

int main() {
    TestRunner testRunner;
    testRunner.addTest(new ...()); //your QTest compatible class here

    qDebug() << "Overall result: " << (testRunner.runTests()?"PASS":"FAIL");

    return 0;
}
 

18voto

Matt Rogers Points 1467

Je ne sais pas qui QTestLib est "mieux" qu'un cadre pour l'autre dans ces conditions générales. Il y a une chose qu'il fait bien, et qui est fournir un bon moyen de tester Qt en fonction des applications.

Vous pourriez intégrer QTest dans votre nouveau Google Test en fonction de l'installation. Je n'ai pas essayé, mais basé sur la façon dont QTestLib est architecturé, il semble que cela ne devrait pas être trop compliqué.

Tests écrits avec de la pure QTestLib ont une option-xml que vous pourriez utiliser, avec quelques transformations XSLT pour convertir le format d'un serveur d'intégration continue. Cependant, beaucoup de ce qui dépend de qui serveur CI vous aller avec. J'imagine que la même chose s'applique à GTest.

Une seule application de test par cas de test a jamais causé beaucoup de frottement pour moi, mais qui dépend de l'existence d'un système de construction qui permettrait de faire un travail décent de gérer le bâtiment et l'exécution des cas de test.

Je ne sais pas de quoi que ce soit dans Qt Creator qui nécessiterait un autre projet par cas de test, mais il pourrait avoir changé depuis la dernière fois que j'ai regardé Qt Creator.

Je vous suggère aussi de coller avec QtCore et de rester loin de la STL. À l'aide de QtCore tout au long de sera faire face avec la GUI bits qui nécessitent l'intervalle Qt types de données plus facile. Vous n'aurez pas à vous soucier de la conversion d'un type de données à un autre dans ce cas.

6voto

Patrice Bernassola Points 7422

Pourquoi ne pas utiliser le framework de tests unitaires inclus dans Qt? Un exemple: Tutoriel QtTestLib .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X