Documentation/Widget testing: Difference between revisions

From Commontk
Jump to navigationJump to search
mNo edit summary
 
(233 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>


If the option '''CTK_USE_QTTESTING''' is enabled, the build system will:
=== Limits ===
* Download external project QtTesting
Note that there are still severals limits to this testing framework :
* Include the event translator and player required for custom CTK widgets. (Located in the same folder as their associated widget sources)
# The ctkVTKRenderView had to have the same size between the record and the playback.
* Include the class ''ctkEventTranslaterPlayerWidget'' into CTKWidgets library
#* 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.
* 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.
# 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] -


= Issues found on QtTesting =


{{note}} Option '''CTK_USE_QTTESTING''' will be automatically enabled if '''BUILD_TESTING''' is ON
*''' 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]


= Milestones =


# Integration: What and where. {{Done}}
*''' In pq3DView :'''
# Integrate QtTesting has an external projects {{Done}}
** The scroll button has no effect - Implemented for ctk.
# Implement ''ctkEventTranslaterPlayerWidget'' {{Doing}}
** Shift between the current/Expected image.
# Create custom translator/player if needed {{Doing}}
''Solve : new Implementation with the ctkVTKRenderViewEventTranslator and the ctkVTKRenderViewEventPlayer :'' {{Done}}
# Implement widgets EventTranslatorTests {{Doing}}
# ''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.''
 


= Player/Translators Widget Testing =
*''' 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}}


CTKWidgets
= Building =
=== Milestones ===
# Integrate QtTesting has an external projects {{Done}}
# Add unit test to all the widget - Below, the [http://www.commontk.org/index.php/Documentation/Widget_testing#Player.2FTranslators_Widget_Testing summuray table] -
## Implement ''ctkEventTranslaterPlayerWidget'' {{Done}}
## Create custom translator/player if needed {{Doing}}
## Implement widgets EventTranslatorTests {{Doing}}
# Create an Application test - [http://www.commontk.org/index.php/File:CtkQtTestingScreenShot.png ctkQtTesting] - {{Done}}


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


