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"