Ferramentas de ensaio Qt e QML

QML

qml_tests lança todos os testes relacionados com a interface. O daemon e a libclient DEVEM ser confiáveis nesta parte, nós não queremos testar cenários relacionados à conetividade. Idealmente, nós deveríamos trabalhar com dados falsos para evitar depender de eventos de rede. Isso pode ser difícil às vezes e algumas ferramentas podem ser perdidas porque os testes nesta parte são um trabalho em andamento. Aqui estão algumas ferramentas / princípios para poder escrever testes rapidamente.

Dados de simulação

Digamos que quero testar a IU para uma AccountComboBox dependendo de uma lista de contas. Em vez de criar contas, devemos criar uma lista falsa. A maneira mais fácil de fazer isso é serializar / deserializar um modelo AccountComboBox real. Primeiro, precisamos obter um 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á a estrutura serializada sempre que o programador clicar na combobox. Aqui está o 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"}]

Agora, o desenvolvedor pode usá-los facilmente em um teste. A melhor maneira é adicionar esses dados em uma variável ou em um arquivo js separado (cf. https://doc.qt.io/qt-6/qtqml-documents-networktransparency.html). E usá-los em um teste, por exemplo:

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

O framework de teste do Google C++.

Instalação

  • Ubuntu / Debian: apt install googletest libgtest-dev

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

QML

QtQuickTest

Instalação

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

  • Exemplo 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"