Herramientas de ensayo Qt y QML

QML tests

qml_tests lanza todas las pruebas relacionadas con la interfaz. El demonio y libclient DEBEN ser confiables en esta parte; por lo tanto, no se requieren escenarios de prueba de conectividad. Idealmente, se deben usar datos simulados para evitar depender de eventos de red. Esto puede ser difícil a veces, y es posible que se pierdan algunas herramientas porque las pruebas en esta parte son un trabajo en progreso. Aquí hay algunas herramientas y principios para permitir que las pruebas se escriban rápidamente.

Datos simulados

Digamos que se requiere una prueba de IU para AccountComboBox según una lista de cuentas. En lugar de crear cuentas reales, se debe crear una lista simulada de cuentas. La forma más sencilla de hacerlo es serializar/deserializar un ComboBoxmodel de cuenta real. Primero, se requiere el modelo serializado:

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() imprimirá la estructura serializada cada vez que se haga clic en el cuadro combinado. Aquí está el resultado:

[{"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"}]

Ahora, esto se puede usar fácilmente en una prueba. La mejor manera es agregar estos datos a una variable o a un archivo js separado (cf. https://doc.qt.io/qt-6/qtqml-documents-networktransparency.html). Un ejemplo del uso de los datos en una prueba:

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)
            }
        }
    }
}

Pruebas

GoogleTest

GoogleTest es el marco de prueba y simulación de C++ de Google.

GoogleTest installation

  • Ubuntu / Debian: apt instalar el test de libgtest-dev

Ejemplo principal.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
}

QtQuickTest

QtQuickTest integrates QML testing.

QtQuickTest installation

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

Example 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"