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"