outils de test Qt et QML

L’équipement

qml_tests lance tous les tests liés à l’interface. Le démon et libclient DEVRAIENT être fiables dans cette partie, nous ne voulons pas tester des scénarios liés à la connectivité. Idéalement, nous devrions travailler sur des données fictives pour éviter de dépendre d’événements réseau. Cela peut être difficile parfois et certains outils peuvent être manqués parce que les tests dans cette partie sont un travail en cours. Voici quelques outils/principes pour pouvoir écrire rapidement des tests.

Mocking Data

Supposons que je veuille tester l’interface utilisateur d’une AccountComboBox en fonction d’une liste de comptes. Au lieu de créer des comptes, nous devrions créer une fausse liste. La façon la plus simple de le faire est de sérialiser/désérialiser un vrai modèle AccountComboBox. Tout d’abord, nous devons obtenir un modèle sérialisé :

diff --git a/src/app/mainview/components/AccountComboBoxPopup.qml b/src/app/mainview/components/AccountComboBoxPopup.qml
index 2f1b633a..0df2594d 100644
--- a/src/app/mainview/components/AccountComboBoxPopup.qml
+++ b/src/app/mainview/components/AccountComboBoxPopup.qml
@@ -43,6 +43,15 @@ Popup {
         color: JamiTheme.transparentColor
     }

+    function saveModel() {
+        var modelData = []
+        for (var i = 0; i < listView.model.count; ++i) {
+            modelData.push(listView.model.get(i))
+        }
+        var json = JSON.stringify(modelData)
+        console.warn(json)
+    }
+
     focus: true
     closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside

@@ -241,6 +250,7 @@ Popup {
                 width: root.width
                 onClicked: {
                     root.close();
+                    root.saveModel();
                     LRCInstance.currentAccountId = ID;
                 }
             }

saveModel() imprimera la structure sérialisée chaque fois que le développeur cliquera sur le combobox. Voici le résultat :

[{"Alias":"AmarOk","ID":"a2d724d18a943e6c","NotificationCount":0,"Status":5,"Type":1,"Username":"amarok"},{"Alias":"Munnin","ID":"8a22b7d0176327db","NotificationCount":0,"Status":5,"Type":1,"Username":"munnin"},{"Alias":"TEST JAMI","ID":"3b7d2b9e2af83a47","NotificationCount":0,"Status":5,"Type":2,"Username":"696"},{"Alias":"Sébastien Blin","ID":"131ad59045a9a146","NotificationCount":0,"Status":5,"Type":1,"Username":"sblin"}]

Maintenant, le développeur peut facilement l’utiliser dans un test. La meilleure façon est d’ajouter ces données dans une variable ou un fichier js séparé (cf https://doc.qt.io/qt-6/qtqml-documents-networktransparency.html). Et de l’utiliser dans un test, par exemple :

TestWrapper {
    AccountComboBoxPopup {
        id: uut

        function loadMockData() {
            return JSON.parse('[\
                {"Alias":"Foo","ID":"a2d724d18a943e6c","NotificationCount":0,"Status":5,"Type":1,"Username":"foo"}, \
                {"Alias":"Bar","ID":"8a22b7d0176327db","NotificationCount":0,"Status":5,"Type":1,"Username":"bar"}, \
                {"Alias":"TEST JAMI","ID":"3b7d2b9e2af83a47","NotificationCount":0,"Status":5,"Type":2,"Username":"696"}, \
                {"Alias":"Whatever","ID":"131ad59045a9a146","NotificationCount":0,"Status":5,"Type":1,"Username":"whatever"}]')
        }

        TestCase {
            name: "Check model size"
            function test_checkModelSize() {
                var accountList = findChild(uut, "accountList")
                accountList.model = uut.loadMockData()
                compare(accountList.model.length, 4)
            }
        }
    }
}

C++

Teste de Google

Le cadre de test de c++ de Google.

Installation

  • Ubuntu / Debian: apt installer le test libgtest-dev

Exemple main.cpp

#include <gtest/gtest.h>

TEST(Test, Test1)
{
    EXPECT_EQ(0, 0); // OK
    EXPECT_EQ(1, 0); // ERROR and continues
    ASSERT_EQ(0, 0); // OK
    ASSERT_EQ(1, 0); // ERROR and stops execution
}

int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();  // Runs Test1 and any other included test
}

L’équipement

QtQuickTest

Installation

  • Ubuntu / Debian: apt installer qml-module-qqtest libqt5quicktest5

  • Exemple main.cpp

#include <QtQuickTest/quicktest.h>
#include <QQmlEngine>

class Setup : public QObject
{
    Q_OBJECT

public:
    Setup() {}

public slots:

    void qmlEngineAvailable(QQmlEngine *engine)
    {
        // Code to be run before the tests
    }
};

QUICK_TEST_MAIN_WITH_SETUP(testqml, Setup)
#include "main.moc"