2011-01-05 19 views
6

Ich habe eine Anwendung, die die Graphicsview-Architektur in Qt4 ausgiebig nutzt und ich möchte automatisierte Tests der UI-Komponenten starten, aber ich kann keine Ressourcen im Zusammenhang mit was finden Ich sollte testen oder qgraphicsview/qgraphicswidget basierte Klassen testen?Wie Unit Test Qt Grafikansicht Widgets/Elemente

Antwort

8

Ich habe Probleme beim Testen von QGraphicsView bekommen. Mein größtes Problem war, dass

QTest::mousePressEvent(view, Qt::LeftButton, 0); 

Ergebnisse in

Mausereignis "MousePress" von Widget

geschrieben immer an die Konsole empfangen werden nicht akzeptiert, und meine Event-Handler nie aufgerufen zu werden. Die Lösung, die ich gefunden habe, ist das Ereignis an das Ansichtsfenster zu senden, nicht die QGraphicsView selbst:

QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0); 

, die das Ereignis meiner QGraphicsView Unterklasse, wie es sollte sendet. Auf diese Weise können Sie Ihre gesamte Grafikansicht auf hoher Ebene testen, um sicherzustellen, dass Ihre Grafikelemente entsprechende Ereignisse erhalten.

Nun zu Ihren wirklichen Fragen.

Grafikintensive Klassen sind notoriouslyhard bis test. Unter Hinweis auf die verlinkten Seiten würde ich vorschlagen, (1) die Logik und die Darstellung so weit wie möglich zu trennen und (2) nicht zu niedrig zu testen.

Die Trennung der Logik von der Präsentation ist in der Regel eine gute Methode, aber es kann schwierig sein, wenn der Großteil Ihrer Logik für die Erstellung der Präsentation aufgewendet wird! Im Falle von QGraphicsItem-Objekten haben wir keine praktischen QTest-Funktionen, um Ereignisse für uns zu simulieren. So Ihre Klassen entwerfen, um zu antworten semantisch sinnvolle Ereignisse Typen verwenden, können Sie Ihre tatsächlich während der Tests konstruieren, nicht QGraphicsSceneEvent Unterklassen, zB verwenden

void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last) 

dann haben Ihre mousePressEvent Methode, um die relevanten Informationen aus dem QGraphicsSceneMouseEvent extrahieren und Ihr Eigen nennen pressed Methode. Ihre Tests verwenden dann Ihre Methode und Sie müssen sich keine Gedanken darüber machen, künstliche QGraphicsSceneEvents zu erstellen.

Das Problem von was zu testen, ist jedoch erheblich schwieriger. Beispielsweise möchten Sie keine Positionen von Grafikelementen in Ihren Tests fest codieren. Was passiert, wenn sich die Grafik-Engine von Ihnen aus verändert und Ihre Objekte etwas anders dargestellt werden? Stattdessen sollten Sie sich auf semantisch aussagekräftige Tests konzentrieren. Kollidieren diese beiden Objekte? Ändert sich die Farbe dieses Elements, wenn ich es auswähle?

Die grundlegende Idee hier ist, Ihre Klassen auf der Ebene der Semantik Ihrer Anwendung zu entwerfen und zu testen, nicht auf der Ebene der QGraphicsView. Vielleicht möchten Sie eine kleine Anzahl von gut konstruierten Tests, die Ihre Übersetzung von QGraphicsSceneEvents in die Ereignisse Ihrer App testen, aber verstehen, dass diese fragiler sein werden als die meisten Ihrer Tests.

+0

Irgendeine Idee über meine verbundene Frage? Die Verwendung von viewport() scheint das QGraphicsItem nicht als Mausgrabberelement mit dieser Methode zu setzen. – paulm