Qt4 のグラフィックスビュー アーキテクチャを多用するアプリケーションがあり、UI コンポーネントの自動テストを開始したいのですが、何をテストすべきか、または qgraphicsview/qgraphicswidget ベースのクラスをテストする方法に関連するリソースが見つかりません。
1 に答える
QGraphicsView を単体テストしようとして問題が発生しました。私の最大の問題は、
QTest::mousePressEvent(view, Qt::LeftButton, 0);
結果は
受信ウィジェットが受け付けないマウスイベント「MousePress」
コンソールに書き込まれ、イベント ハンドラーが呼び出されることはありません。私が見つけた解決策は、QGraphicsView 自体ではなく、ビューポートにイベントを送信することです。
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0);
QGraphicsView
必要に応じてイベントをサブクラスに送信します。これにより、グラフィックス ビュー全体を高いレベルからテストして、グラフィックス アイテムがイベントを適切に受け取っていることを確認できます。
さて、あなたの本当の質問に移りましょう。
グラフィックスを多用するクラスは、テストが難しいことで有名 です。リンクされたページからいくつかのアドバイスを収集すると、(1) ロジックとプレゼンテーションを可能な限り分離すること、および (2) 低すぎるレベルでテストしないことをお勧めします。
プレゼンテーションからロジックを分離することは一般的に良い方法ですが、ロジックの大部分がプレゼンテーションの作成に費やされている場合は難しい場合があります。QGraphicsItem オブジェクトの場合、イベントをシミュレートするための便利な QTest 関数はありません。したがって、QGraphicsSceneEvent サブクラスではなく、テスト中に実際に構築できる型を使用して意味的に意味のあるイベントに応答するようにクラスを設計します。
void MyGraphicsItem::pressed(const QPointF &pos, const QPointF &last)
次に、mousePressEvent
メソッドに QGraphicsSceneMouseEvent から関連情報を抽出させ、独自のpressed
メソッドを呼び出します。テストはメソッドを使用するため、人工的な QGraphicsSceneEvents の作成について心配する必要はありません。
ただし、何をテストするかという問題はかなり難しいです。たとえば、グラフィックス項目の位置をテストにハードコーディングしたくないでしょう。グラフィックエンジンが変更され、アイテムがわずかに異なる方法でレンダリングされるとどうなりますか? 代わりに、意味的に意味のあるテストに集中する必要があります。これらの 2 つのオブジェクトは衝突していますか? このアイテムは選択すると色が変わりますか?
ここでの基本的な考え方は、QGraphicsView のレベルではなく、アプリケーションのセマンティクスのレベルでクラスを設計およびテストすることです。QGraphicsSceneEvents からアプリのイベントへの変換をテストする、適切に構成された少数のテストが必要な場合がありますが、それらはほとんどのテストよりも脆弱であることを理解してください。