Lazygeek Lazygeek
Title

📝 Issu du tutoriel Qt

Préparation

  • Dans le fichier .pro :
    • ajouter la ligne QT += testlib
    • Si tests unitaires du GUI, ajouter QT += widgets
  • Ajouter les includes
    • #include <QtTest>
  • CrĂ©er une classe de test
    • hĂ©ritĂ©e de QObject
    • avec la macro Q_OBJECT
    • chaque mĂ©thode de test doit ĂŞtre dĂ©finie en tant que private slot
  • remplace le main par QTEST_MAIN(nom_classe_test)
    • ou QTEST_APPLESS_MAIN si pas besoin de l’IHM
  • Si la dĂ©claration et la dĂ©finition sont rassemblĂ©es dans un fichier cpp unique, ajouter la ligne #include "nomFichierClasse.moc"

Tests unitaires non graphiques

Tests simples

  • VĂ©rifier une assertion: QVERIFY(assertion);
    • exemple: QVERIFY(maChaine.length() == 3);
  • Comparer 2 objets: QCOMPARE(obj1, obj2);
    • exemple: QCOMPARE(maChaine.length(), 3);

Tests en lot

  • une mĂ©thode qui rĂ©alise le test et une qui initialise les data utilisĂ©es pour le test
    • test: MaClasse::nomTestCase()
    • data: MaClasse::nomTestCase_data()
  • Dans la mĂ©thode _data:
    • Initialiser un tableau qui contient toutes les donnĂ©es utiles pour le test. CrĂ©er toutes les colonnes nĂ©cessaire. Par exemple, 2 attributs et 1 rĂ©sultat attendu.
      • QTest::addColumn<type1>(nomAttribut1);
      • QTest::addColumn<type2>(nomAttribut2);
      • QTest::addColumn<typeResult>(nomResultat);
    • Remplir ce tableau. 1 ligne par cas de test. Chaque ligne est identifiĂ©e par le nom du cas de test
      • QTest::newRow("nomCasTest") << attribut1 << attribut2 << resultat;
      • Le nombre d’élĂ©ments doit correspondre au nombre de colonnes dĂ©clarĂ©es
  • Dans la mĂ©thode de test:
    • RĂ©cupĂ©rer les Ă©lĂ©ments nĂ©cessaires avec la directive QFETCH
      • QFETCH(type, nomColonne);
    • ExĂ©cuter les comparaisons pour le test
      • QCOMPARE(objet.methodeATester(nomAttribut1, nomAttribut2), nomResultat);
    • Qt exĂ©cute la comparaison pour toutes les lignes du tableau

Exemple

void Test::testCase_data()
{
    QTest::addColumn<QString>("chaine");        // Déclaration des colonnes du tableau
    QTest::addColumn<int>("longueur");

    QTest::addRow("longueur 5") << "Hello" << 5;        // Ajout d'un 1er cas
    QTest::addRow("longueur 13") << "Hello World !" << 13;       // Ajout d'un 2nd cas
}

void Test::testCase()
{
    QFETCH(QString, chaine);      // récupération des colonnes du tableau
    QFETCH(int, longueur);

    QCOMPARE(chaine.length(), longueur);      // le test est effectué pour toutes les lignes du tableau
}

Tests unitaires de l’IHM

Tests simples

  • La classe QTest contient des mĂ©thodes statiques pour simuler des actions utilisateur. Utiliser ces mĂ©thodes pour simuler des actions sur le widget Ă  tester
    • QTest::keyClick(&widget, key)
    • QTest::keyClicks(&widget, keySequence)
    • QTest::mouseClick
    • etc.
  • RĂ©cupĂ©rer un attribut du widget et le comparer Ă  l’attendu (avec QCOMPARE ou QVERIFY)

Tests en lot

  • une mĂ©thode qui rĂ©alise le test et une qui initialise les data utilisĂ©es pour le test
    • test: MaClasse::nomTestCase()
    • data: MaClasse::nomTestCase_data()
  • Dans la mĂ©thode _data:
    • Initialiser un tableau qui contient toutes les donnĂ©es utiles pour le test. Une de ces colonnes pourra contenir des valeurs du type QTestEventList. Cette classe sert Ă  crĂ©er des listes d’évènements utilisateur simulĂ©s.
      • QTest::addColumn<QTestEventList>(evenements);
    • Remplir ce tableau. 1 ligne par cas de test.
QTestEventList maListe;
maListe.addKeyClick('a');
maListe.addKeyClick(Qt::Key_Backspace);
QTest::newRow(''cas1'') << maListe << ''resultat'';
  • Dans la mĂ©thode de test:
    • RĂ©cupĂ©rer les Ă©lĂ©ments nĂ©cessaires avec la directive QFETCH
      • QFETCH(QTestEventList, evenements);
    • Simuler actions sur le widget
      • evenements.simulate(&widget);
    • ExĂ©cuter les comparaisons pour le test avec QCOMPARE ou QVERIFY
    • Qt effectue les sĂ©quences d’évĂ©nements et les comparaisons pour toutes les lignes du tableau

Benchmark

Permet de mesurer la durée d’exécution d’une ou plusieurs instructions

QBENCHMARK {
    liste des instruction Ă  benchmarker
}