2011-01-05 9 views
6

Qt4에서 graphicsview 아키텍처를 광범위하게 사용하는 응용 프로그램이 있는데 ui 구성 요소의 자동화 된 테스트를 시작하고 싶지만 과 관련된 리소스를 찾을 수 없습니다 qgraphicsview/qgraphicswidget 기반 클래스를 테스트하거나 어떻게 테스트해야합니까?단위 테스트 방법 qt 그래픽보기 위젯/항목

답변

8

단위 테스트 QGraphicsView에서 문제가 발생했습니다. 나의 가장 큰 문제는

마우스 이벤트

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

결과 "MousePress은"콘솔에 기록하기 위젯

를 받아 허용되지, 내 이벤트 처리기가 호출되지 점점 결코이었다. 내가 찾은 해결책은 뷰포트에 이벤트를 보내는 아닌를 QGraphicsView 자체 :

예상대로 내 QGraphicsView 서브 클래스에 이벤트를 전송
QTest::mousePressEvent(view->viewport(), Qt::LeftButton, 0); 

. 이렇게하면 그래픽 항목이 적절하게 이벤트를 수신하고 있는지 확인하기 위해 상위 수준에서 전체 그래픽보기를 테스트 할 수 있습니다.

이제 진짜 질문에 답하십시오.

그래픽을 많이 사용하는 클래스는 notoriouslyhard에서 test입니다. 링크 된 페이지에서 조언을 얻으려면 (1) 가능한 한 로직 및 프리젠 테이션을 분리하고 (2) 너무 낮은 수준에서는 테스트하지 않는 것이 좋습니다.

프리젠 테이션과 로직을 분리하는 것은 일반적으로 좋은 방법이지만, 로직 대량이 프리젠 테이션을 만드는 데 소비되면 어려울 수 있습니다! QGraphicsItem 객체의 경우에는 우리에게 이벤트를 시뮬레이트하기위한 편리한 QTest 함수가 없습니다. 그래서

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

를 사용, 의미 유형을 사용하여 의미있는 사건이 실제로 예를 들어 테스트하지 QGraphicsSceneEvent 서브 클래스 중에 구성 할 수 있습니다에 응답하는 클래스를 디자인 한 후 mousePressEvent 방법은 QGraphicsSceneMouseEvent에서 관련 정보를 추출하고 자신의 전화가 pressed 방법. 그러면 테스트에서 메서드를 사용할 것이므로 인공 QGraphicsSceneEvents를 만드는 것에 대해 걱정할 필요가 없습니다.

의 문제는 무엇입니까?을 테스트하는 것은 상당히 어렵습니다. 예를 들어 그래픽 항목의 위치를 ​​테스트에 하드 코딩하지 않을 것입니다. 그래픽 엔진이 당신 아래에서 변화하고 아이템이 약간 다르게 표현되면 어떻게 될까요? 대신 의미 론적으로 의미있는 테스트에 집중해야합니다. 이 두 개체가 충돌합니까? 이 항목의 색상이 선택시 변경됩니까?

여기의 기본 아이디어는 QGraphicsView의 수준이 아닌 응용 프로그램의 의미 수준에서 클래스를 디자인하고 테스트하는 것입니다. QGraphicsSceneEvents의 앱 이벤트 번역을 테스트하는 제대로 구성된 테스트를 원하는 수는 없지만 대부분의 테스트보다 취약하다는 것을 이해해야합니다.

+0

내 연결된 질문에 대한 아이디어가 있습니까? 뷰포트()를 사용하면 QGraphicsItem을이 방법을 사용하는 마우스 그래버 항목으로 설정하지 않는 것입니까? – paulm