Documentation/Widget testing: Difference between revisions

From Commontk
Jump to navigationJump to search
mNo edit summary
 
(121 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Documentation|Back to CTK Documentation]]
= Overview =
= Overview =


Testing of both CTK widgets and application built on top of CTK could leverage the capabilities offered by the [http://www.paraview.org/Wiki/Testing_design QtTesting library] developed by [http://www.paraview.org Paraview] folks.
Testing of both CTK widgets and application built on top of CTK could leverage the capabilities offered by the [http://www.paraview.org/Wiki/Testing_design QtTesting library] developed by [http://www.paraview.org Paraview] folks.


<br />
'''How added the testing framework to CTK :'''
* Turn the variable ''CTK_USE_QTTESTING'' into ''ON''.
<br />
'''If the option '''CTK_USE_QTTESTING''' is enabled, the build system will :'''
# Download external project QtTesting
# Compile the CTKQtTesting Library
#* Including the class :
#**''ctkEventTranslaterPlayerWidget'' : Widget used by the Unit Test - [http://www.commontk.org/index.php/File:CtkEventTranslatorPlayerWidget.png Image]
#**''ctkQtTestingUtility'' : Class used by the application - inherits from pqTestUtility
#**''ctkXMLEventObserver'' : Recover the Event and write the .xml file.
#**''ctkXMLEventSource'' : Read the .xml file and create the events.
# For CTKWidget - CTKVisualizationWidget - CTKCoreWidget :
#* Include the event translator and player required for custom widgets. (Located in the same folder as their associated widget sources)
# If '''BUILD_TESTING''' is enabled: widgets EventTranslatorTests will be compiled.
#*''These tests will use ''ctkEventTranslaterPlayerWidget'' and ensure that events associated with widgets can be properly recorded and played.''
<br />
'''{{note}}''' <br />
Option '''CTK_USE_QTTESTING''' will be automatically enabled if '''BUILD_TESTING''' is ON
= Adding the testing framework into your application =
Adding the testing framework will allow users to recover script, but also a easy way to create tutorial or to test all the widget.<br />
You can see the application exemple created in CTK to have an exemple:
=== How ===
Follow these steps to add this testing framework to your application.
# Create a variable ctkQtTestingUtiliy - can be added to your mainWindow class.
#* And initialize this variable as following :
<pre>
this->TestUtility = new ctkQtTestingUtility(this);
this->TestUtility->addEventObserver("xml", new ctkXMLEventObserver(this));
this->TestUtility->addEventSource("xml", new ctkXMLEventSource(this));</pre>
{{Note}} You can have your own ''EventObserver'' and ''EventSource''
# Create a button Record, and link it to the ctkQtTestUtility slot ''record''
# Create a button Play, and link it to the ctkQtTestingUtility slot ''play''
<pre>
QObject::connect(Ui.RecordButton, SIGNAL(clicked(bool)), this, SLOT(record()));
QObject::connect(Ui.PlayBackButton, SIGNAL(clicked(bool)), this, SLOT(play()));
</pre>
=== Limits ===
Note that there are still severals limits to this testing framework :
# The ctkVTKRenderView had to have the same size between the record and the playback.
#* To solve the issue, ctkTestingUtility record all the application property - size, state, font ... - and before a playback, if these property are differents, ask the user if he wants to load the settings.<br />{{Note}} We are working on this limit to find a better solution.
# All the CTK Widgets are not yet tested - Below the [http://www.commontk.org/index.php/Documentation/Widget_testing#Player.2FTranslators_Widget_Testing summary table] -


If the option '''CTK_USE_QTTESTING''' is enabled, the build system will:
= Issues found on QtTesting =
* Download external project QtTesting
* Include the event translator and player required for custom CTK widgets. (Located in the same folder as their associated widget sources)
* Include the class ''ctkEventTranslaterPlayerWidget'' into CTKWidgets library
* If '''BUILD_TESTING''' is enabled: CTK widgets EventTranslatorTests will be compiled. These tests will use ''ctkEventTranslaterPlayerWidget'' and ensure that events associated with CTK widgets can be properly recorded and played.


*''' QSpinBox/QDoubleSpinBox :'''
** A long click on the up/down arrow -> just one click even if the value change severals times.
** Fast click -> Double click -> no effect.
** clik on the up/down arrow just after editing the spin Box -> no effect.
''Solve : Contribut to the QtTesting by modified the pqSpinBoxEventTranslator'' {{Doing}} <br/>
Here the link to my Github for the [https://github.com/benjaminlong/QtTesting/tree/88-IssueQSpinBox QSpinBox]<br/>
Here the link to my Github for the [https://github.com/benjaminlong/QtTesting/tree/88-IssueQDoubleSpinBox QDoublSpinBox]


{{note}} Option '''CTK_USE_QTTESTING''' will be automatically enabled if '''BUILD_TESTING''' is ON


= Milestones =
*''' In pq3DView :'''
** The scroll button has no effect - Implemented for ctk.
** Shift between the current/Expected image.
''Solve : new Implementation with the ctkVTKRenderViewEventTranslator and the ctkVTKRenderViewEventPlayer :'' {{Done}}
# ''Change the normalization into a normalization by the widget center.''
# ''Implemented the scroll action''
# ''Add a better rounded when we cast from double to int to not have shift issue.''


# Integration: What and where. {{Done}}
 
*''' QComboBox when it is editable :'''
** The hight-event "set_sting" crash if we edit the comboBox.
*** '''''Exemple :''' If we have an item "foo", we are going to edit the comboBox with "f", but the item "f" doesn't exist, and the player will crash.''
''Solve : ...'' {{Not Done}}
 
= Building =
=== Milestones ===
# Integrate QtTesting has an external projects {{Done}}
# Integrate QtTesting has an external projects {{Done}}
# Implement ''ctkEventTranslaterPlayerWidget'' {{Doing}}
# Add unit test to all the widget - Below, the [http://www.commontk.org/index.php/Documentation/Widget_testing#Player.2FTranslators_Widget_Testing summuray table] -
# Create custom translator/player if needed {{Doing}}
## Implement ''ctkEventTranslaterPlayerWidget'' {{Done}}
# Implement widgets EventTranslatorTests {{Doing}}
## Create custom translator/player if needed {{Doing}}
 
## Implement widgets EventTranslatorTests {{Doing}}
= Player/Translators Widget Testing =
# Create an Application test - [http://www.commontk.org/index.php/File:CtkQtTestingScreenShot.png ctkQtTesting] - {{Done}}


=== Player/Translators Widget Testing ===
Summury table, to know each widgets' state.<br />
The state can be ''Done'' : {{Done}} , ''Done with QtTesting issue'' : {{Done}}{{Doing}} , ''in progress'' : {{Doing}} , or ''without unit test'': {{Not Done}}.


{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
Line 50: Line 111:
|{{Done}}
|{{Done}}
|
|
|
|''Translator/player implemented''
|-
|-
|ctkBasePopupWidget
|ctkBasePopupWidget
|{{Done}}
|NA
|'''+++'''
|
|''ctkPopupWidget inherit of it. So we Test Directly ctkPopupWidget''
|''ctkPopupWidget inherit of it. See ctkPopupWidget''
|-
|-
|ctkButtonGroup  
|ctkButtonGroup  
Line 63: Line 124:
|-
|-
|ctkCheckableComboBox
|ctkCheckableComboBox
|{{Done}}{{Doing}}
|{{Done}}
|'''+'''
|
| bgcolor="#f4db9e" |''minor issue with the currentText()''
|
|-
|-
|ctkCheckableHeaderView
|ctkCheckableHeaderView
|{{Done}}{{Doing}}
|{{Done}}
|'''++'''
|
| bgcolor="#f4db9e" |''more test ?''
|
|-
|-
|ctkCheckBoxPixmaps
|ctkCheckBoxPixmaps
|{{Not Done}}
|{{Not Done}}
|'''--'''
|
|''Not used in Slicer''
|''Not used in Slicer''
|-
|-
|ctkCheckablePushButton
|ctkCheckablePushButton
|{{Done}}
|{{Done}}
|'''--'''
|
|''Not used in Slicer''
|''Not used in Slicer''
|-
|-
Line 88: Line 149:
|-
|-
|ctkCompleter
|ctkCompleter
|{{Not Done}}
|NA
|'''-'''
|
|
|
|-
|-
Line 105: Line 166:
|{{Done}}
|{{Done}}
|
|
|bgcolor="#f4db9e" |''QSpinBox issue if used''
|
|-
|-
|ctkColorPickerButton
|ctkColorPickerButton
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
| bgcolor="f4db9e" |''QSpinBox issue if used''
|-
|-
|ctkConsole
|ctkConsole
|{{Done}}{{Doing}}
|{{Done}}
|
|
|''May have a problem with the command''
|''May have a problem with the command''
Line 119: Line 180:
|ctkConfirmExitDialog
|ctkConfirmExitDialog
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkCoordinatesWidget
|ctkCoordinatesWidget
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
| bgcolor="f4db9e"|''Problem with the QSpinBox''
|-
|-
|ctkCrosshairLabel
|ctkCrosshairLabel
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkDateRangeWidget
|ctkDateRangeWidget
|{{Doing}}
|{{Not Done}}
|
|
|''Problem with QDateTimer''  
|''Problem with QDateTimer''  
|-
|-
|ctkDirectoryButton
|ctkDirectoryButton
|{{Done}}{{Doing}}
|{{Done}} - TO VERIFY
|
|
| bgcolor="f4db9e" |''Value OK but no dialog''
| bgcolor="f4db9e" |''Value OK but no dialog''
Line 153: Line 214:
|-
|-
|ctkDynamicSpacer
|ctkDynamicSpacer
|{{Not Done}}
|NA
|'''-'''
|
|
|
|-
|-
|ctkErrorLogStatusMessageHandler
|ctkErrorLogStatusMessageHandler
|{{Done}}
|NA
|'''---'''
|
|''Not a Widget''
|''Not a Widget''
|-
|-
|ctkErrorLogWidget
|ctkErrorLogWidget
|{{Not Done}}
|{{Not Done}}
|'''---'''
|
|
|
|-
|-
Line 173: Line 234:
|-
|-
|ctkFileDialog
|ctkFileDialog
|{{Doing}}
|{{Done}}
|
|
|
| bgcolor="#efabab" |'' EventTranslator ?''
|-
|-
|ctkFittedTextBrowser
|ctkFittedTextBrowser
|{{Done}}
|NA
|'''--'''
|
|''This widget just display text.''
|''This widget just display text.''
|-
|-
|ctkFlowLayout
|ctkFlowLayout
|{{Done}}
|NA
|'''--'''
|
|''Layout are not tested through the event translator/player mechanism''
|''Layout are not tested through the event translator/player mechanism''
|-
|-
|ctkFontButton
|ctkFontButton
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
| bgcolor="f4db9e" |''QComboBox doesn't change the font''
|-
|-
|ctkIconEnginePlugin
|ctkIconEnginePlugin
|{{Done}}
|NA
|'''--'''
|
|''Plugin are not tested through the event translator/player mechanism''
|''Plugin are not tested through the event translator/player mechanism''
|-
|-
|ctkLayoutManager
|ctkLayoutManager
|{{Not Done}}
|NA
|
|
|
|
|-
|-
|ctkMaterialPropertyPreviewLabel
|ctkMaterialPropertyPreviewLabel
|{{Not Done}}
|NA
|
|
|
|''Not sure if something is requiered since it seems to be a label''
|-
|-
|ctkMaterialPropertyWidget
|ctkMaterialPropertyWidget
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
| bgcolor="f4db9e"|''QSpinBox issue''
|-
|-
|ctkMatrixWidget
|ctkMatrixWidget
|{{Done}}
|{{Done}}
|
|
| bgcolor="#f4db9e" |''Skip all the visual effect''
| '' no visuel effects ''
|-
|-
|ctkMenuButton
|ctkMenuButton
|{{Not Done}}
|{{Not Done}}
|
|
|''Use in Slicer ? Implemented event translator/player''
|''Use in Slicer ?
|-
|-
|ctkMenuComboBox
|ctkMenuComboBox
|{{Done}}{{Doing}}
|{{Done}}
|'''+++'''
|
| bgcolor="#f4db9e" |'' Issue if the subMenus have no parent ''
| bgcolor="#efabab" |'' Developer should make sure menus have a parent. See https://bugreports.qt.nokia.com/browse/QTBUG-20929
|-
|-
|ctkModalityWidget
|ctkModalityWidget
Line 233: Line 294:
|-
|-
|ctkPathLineEdit
|ctkPathLineEdit
|{{Done}}{{Doing}}
|{{Done}}
|'''++'''
|
| bgcolor="#f4db9e" |'' Little issue with the listView for the fist show - As ctkMenuComboBox ''
| bgcolor="#efabab" |'' Note that the first time the listview is displayed, it will show on the top left corner of the screen.''
|-
|-
|ctkPixmapIconEngine
|ctkPixmapIconEngine
|{{Not Done}}
|NA
|'''++'''
|
|
|
|-
|-
|ctkPopupWidget
|ctkPopupWidget
|{{Doing}}
|{{Done}}
|'''+'''
|
| bgcolor="#efabab" |''Implemented event translator/player ''
|
|-
|-
|ctkQImageView
|ctkQImageView
|{{Not Done}}
|NA
|'''---'''
|
|
|
|-
|-
Line 258: Line 319:
|-
|-
|ctkRangeWidget
|ctkRangeWidget
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
| bgcolor="f4db9e"|''QDoubleSpinBox issue''
|-
|-
|ctkScreenshotDialog
|ctkScreenshotDialog
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
Line 273: Line 334:
|-
|-
|ctkSettings
|ctkSettings
|{{Not Done}}
|NA
|'''+'''
|
|''Need a Test ?''
|
|-
|-
|ctkSettingsDialog
|ctkSettingsDialog
|{{Done}}
|{{Done}}
|'''+'''
|
|
|
|-
|-
|ctkSettingsPanel
|ctkSettingsPanel
|{{Done}}
|{{Done}}
|'''+'''
|
|''It's a panel so doesn't need to be tested. However, is tested in ctkSettingsDialog testing''
|''See ctkSettingsDialog''
|-
|-
|ctkSignalMapper
|ctkSignalMapper
|{{Done}}
|NA
|
|
|''This object is not a widget and doesn't have to be tested through the event translator/player mechanism''
|''This object is not a widget and doesn't have to be tested through the event translator/player mechanism''
|-
|-
|ctkSimpleLayoutManager
|ctkSimpleLayoutManager
|{{Not Done}}
|NA
|
|
|
|
|-
|-
|ctkSliderWidget
|ctkSliderWidget
|{{Done}}{{Doing}}
|{{Doing}}
|
|
| bgcolor="f4db9e"|''QSpinBox Issue''
|'''Translator and player if popup'''
|-
|-
|ctkTestApplication
|ctkTestApplication
|{{Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
Line 309: Line 370:
|ctkThumbnailListWidget
|ctkThumbnailListWidget
|{{Not Done}}
|{{Not Done}}
|'''--'''
|
|
|
|-
|-
|ctkThumbnailWidget
|ctkThumbnailWidget
|{{Not Done}}
|{{Not Done}}
|'''--'''
|
|
|
|-
|-
|ctkToolTipTrapper
|ctkToolTipTrapper
|{{Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
Line 324: Line 385:
|ctkTransferFunctionBarsItem
|ctkTransferFunctionBarsItem
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTransferFunctionControlPointsItem
|ctkTransferFunctionControlPointsItem
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTransferFunctionGradientItem
|ctkTransferFunctionGradientItem
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTransferFunctionItem
|ctkTransferFunctionItem
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTransferFunctionScene
|ctkTransferFunctionScene
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTransferFunctionView
|ctkTransferFunctionView
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkTreeComboBox
|ctkTreeComboBox
|{{Done}}{{Doing}}
|{{Done}}
|'''+'''
|
| bgcolor="#f4db9e" |''Good method ?''
| '''Note: This won't work if there multiple items with a similar name. This is not an issue in Slicer since selection is based on string'''
|-
|-
|ctkWidgetsUtils
|ctkWidgetsUtils
|{{Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
Line 364: Line 425:
|ctkWorkflowAbstractPagedWidget
|ctkWorkflowAbstractPagedWidget
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowButtonBoxWidget
|ctkWorkflowButtonBoxWidget
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowGroupBox
|ctkWorkflowGroupBox
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowStackedWidget
|ctkWorkflowStackedWidget
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowTabWidget
|ctkWorkflowTabWidget
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowWidget
|ctkWorkflowWidget
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|-
|-
|ctkWorkflowWidgetStep
|ctkWorkflowWidgetStep
|{{Not Done}}
|{{Not Done}}
|'''-'''
|
|
|
|}
|}
| style="width:50%; "text-align: center; " |
| style="width:50%; "text-align: center; " |
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|+ '''''CTKVisualizationVTKWidget'''''
|+ '''''CTKVisualizationVTKWidgets'''''
|-
|-
! scope=col style="background:#cde6f8;"| Widgets
! scope=col style="background:#cde6f8;"| Widgets
Line 407: Line 468:
|-
|-
|ctkVTKAbstractMatrixWidget
|ctkVTKAbstractMatrixWidget
|{{Done}}
|
|
|''See ctkVTKMatrixWidget''
|-
|ctkVTKAbstractView
|{{Done}}
|
|''See ctkVTKRenderView''
|-
|ctkVTKChartView
|{{Not Done}}
|
|
|
|
|-
|-
|ctkVTKAbstractView
|ctkVTKDataSetArrayComboBox
|{{Done}}
|
|
|-
|ctkVTKDataSetModel
|{{Done}}
|
|
|-
|ctkVTKMagnifyView
|{{Not Done}}
|
| ''Not used in Slicer''
|-
|ctkVTKMatrixWidget
|{{Done}}
|
| ''See ctkVTKMatrixWidget - There is no need for specific translator & player''
|-
|ctkVTKRenderView
|{{Done}}
|
| bgcolor="#f4db9e" | ''Translator/Player implemented <br /> What we want :<br /> - Wheel event {{Done}} <br /> - Better normalization {{Done}} <br /> - Not working if the renderView has a different size
|-
|ctkVTKScalarBarWidget
|{{Done}}{{Doing}}
|
|bgcolor="#f4db9e" |''QSpinBox issue + key "."(pad) on the line edit''
|-
|ctkVTKScalarsToColorsUtils
|{{Not Done}}
|
|
|-
|ctkVTKScalarsToColorsView
|{{Not Done}}
|
|
|-
|ctkVTKScalarsToColorsWidget
|{{Not Done}}
|
|
|-
|ctkVTKSliceView
|{{Done}}
|
|''Since it's based on QVTKWidget - See ctkVTKRenderView translator & player''
|-
|ctkVTKSurfaceMaterialPropertyWidget
|{{Doing}}
|
|
|-
|ctkVTKTextPropertyWidget
|{{Done}}
|
|
|-
|ctkVTKThresholdWidget
|{{Not Done}}
|
|
|-
|ctkVTKThumbnailView
|{{Not Done}}
|
|
|-
|ctkVTKVolumePropertyWidget
|{{Doing}}
|
|
|-
|ctkVTKWidgetsUtils
|NA
|
|
|}
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|+ '''''CTKDICOMWidgets'''''
|-
! scope=col style="background:#cde6f8;"| Widgets
! scope=col style="background:#cde6f8;"| State
! scope=col style="background:#cde6f8;"| Priority
! scope=col style="background:#cde6f8;"| Notes
|-
|ctkDICOMAppWidget
|{{Not Done}}
|
|
|-
|ctkDICOMDatasetView
|{{Not Done}}
|
|
|-
|ctkDICOMDirectoryListWidget
|{{Not Done}}
|
|
|-
|ctkDICOMImage
|{{Not Done}}
|
|
|-
|ctkDICOMImportWidget
|{{Not Done}}
|
|
|-
|ctkDICOMItemTreeModel
|{{Not Done}}
|
|
|-
|ctkDICOMListenerWidget
|{{Not Done}}
|
|
|-
|ctkDICOMQueryResultsTabWidget
|{{Not Done}}
|
|
|-
|ctkDICOMQueryRetrieveWidget
|{{Not Done}}
|
|
|-
|ctkDICOMQueryWidget
|{{Not Done}}
|
|
|-
|ctkDICOMServerNodeWidget
|{{Not Done}}
|
|
|
|-
|ctkDICOMThumbnailGenerator
|{{Not Done}}
|
|
|
|
|-
|-
|ctkVTKChartView
|ctkDICOMThumbnailListWidget
|{{Not Done}}
|
|
|
|}
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|+ '''''qMRMLWidgets'''''
|-
! scope=col style="background:#cde6f8;"| Widgets
! scope=col style="background:#cde6f8;"| State
! scope=col style="background:#cde6f8;"| Priority
! scope=col style="background:#cde6f8;"| Notes
|-
|qMRMLCaptureToolBar
|{{Doing}}
|
|
|
|
|-
|-
|ctkVTKDataSetArrayComboBox
|qMRMLCheckableNodeComboBox
|{{Done}}
|
|
|
|-
|qMRMLClipNodeWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKDataSetModel
|qMRMLCollapsibleButton
|{{Done}}
|
|
|
|-
|qMRMLColorListView
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKMagnifyView
|qMRMLColorPickerWidget
|{{Doing}}
|
|
|
|-
|qMRMLColorTableComboBox
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKMatrixWidget
|qMRMLColorTableView
|{{Done}}
|
|
|
|-
|qMRMLDisplayNodeWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKRenderView
|qMRMLEventBrokerWidget
|{{Done}}
|
|
|
|-
|qMRMLLabelComboBox
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKScalarBarWidget
|qMRMLLayoutWidget
|{{Doing}}
|
|
|
|-
|qMRMLLinearTransformSlider
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKScalarsToColorsUtils
|qMRMLListWidget
|{{Done}}
|
|
|
|-
|qMRMLMatrixWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKScalarsToColorsView
|qMRMLNavigationView
|{{Done}}
|
|
|
|-
|qMRMLNodeComboBox
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKScalarsToColorsWidget
|qMRMLRangeWidget
|{{Done}}
|
|
|
|-
|qMRMLROIWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKSliceView
|qMRMLScalarInvariantComboBox
|{{Done}}
|
|
|
|-
|qMRMLSceneFactoryWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKSurfaceMaterialPropertyWidget
|qMRMLSceneViewMenu
|{{Done}}
|
|
|
|-
|qMRMLScreenShotDialog
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKTextPropertyWidget
|qMRMLSliceControllerWidget
|{{Doing}}
|
|
|
|-
|qMRMLSliceWidget
|{{Doing}}
|
|
|
|
|-
|-
|ctkVTKThresholdWidget
|qMRMLThreeDViewControllerWidget
|{{Done}}
|
|
|
|-
|qMRMLThreeDView
|{{Doing}}
|
|
|
|
|-
|-
|ctkVTKThumbnailView
|qMRMLThreeDWidget
|{{Doing}}
|
|
|
|-
|qMRMLTransformSliders
|NA
|
|
|
|
|-
|-
|ctkVTKVolumePropertyWidget
|qMRMLTreeView
|{{Doing}}
|
|
|
|-
|qMRMLVolumeInfoWidget
|{{Done}}
|
|
|
|
|-
|-
|ctkVTKWidgetsUtils
|qMRMLVolumeThresholdWidget
|{{Done}}
|
|
|
|-
|qMRMLWindowLevelWidget
|{{Doing}}
|
|
|
|
Line 504: Line 811:


= Screenshots =
= Screenshots =
<gallery widths=300 px heights=200px perrow=3>
<gallery widths=300 px heights=200px perrow=3>
Image:CtkQtTestingScreenShot.png|Simple application with recording / playing Qt testing capabilities
Image:CtkQtTestingScreenShot.png|Simple application with recording / playing Qt testing capabilities
Image:CtkEventTranslatorPlayerWidget.png|Little exemple of the widget testing  
Image:CtkEventTranslatorPlayerWidget.png|Little exemple of the widget testing  
</gallery>
</gallery>

Latest revision as of 15:57, 4 May 2012

Overview

Testing of both CTK widgets and application built on top of CTK could leverage the capabilities offered by the QtTesting library developed by Paraview folks.


How added the testing framework to CTK :

  • Turn the variable CTK_USE_QTTESTING into ON.


If the option CTK_USE_QTTESTING is enabled, the build system will :

  1. Download external project QtTesting
  2. Compile the CTKQtTesting Library
    • Including the class :
      • ctkEventTranslaterPlayerWidget : Widget used by the Unit Test - Image
      • ctkQtTestingUtility : Class used by the application - inherits from pqTestUtility
      • ctkXMLEventObserver : Recover the Event and write the .xml file.
      • ctkXMLEventSource : Read the .xml file and create the events.
  3. For CTKWidget - CTKVisualizationWidget - CTKCoreWidget :
    • Include the event translator and player required for custom widgets. (Located in the same folder as their associated widget sources)
  4. If BUILD_TESTING is enabled: widgets EventTranslatorTests will be compiled.
    • These tests will use ctkEventTranslaterPlayerWidget and ensure that events associated with widgets can be properly recorded and played.


Note Note:
Option CTK_USE_QTTESTING will be automatically enabled if BUILD_TESTING is ON

Adding the testing framework into your application

Adding the testing framework will allow users to recover script, but also a easy way to create tutorial or to test all the widget.
You can see the application exemple created in CTK to have an exemple:

How

Follow these steps to add this testing framework to your application.

  1. Create a variable ctkQtTestingUtiliy - can be added to your mainWindow class.
    • And initialize this variable as following :
this->TestUtility = new ctkQtTestingUtility(this);
this->TestUtility->addEventObserver("xml", new ctkXMLEventObserver(this));
this->TestUtility->addEventSource("xml", new ctkXMLEventSource(this));

Note Note: You can have your own EventObserver and EventSource

  1. Create a button Record, and link it to the ctkQtTestUtility slot record
  2. Create a button Play, and link it to the ctkQtTestingUtility slot play
QObject::connect(Ui.RecordButton, SIGNAL(clicked(bool)), this, SLOT(record()));
QObject::connect(Ui.PlayBackButton, SIGNAL(clicked(bool)), this, SLOT(play()));

Limits

Note that there are still severals limits to this testing framework :

  1. The ctkVTKRenderView had to have the same size between the record and the playback.
    • To solve the issue, ctkTestingUtility record all the application property - size, state, font ... - and before a playback, if these property are differents, ask the user if he wants to load the settings.
      Note Note: We are working on this limit to find a better solution.
  2. All the CTK Widgets are not yet tested - Below the summary table -

Issues found on QtTesting

  • QSpinBox/QDoubleSpinBox :
    • A long click on the up/down arrow -> just one click even if the value change severals times.
    • Fast click -> Double click -> no effect.
    • clik on the up/down arrow just after editing the spin Box -> no effect.

Solve : Contribut to the QtTesting by modified the pqSpinBoxEventTranslator
Here the link to my Github for the QSpinBox
Here the link to my Github for the QDoublSpinBox


  • In pq3DView :
    • The scroll button has no effect - Implemented for ctk.
    • Shift between the current/Expected image.

Solve : new Implementation with the ctkVTKRenderViewEventTranslator and the ctkVTKRenderViewEventPlayer :

  1. Change the normalization into a normalization by the widget center.
  2. Implemented the scroll action
  3. Add a better rounded when we cast from double to int to not have shift issue.


  • QComboBox when it is editable :
    • The hight-event "set_sting" crash if we edit the comboBox.
      • Exemple : If we have an item "foo", we are going to edit the comboBox with "f", but the item "f" doesn't exist, and the player will crash.

Solve : ...

Building

Milestones

  1. Integrate QtTesting has an external projects
  2. Add unit test to all the widget - Below, the summuray table -
    1. Implement ctkEventTranslaterPlayerWidget
    2. Create custom translator/player if needed
    3. Implement widgets EventTranslatorTests
  3. Create an Application test - ctkQtTesting -

Player/Translators Widget Testing

Summury table, to know each widgets' state.
The state can be Done : , Done with QtTesting issue : , in progress : , or without unit test: .

CTKWidgets
Widgets State Priority Notes
ctkActionsWidget
ctkAddRemoveComboBox
ctkAxesWidget Translator/player implemented
ctkBasePopupWidget NA ctkPopupWidget inherit of it. See ctkPopupWidget
ctkButtonGroup
ctkCheckableComboBox
ctkCheckableHeaderView
ctkCheckBoxPixmaps Not used in Slicer
ctkCheckablePushButton Not used in Slicer
ctkComboBox
ctkCompleter NA
ctkCollapsibleButton
ctkCollapsibleGroupBox
ctkColorDialog
ctkColorPickerButton
ctkConsole May have a problem with the command
ctkConfirmExitDialog
ctkCoordinatesWidget
ctkCrosshairLabel
ctkDateRangeWidget Problem with QDateTimer
ctkDirectoryButton - TO VERIFY Value OK but no dialog
ctkDoubleRangeSlider
ctkDoubleSlider
ctkDynamicSpacer NA
ctkErrorLogStatusMessageHandler NA Not a Widget
ctkErrorLogWidget
ctkExpandButton
ctkFileDialog
ctkFittedTextBrowser NA This widget just display text.
ctkFlowLayout NA Layout are not tested through the event translator/player mechanism
ctkFontButton
ctkIconEnginePlugin NA Plugin are not tested through the event translator/player mechanism
ctkLayoutManager NA
ctkMaterialPropertyPreviewLabel NA
ctkMaterialPropertyWidget
ctkMatrixWidget no visuel effects
ctkMenuButton Use in Slicer ?
ctkMenuComboBox Developer should make sure menus have a parent. See https://bugreports.qt.nokia.com/browse/QTBUG-20929
ctkModalityWidget
ctkPathLineEdit Note that the first time the listview is displayed, it will show on the top left corner of the screen.
ctkPixmapIconEngine NA
ctkPopupWidget
ctkQImageView NA
ctkRangeSlider
ctkRangeWidget
ctkScreenshotDialog
ctkSearchBox
ctkSettings NA
ctkSettingsDialog
ctkSettingsPanel See ctkSettingsDialog
ctkSignalMapper NA This object is not a widget and doesn't have to be tested through the event translator/player mechanism
ctkSimpleLayoutManager NA
ctkSliderWidget Translator and player if popup
ctkTestApplication NA This is a utility class. Shouldn't be tested using the event translator/player mechanism
ctkThumbnailListWidget
ctkThumbnailWidget
ctkToolTipTrapper NA This is a utility class. Shouldn't be tested using the event translator/player mechanism
ctkTransferFunctionBarsItem
ctkTransferFunctionControlPointsItem
ctkTransferFunctionGradientItem
ctkTransferFunctionItem
ctkTransferFunctionScene
ctkTransferFunctionView
ctkTreeComboBox Note: This won't work if there multiple items with a similar name. This is not an issue in Slicer since selection is based on string
ctkWidgetsUtils NA This is a utility class. Shouldn't be tested using the event translator/player mechanism
ctkWorkflowAbstractPagedWidget
ctkWorkflowButtonBoxWidget
ctkWorkflowGroupBox
ctkWorkflowStackedWidget
ctkWorkflowTabWidget
ctkWorkflowWidget
ctkWorkflowWidgetStep
CTKVisualizationVTKWidgets
Widgets State Priority Notes
ctkVTKAbstractMatrixWidget See ctkVTKMatrixWidget
ctkVTKAbstractView See ctkVTKRenderView
ctkVTKChartView
ctkVTKDataSetArrayComboBox
ctkVTKDataSetModel
ctkVTKMagnifyView Not used in Slicer
ctkVTKMatrixWidget See ctkVTKMatrixWidget - There is no need for specific translator & player
ctkVTKRenderView Translator/Player implemented
What we want :
- Wheel event
- Better normalization
- Not working if the renderView has a different size
ctkVTKScalarBarWidget QSpinBox issue + key "."(pad) on the line edit
ctkVTKScalarsToColorsUtils
ctkVTKScalarsToColorsView
ctkVTKScalarsToColorsWidget
ctkVTKSliceView Since it's based on QVTKWidget - See ctkVTKRenderView translator & player
ctkVTKSurfaceMaterialPropertyWidget
ctkVTKTextPropertyWidget
ctkVTKThresholdWidget
ctkVTKThumbnailView
ctkVTKVolumePropertyWidget
ctkVTKWidgetsUtils NA
CTKDICOMWidgets
Widgets State Priority Notes
ctkDICOMAppWidget
ctkDICOMDatasetView
ctkDICOMDirectoryListWidget
ctkDICOMImage
ctkDICOMImportWidget
ctkDICOMItemTreeModel
ctkDICOMListenerWidget
ctkDICOMQueryResultsTabWidget
ctkDICOMQueryRetrieveWidget
ctkDICOMQueryWidget
ctkDICOMServerNodeWidget
ctkDICOMThumbnailGenerator
ctkDICOMThumbnailListWidget
qMRMLWidgets
Widgets State Priority Notes
qMRMLCaptureToolBar
qMRMLCheckableNodeComboBox
qMRMLClipNodeWidget
qMRMLCollapsibleButton
qMRMLColorListView
qMRMLColorPickerWidget
qMRMLColorTableComboBox
qMRMLColorTableView
qMRMLDisplayNodeWidget
qMRMLEventBrokerWidget
qMRMLLabelComboBox
qMRMLLayoutWidget
qMRMLLinearTransformSlider
qMRMLListWidget
qMRMLMatrixWidget
qMRMLNavigationView
qMRMLNodeComboBox
qMRMLRangeWidget
qMRMLROIWidget
qMRMLScalarInvariantComboBox
qMRMLSceneFactoryWidget
qMRMLSceneViewMenu
qMRMLScreenShotDialog
qMRMLSliceControllerWidget
qMRMLSliceWidget
qMRMLThreeDViewControllerWidget
qMRMLThreeDView
qMRMLThreeDWidget
qMRMLTransformSliders NA
qMRMLTreeView
qMRMLVolumeInfoWidget
qMRMLVolumeThresholdWidget
qMRMLWindowLevelWidget

Screenshots