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"}]
Now, the developer can easily use it in a test. The best way is to add this data in a variable or a separated js file (cf https://doc.qt.io/qt-6/qtqml-documents-networktransparency.html). And use it in a test e.g.:
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"