Seite 1 von 1

Wie testet man Formulare?

Verfasst: 1. Juli 2009 08:04
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]

Re: Wie testet man Formulare?

Verfasst: 1. Juli 2009 08:08
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.

Verfasst: 1. Juli 2009 08:17
von Seikilos
Ja, aber man erbt immer private von der ui Klasse.

Im übrigen scheint findChild die Lösung zu sein

Verfasst: 1. Juli 2009 09:51
von pfid
Jetzt seh ichs auch, hatte dich tatsächlich falsch verstanden ;)

Verfasst: 1. Juli 2009 10:08
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...

Verfasst: 6. August 2009 16:50
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);


Verfasst: 13. August 2009 10:12
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!