Wie testet man Formulare?

Alles rund um die Programmierung mit Qt
Antworten
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Wie testet man Formulare?

Beitrag von Seikilos »

Ich hab im Designer was nettes gebastelt, die ui gewrappt, von der ui geerbt meine eigenen Methoden reingepackt und hab ein fertiges Formular mit QLineEdits, Buttons usw...

Aber wie teste ich so etwas? Writing a GUI Test hier http://doc.trolltech.com/4.5/qtestlib-tutorial3.html umschifft das Problem sehr nett in dem es ein einfaches Beispiel mit nem QLineEdit bringt:

Code: Alles auswählen

void TestGui::testGui()
 {
     QLineEdit lineEdit;

     QTest::keyClicks(&lineEdit, "hello world");

     QCOMPARE(lineEdit.text(), QString("hello world"));
 }
Wie soll ich aber ein lineEdit von meiner Form testen?

Beispielsweise habe ich eine Foo.ui Datei im Designer, gewrappt habe ich eine ui_Foo.h und muss von dieser dann erben, um meine Logik zu implementieren:

Code: Alles auswählen

class MeineLogik : public QDialog, private Ui::Foo
{...};
Nun kann ich nicht mehr so etwas schreiben, wie

Code: Alles auswählen

void TestGui::testGui()
 {
     MeineLogik klasse;

     QTest::keyClicks(klasse->lineEdit, "hello world");

     QCOMPARE(klasse->lineEdit.text(), QString("hello world"));
 }
Das ist klar, denn ich erbe ja die Dialogklasse private, was semantisch korrekt ist und kann somit nicht auf die einzelnen Elemente drauf zugreifen.

Wie soll man so etwas testen? Ich kann nicht public erben, das wäre schlechtes Design. Ich kann mir drei mögliche Wege denken, die mir alle äußert problematisch erscheinen.
Was macht ihr in einem solchen Fall? Wie testet ihr Formulare, Dialoge usw?[/quote]
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: Wie testet man Formulare?

Beitrag von pfid »

Seikilos hat geschrieben: Das ist klar, denn ich erbe ja die Dialogklasse private, was semantisch korrekt ist und kann somit nicht auf die einzelnen Elemente drauf zugreifen.
Weiß nicht ob ich dich da richtig verstehe, aber die Member der Designer-UI Klassen sind public. Siehe ui_Foo.h.
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Ja, aber man erbt immer private von der ui Klasse.

Im übrigen scheint findChild die Lösung zu sein
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Jetzt seh ichs auch, hatte dich tatsächlich falsch verstanden ;)
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

So am rande, weißt du, wie ich in QTest ein QMessageBox ansprechen kann, was aus einem dialog mit QMessageBox::warning erzeugt wird?

Muss da aufs OK klicken...
benibela
Beiträge: 17
Registriert: 23. Januar 2009 21:22

Beitrag von benibela »

Das Problem mit der QMessageBox hatte ich auch gerade, nach einigem Probieren habe ich es so gelöst:

Code: Alles auswählen

void QDocumentSearchTest::closeMessageDialog(){
	QWidget* messageWindow = QApplication::activeModalWidget();
	if (!messageWindow) 
		foreach (QWidget *widget, QApplication::topLevelWidgets()) 
			if (widget->isModal())
				messageWindow=widget;
	if (!messageWindow) 
		return; //keyClick crashes (assert false)  if it can't find a window
	QTest::keyClick(messageWindow, Qt::Key_Escape);
}

...

	QTimer::singleShot(1, this, SLOT(closeMessageDialog()));
	QMessageBox::warning(0,"hallo","abc",QMessageBox::Yes);

Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Das klappt. Yay! Vielen Dank! :)

Aber wird der closeMessageDialog nicht auch als Test case aufgerufen, da es ein slot ist?


Edit: Als public slot klappts. Danke!
Antworten