Herramientas de ensayo Qt y QML

CML

qml_tests lanza todas las pruebas relacionadas con la interfaz. El daemon y libclient DEBERÍAN ser confiables en esta parte, no queremos probar escenarios relacionados con la conectividad. Idealmente, deberíamos trabajar con datos ficticios para evitar depender de eventos de red. Esto puede ser difícil a veces y algunas herramientas pueden faltar porque las pruebas en esta parte están en progreso. Aquí hay algunas herramientas/principios para poder escribir pruebas rápidamente.

Datos ficticios

Digamos que quiero probar la interfaz de usuario para un AccountComboBox dependiendo de una lista de cuentas. En lugar de crear cuentas, deberíamos crear una lista falsa. La forma fácil de hacer esto es serializar/deserializar un modelo real de AccountComboBox. Primero, necesitamos obtener un 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 el desarrollador haga clic en el combobox. 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, el desarrollador puede usarlo fácilmente en una prueba. La mejor manera es agregar estos datos en una variable o un archivo js separado (cf https://doc.qt.io/qt-6/qtqml-documents-networktransparency.html). Y usarlo en una prueba, por ejemplo:

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++

Prueba de Google

El marco de pruebas de Google en C++.

Instalación

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

CML

QtQuickTest

Instalación

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

  • Ejemplo principal.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"