{| class="wikitable" style="text-align:left; width:40%;"
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|-  valign=top
| style="width:50%;" |
{|class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|+ '''''CTKWidgets'''''
|-
|-
! scope=col | Widgets
! scope=col style="background:#cde6f8;"| Widgets
! scope=col | State
! scope=col style="background:#cde6f8;"| State
! scope=col | Notes
! scope=col style="background:#cde6f8;"| Priority
! scope=col style="background:#cde6f8;"| Notes
|-
|-
|ctkActionsWidget
|ctkActionsWidget
|{{Done}}
|{{Done}}
|
|
|
|-
|-
|ctkAddRemoveComboBox
|ctkAddRemoveComboBox
|{{Done}}
|{{Done}}
|
|
|
|-
|-
Line 50: Line 111:
|{{Done}}
|{{Done}}
|
|
|''Translator/player implemented''
|-
|-
|ctkBasePopupWidget
|ctkBasePopupWidget
|{{Not Done}}
|NA
|
|
|''ctkPopupWidget inherit of it. See ctkPopupWidget''
|-
|-
|ctkButtonGroup  
|ctkButtonGroup  
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkCheckableComboBox
|ctkCheckableComboBox
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkCheckableHeaderView
|ctkCheckableHeaderView
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
Line 70: Line 136:
|{{Not Done}}
|{{Not Done}}
|
|
|''Not used in Slicer''
|-
|-
|ctkCheckablePushButton
|ctkCheckablePushButton
|{{Not Done}}
|{{Done}}
|
|
|''Not used in Slicer''
|-
|-
|ctkComboBox
|ctkComboBox
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkCompleter
|ctkCompleter
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkCollapsibleButton
|ctkCollapsibleButton
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkCollapsibleGroupBox
|ctkCollapsibleGroupBox
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkColorDialog
|ctkColorDialog
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkColorPickerButton
|ctkColorPickerButton
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkConsole
|ctkConsole
|{{Done}}{{Doing}}
|{{Done}}
|
|
|''May have a problem with the command''
|-
|-
|ctkConfirmExitDialog
|ctkConfirmExitDialog
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkCoordinatesWidget
|ctkCoordinatesWidget
|{{Done}}{{Doing}}
|{{Done}}
|
|
|
|-
|-
|ctkCrosshairLabel
|ctkCrosshairLabel
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkDateRangeWidget
|ctkDateRangeWidget
|{{Not Done}}
|{{Not Done}}
|problem with QDateTimer  
|
|''Problem with QDateTimer''
|-
|-
|ctkDirectoryButton
|ctkDirectoryButton
|{{Done}}{{Doing}}
|{{Done}} - TO VERIFY
|No QDialog
|
| bgcolor="f4db9e" |''Value OK but no dialog''
|-
|-
|ctkDoubleRangeSlider
|ctkDoubleRangeSlider
|{{Done}}
|{{Done}}
|
|
|
|-
|-
|ctkDoubleSlider
|ctkDoubleSlider
|{{Done}}
|{{Done}}
|
|
|
|-
|-
|ctkDynamicSpacer
|ctkDynamicSpacer
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkErrorLogStatusMessageHandler
|ctkErrorLogStatusMessageHandler
|{{Not Done}}
|NA
|
|
|''Not a Widget''
|-
|-
|ctkErrorLogWidget
|ctkErrorLogWidget
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkExpandButton
|ctkExpandButton
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkFileDialog
|ctkFileDialog
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkFittedTextBrowser
|ctkFittedTextBrowser
|{{Not Done}}
|NA
|
|
|''This widget just display text.''
|-
|-
|ctkFlowLayout
|ctkFlowLayout
|{{Not Done}}
|NA
|
|
|''Layout are not tested through the event translator/player mechanism''
|-
|-
|ctkFontButton
|ctkFontButton
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkIconEnginePlugin
|ctkIconEnginePlugin
|{{Not Done}}
|NA
|
|
|''Plugin are not tested through the event translator/player mechanism''
|-
|-
|ctkLayoutManager
|ctkLayoutManager
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkMaterialPropertyPreviewLabel
|ctkMaterialPropertyPreviewLabel
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkMaterialPropertyWidget
|ctkMaterialPropertyWidget
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkMatrixWidget
|ctkMatrixWidget
|{{Not Done}}
|{{Done}}
|
|
| '' no visuel effects ''
|-
|-
|ctkMenuButton
|ctkMenuButton
|{{Not Done}}
|{{Not Done}}
|
|
|''Use in Slicer ?
|-
|-
|ctkMenuComboBox
|ctkMenuComboBox
|{{Not Done}}
|{{Done}}
|
|
| bgcolor="#efabab" |'' Developer should make sure menus have a parent. See https://bugreports.qt.nokia.com/browse/QTBUG-20929
|-
|-
|ctkModalityWidget
|ctkModalityWidget
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkPathLineEdit
|ctkPathLineEdit
|{{Not Done}}
|{{Done}}
|
|
| 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
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkQImageView
|ctkQImageView
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkRangeSlider
|ctkRangeSlider
|{{Done}}
|{{Done}}
|
|
|
|-
|-
|ctkRangeWidget
|ctkRangeWidget
|{{Doing}}
|{{Done}}
|
|
|
|-
|-
|ctkScreenshotDialog
|ctkScreenshotDialog
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkSearchBox
|ctkSearchBox
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkSettings
|ctkSettings
|{{Not Done}}
|NA
|
|
|
|-
|-
|ctkSettingsDialog
|ctkSettingsDialog
|{{Not Done}}
|{{Done}}
|
|
|
|-
|-
|ctkSettingsPanel
|ctkSettingsPanel
|{{Not Done}}
|{{Done}}
|
|
|''See ctkSettingsDialog''
|-
|-
|ctkSignalMapper
|ctkSignalMapper
|{{Not Done}}
|NA
|
|
|''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
|{{Not Done}}
|{{Doing}}
|
|
|'''Translator and player if popup'''
|-
|-
|ctkTestApplication
|ctkTestApplication
|{{Not Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|-
|-
|ctkThumbnailListWidget
|ctkThumbnailListWidget
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkThumbnailWidget
|ctkThumbnailWidget
|{{Not Done}}
|{{Not Done}}
|
|
|
|-
|-
|ctkToolTipTrapper
|ctkToolTipTrapper
|{{Not Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|-
|-
|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
|{{Not Done}}
|{{Done}}
|
|
| '''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
|{{Not Done}}
|NA
|
|
|''This is a utility class. Shouldn't be tested using the event translator/player mechanism''
|-
|-
|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; " |
{| class="wikitable alternance" style="text-align:left; width:100%; border:1px solid black;"
|+ '''''CTKVisualizationVTKWidgets'''''
|-
! scope=col style="background:#cde6f8;"| Widgets
! scope=col style="background:#cde6f8;"| State
! scope=col style="background:#cde6f8;"| Priority
! scope=col style="background:#cde6f8;"| Notes
|-
|ctkVTKAbstractMatrixWidget
|{{Done}}
|
|''See ctkVTKMatrixWidget''
|-
|ctkVTKAbstractView
|{{Done}}
|
|''See ctkVTKRenderView''
|-
|ctkVTKChartView
|{{Not Done}}
|
|
|-
|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}}
|
|
|-
|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}}
|
|
|-
|qMRMLCheckableNodeComboBox
|{{Done}}
|
|
|-
|qMRMLClipNodeWidget
|{{Done}}
|
|
|-
|qMRMLCollapsibleButton
|{{Done}}
|
|
|-
|qMRMLColorListView
|{{Done}}
|
|
|-
|qMRMLColorPickerWidget
|{{Doing}}
|
|
|-
|qMRMLColorTableComboBox
|{{Done}}
|
|
|-
|qMRMLColorTableView
|{{Done}}
|
|
|-
|qMRMLDisplayNodeWidget
|{{Done}}
|
|
|-
|qMRMLEventBrokerWidget
|{{Done}}
|
|
|-
|qMRMLLabelComboBox
|{{Done}}
|
|
|-
|qMRMLLayoutWidget
|{{Doing}}
|
|
|-
|qMRMLLinearTransformSlider
|{{Done}}
|
|
|-
|qMRMLListWidget
|{{Done}}
|
|
|-
|qMRMLMatrixWidget
|{{Done}}
|
|
|-
|qMRMLNavigationView
|{{Done}}
|
|
|-
|qMRMLNodeComboBox
|{{Done}}
|
|
|-
|qMRMLRangeWidget
|{{Done}}
|
|
|-
|qMRMLROIWidget
|{{Done}}
|
|
|-
|qMRMLScalarInvariantComboBox
|{{Done}}
|
|
|-
|qMRMLSceneFactoryWidget
|{{Done}}
|
|
|-
|qMRMLSceneViewMenu
|{{Done}}
|
|
|-
|qMRMLScreenShotDialog
|{{Done}}
|
|
|-
|qMRMLSliceControllerWidget
|{{Doing}}
|
|
|-
|qMRMLSliceWidget
|{{Doing}}
|
|
|-
|qMRMLThreeDViewControllerWidget
|{{Done}}
|
|
|-
|qMRMLThreeDView
|{{Doing}}
|
|
|-
|qMRMLThreeDWidget
|{{Doing}}
|
|
|-
|qMRMLTransformSliders
|NA
|
|
|-
|qMRMLTreeView
|{{Doing}}
|
|
|-
|qMRMLVolumeInfoWidget
|{{Done}}
|
|
|-
|qMRMLVolumeThresholdWidget
|{{Done}}
|
|
|-
|qMRMLWindowLevelWidget
|{{Doing}}
|
|
|}
|}
|}


= 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
</gallery>
</gallery>

Latest revision as of 15:57, 4 May 2012

Home < Documentation < Widget testing

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 Znak A-14.png
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 : Yes check.png

  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 : ... X mark.png

Building

Milestones

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

Player/Translators Widget Testing

Summury table, to know each widgets' state.
The state can be Done : Yes check.png , Done with QtTesting issue : Yes check.pngZnak A-14.png , in progress : Znak A-14.png , or without unit test: X mark.png.

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

Screenshots