Improve code coverage by automated tests
The code was, until now, tested only by users trying to go through tutorial.
An automated testing framework as been developed and some functionalities tested (in !58 (merged)).
Here is the current coverage of the freewat code (in !60 (merged)):
Name Stmts Miss Cover Missing
------------------------------------------------------------------------------------------
Freewat.py 760 760 0% 2-1528
SimplePlotCalibration.py 159 159 0% 29-324
__init__.py 4 2 50% 34-35
akvaGIS/AKSettings.py 123 123 0% 12-553
akvaGIS/__init__.py 4 4 0% 12-27
akvaGIS/akvaGIS.py 127 127 0% 12-280
akvaGIS/feature/AKFeature.py 140 140 0% 12-193
akvaGIS/feature/AKFeatureChemTimePlot.py 11 11 0% 12-30
akvaGIS/feature/AKFeatureCloseDB.py 28 28 0% 12-52
akvaGIS/feature/AKFeatureCreateDB.py 175 175 0% 12-238
akvaGIS/feature/AKFeatureCustomChart.py 43 43 0% 12-66
akvaGIS/feature/AKFeatureCustomChartChem.py 13 13 0% 12-65
akvaGIS/feature/AKFeatureCustomChartHydro.py 11 11 0% 12-28
akvaGIS/feature/AKFeatureDBManagement.py 180 180 0% 12-291
akvaGIS/feature/AKFeatureEasyQuim.py 11 11 0% 12-33
akvaGIS/feature/AKFeatureExcelMix.py 11 11 0% 12-33
akvaGIS/feature/AKFeatureHydroTimePlot.py 14 14 0% 12-36
akvaGIS/feature/AKFeatureIonicBalance.py 11 11 0% 12-33
akvaGIS/feature/AKFeatureMapChem.py 11 11 0% 12-33
akvaGIS/feature/AKFeatureMapHydro.py 14 14 0% 12-33
akvaGIS/feature/AKFeatureMapHydroSurface.py 108 108 0% 12-173
akvaGIS/feature/AKFeatureMapNormative.py 75 75 0% 12-126
akvaGIS/feature/AKFeatureMapStiff.py 11 11 0% 12-30
akvaGIS/feature/AKFeaturePiper.py 11 11 0% 12-30
akvaGIS/feature/AKFeatureSAR.py 11 11 0% 12-30
akvaGIS/feature/AKFeatureSBD.py 12 12 0% 12-31
akvaGIS/feature/AKFeatureSamples.py 347 347 0% 12-435
akvaGIS/feature/AKFeatureSamplesChemistry.py 32 32 0% 12-137
akvaGIS/feature/AKFeatureSamplesHydrogeology.py 38 38 0% 12-127
akvaGIS/feature/AKFeatureStatQuimet.py 11 11 0% 12-30
akvaGIS/feature/AKFeatureStiffPlot.py 11 11 0% 12-30
akvaGIS/feature/__init__.py 0 0 100%
akvaGIS/feature/measurements/AKFeatureMeasurements.py 252 252 0% 12-317
akvaGIS/feature/measurements/AKFeatureMeasurementsChem.py 14 14 0% 12-115
akvaGIS/feature/measurements/AKFeatureMeasurementsHydro.py 18 18 0% 12-76
akvaGIS/feature/measurements/__init__.py 0 0 100%
akvaGIS/feature/results/AKFeatureResults.py 254 254 0% 12-365
akvaGIS/feature/results/AKFeatureResultsEasyQuim.py 108 108 0% 12-154
akvaGIS/feature/results/AKFeatureResultsExcelMix.py 121 121 0% 13-207
akvaGIS/feature/results/AKFeatureResultsIonicBalance.py 203 203 0% 12-292
akvaGIS/feature/results/AKFeatureResultsMap.py 84 84 0% 12-137
akvaGIS/feature/results/AKFeatureResultsMapChem.py 5 5 0% 12-25
akvaGIS/feature/results/AKFeatureResultsMapHydro.py 8 8 0% 12-29
akvaGIS/feature/results/AKFeatureResultsMapNormative.py 44 44 0% 12-76
akvaGIS/feature/results/AKFeatureResultsMapStiff.py 95 95 0% 12-135
akvaGIS/feature/results/AKFeatureResultsPiper.py 138 138 0% 12-188
akvaGIS/feature/results/AKFeatureResultsPlot.py 87 87 0% 12-131
akvaGIS/feature/results/AKFeatureResultsSAR.py 61 61 0% 12-93
akvaGIS/feature/results/AKFeatureResultsSBD.py 50 50 0% 12-76
akvaGIS/feature/results/AKFeatureResultsStatQuimet.py 87 87 0% 12-136
akvaGIS/feature/results/AKFeatureResultsStiff.py 87 87 0% 12-123
akvaGIS/feature/results/AKFeatureResultsTimePlot.py 39 39 0% 12-71
akvaGIS/feature/results/AKFeatureResultsTimePlotChem.py 7 7 0% 12-27
akvaGIS/feature/results/AKFeatureResultsTimePlotHydro.py 10 10 0% 12-31
akvaGIS/feature/results/__init__.py 0 0 100%
akvaGIS/form/AKForm.py 11 11 0% 12-30
akvaGIS/form/AKFormCreateDB.py 9 9 0% 12-29
akvaGIS/form/AKFormDBManagement.py 9 9 0% 12-29
akvaGIS/form/AKFormHydroUnitSelection.py 9 9 0% 12-29
akvaGIS/form/AKFormNormative.py 9 9 0% 12-29
akvaGIS/form/AKFormQueryMeasurements.py 9 9 0% 12-29
akvaGIS/form/AKFormQuerySamples.py 9 9 0% 12-29
akvaGIS/form/AKFormSamplesResults.py 8 8 0% 12-28
akvaGIS/form/AKWidget.py 9 9 0% 12-27
akvaGIS/form/AKWidgetExportMixSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetGeneralMapSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetGeneralPlotSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetPiperPlotSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetSARPlotSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetStiffMapSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetStiffPlotSettings.py 9 9 0% 12-29
akvaGIS/form/AKWidgetTimePlotSettings.py 9 9 0% 12-29
akvaGIS/form/AkvaColorButton.py 18 18 0% 6-33
akvaGIS/form/__init__.py 0 0 100%
akvaGIS/model/PlotSettingsModel.py 42 42 0% 12-71
akvaGIS/model/QueryManagerSamplesModel.py 33 33 0% 12-57
akvaGIS/model/SamplesMeasurementsModel.py 161 161 0% 12-233
akvaGIS/model/SamplesMeasurementsModelHydro.py 25 25 0% 12-55
akvaGIS/model/SavedQueryMeasurementsModel.py 147 147 0% 12-189
akvaGIS/model/__init__.py 0 0 100%
akvaGIS/resources/__init__.py 0 0 100%
akvaGIS/resources/resources.py 9 9 0% 9-2816
akvaGIS/utils/TableUtils.py 36 36 0% 12-68
akvaGIS/utils/__init__.py 0 0 100%
akvaGIS/view/CheckBoxDelegate.py 55 55 0% 12-107
akvaGIS/view/__init__.py 0 0 100%
createGrid_utils.py 455 336 26% 103-107, 112, 117-120, 129-141, 157, 165-224, 235-251, 269-291, 300-332, 339-408, 441, 453, 473-519, 677-723, 734-772, 777-782, 793-850, 863-921, 935-981, 992-1008, 1020-1060, 1072-1105
crop_utils.py 89 89 0% 27-202
dialogs/__init__.py 0 0 100%
dialogs/aboutdialog.py 26 26 0% 29-70
dialogs/addStressPeriod_dialog.py 101 101 0% 29-196
dialogs/copyFromVector_dialog.py 192 49 74% 60, 63, 159-216, 227, 229, 231, 233, 235, 237, 239, 241, 243, 247, 268
dialogs/copyRasterToFields_dialog.py 41 41 0% 28-94
dialogs/createCHDLayer_dialog.py 49 49 0% 29-110
dialogs/createCropTable_dialog.py 66 16 76% 61-62, 85-86, 96-116
dialogs/createDRNLayer_dialog.py 112 112 0% 29-226
dialogs/createEVTLayer_dialog.py 115 115 0% 29-211
dialogs/createFarmCrop_dialog.py 50 7 86% 79-83, 104-105
dialogs/createFarmId_dialog.py 51 7 86% 77-81, 104-105
dialogs/createFarmPipeline_dialog.py 51 7 86% 78-82, 105-106
dialogs/createFarmWells_dialog.py 50 7 86% 79-83, 105-106
dialogs/createGHBLayer_dialog.py 111 111 0% 29-228
dialogs/createGrid_dialog.py 179 28 84% 129-133, 146-150, 155-160, 191-192, 203, 207, 211, 216, 226-227, 244-247, 259-261, 281-282, 367
dialogs/createHOBLayer_dialog.py 73 73 0% 28-139
dialogs/createLAKLayer_dialog.py 409 409 0% 22-800
dialogs/createMNWLayer_dialog.py 150 150 0% 29-287
dialogs/createModelBuilder_dialog.py 2252 2252 0% 27-3531
dialogs/createModelLayer_dialog.py 66 1 98% 78
dialogs/createModel_dialog.py 97 14 86% 66-70, 73-74, 77-81, 94-95, 110
dialogs/createParams2dArray_dialog.py 387 387 0% 28-573
dialogs/createParams3dArray_dialog.py 350 350 0% 28-552
dialogs/createPartikelTracking_dialog.py 229 229 0% 28-425
dialogs/createRCHLayer_dialog.py 47 47 0% 29-103
dialogs/createRIVLayer_dialog.py 111 111 0% 28-224
dialogs/createRVOBLayer_dialog.py 190 190 0% 28-340
dialogs/createReactionLayer_dialog.py 47 47 0% 28-105
dialogs/createSFRLayer_dialog.py 86 86 0% 29-181
dialogs/createSMLLayer_dialog.py 57 57 0% 29-117
dialogs/createSSMLayer_dialog.py 193 193 0% 29-302
dialogs/createSoilsTable_dialog.py 65 65 0% 29-138
dialogs/createTRNSPLayer_dialog.py 48 48 0% 29-132
dialogs/createTransportModel_dialog.py 126 126 0% 29-256
dialogs/createUSBLayer_dialog.py 41 41 0% 29-95
dialogs/createUZFLayer_dialog.py 54 54 0% 29-116
dialogs/createUZTLayer_dialog.py 44 44 0% 28-98
dialogs/createWELLayer_dialog.py 54 7 87% 76-80, 106-107
dialogs/createWaterSitesTable_dialog.py 74 7 91% 79-83, 99-100
dialogs/createZoneLayer_dialog.py 55 55 0% 29-118
dialogs/crop_dialog.py 216 216 0% 27-444
dialogs/farm_crop_dialog.py 89 0 100%
dialogs/loadClimateData_dialog.py 60 60 0% 28-141
dialogs/loadCropCoefficients_dialog.py 59 59 0% 28-127
dialogs/loadGWAllotments_dialog.py 59 59 0% 28-127
dialogs/loadNRDeliveries_dialog.py 59 59 0% 28-127
dialogs/loadSWAllotments_dialog.py 59 59 0% 28-127
dialogs/mergeTools_dialog.py 81 81 0% 29-178
dialogs/plotWaterUnitBudget_dialog.py 194 194 0% 28-272
dialogs/programLocations_dialog.py 72 72 0% 29-155
dialogs/runUSBcalculus_dialog.py 187 187 0% 13-327
dialogs/runZoneBudget_dialog.py 84 84 0% 29-174
dialogs/updateWd.py 48 6 88% 61-65, 85-86
dialogs/viewBudget_dialog.py 72 72 0% 29-139
dialogs/viewCrossSection_dialog.py 130 130 0% 29-228
dialogs/viewOutput_dialog.py 204 204 0% 29-358
flopyaddon/__init__.py 15 15 0% 1-15
flopyaddon/mfflwob.py 97 97 0% 1-230
flopyaddon/mffmp.py 271 271 0% 1-669
flopyaddon/mfhob.py 87 87 0% 1-239
flopyaddon/mflak.py 402 402 0% 10-669
flopyaddon/mflmt8.py 88 88 0% 10-224
flopyaddon/mfoc88freewat.py 213 213 0% 11-488
flopyaddon/mfusb.py 121 121 0% 9-243
flopyaddon/mfuzf1_corrected.py 180 180 0% 11-447
flopyaddon/mfzbd.py 41 41 0% 1-107
flopyaddon/mpnew.py 155 155 0% 1-247
flopyaddon/mtusgs.py 257 257 0% 1-660
flopyaddon/mtuzt.py 268 268 0% 1-598
flopyaddon/params.py 23 23 0% 1-71
flopyaddon/templatewriter.py 44 44 0% 1-96
flopyaddon/tplarray.py 101 101 0% 1-182
flopyaddon/ucode_in.py 143 143 0% 1-355
flopyaddon/util_array.py 1029 1029 0% 8-2646
freewat_formulas.py 59 52 12% 33, 36-37, 51-81, 97-135
freewat_utils.py 442 265 40% 64, 69-71, 80, 83-88, 91-96, 100-106, 109-115, 127-130, 134-147, 156-198, 201-213, 217-220, 223-228, 232-238, 244-292, 296-305, 310-340, 343, 347-359, 407-416, 434-441, 448-467, 483-508, 515-517, 539, 556, 645-651, 686-710, 725-729
ftools_utils.py 260 222 15% 67-72, 76-81, 85-88, 92-97, 101-108, 112-115, 119-124, 128-152, 156-164, 168-182, 186-190, 194-207, 211-216, 220-226, 230-236, 246, 250, 254-259, 263-273, 277, 281-293, 298-311, 315-326, 330-332, 336-353, 356-364, 367-384, 387-391
install/__init__.py 1 1 0% 2
install/installer.py 73 73 0% 23-133
install/installerLinux.py 71 71 0% 22-148
install/installerWindows.py 109 109 0% 1-204
install/linuxUi.py 43 43 0% 23-97
install/ui/__init__.py 0 0 100%
install/version.py 3 3 0% 1-3
install/windowsUi.py 37 37 0% 22-90
install/writeFile.py 6 6 0% 2-9
logger.py 18 8 56% 19-20, 28-29, 33-39
mdoCreate_utils.py 1885 1554 18% 413-419, 424-450, 490-512, 519-537, 558-817, 831-1051, 1074-1310, 1324-1534, 1559-1769, 1784-1995, 2009-2052, 2066-2107, 2118-2145, 2161-2342, 2347-2362, 2369-2408, 2413-2440, 2448-2468, 2480-2533, 2541-2579, 2747-3179, 3196-3454, 3460-3478
modpath/__init__.py 0 0 100%
modpath/exeRunner.py 3 3 0% 1-5
modpath/inputCreator.py 50 50 0% 2-99
modpath/modpathAdapter.py 8 8 0% 1-28
oat/__init__.py 4 4 0% 22-25
oat/config.py 7 7 0% 22-33
oat/oatInit.py 50 50 0% 22-120
oat/oatlib/__init__.py 1 1 0% 22
oat/oatlib/method.py 526 526 0% 2-1050
oat/oatlib/model.py 80 80 0% 22-189
oat/oatlib/oat_algorithms.py 67 67 0% 3-306
oat/oatlib/oat_utils.py 226 226 0% 2-448
oat/oatlib/sensor.py 615 615 0% 2-1225
oat/oatlib/yearbook_report.py 97 97 0% 2-209
oat/plugin/__init__.py 0 0 100%
oat/plugin/compare/__init__.py 0 0 100%
oat/plugin/compare/sensorCompare_dialog.py 77 77 0% 22-157
oat/plugin/createSensor/__init__.py 0 0 100%
oat/plugin/createSensor/create/__init__.py 1 1 0% 22
oat/plugin/createSensor/create/csvManager.py 111 111 0% 22-223
oat/plugin/createSensor/create/gageManager.py 34 34 0% 22-82
oat/plugin/createSensor/create/hobfileManager.py 51 51 0% 22-111
oat/plugin/createSensor/create/istsosManager.py 174 174 0% 22-329
oat/plugin/createSensor/create/listfileManager.py 35 35 0% 22-81
oat/plugin/createSensor/create/rawManager.py 100 100 0% 22-195
oat/plugin/createSensor/createSensor_dialog.py 274 274 0% 22-503
oat/plugin/createSensor/qgisPointListener.py 31 31 0% 22-74
oat/plugin/createSensor/sosServer_dialog.py 80 80 0% 22-171
oat/plugin/databaseManager.py 42 42 0% 22-94
oat/plugin/matplotWidget.py 57 57 0% 22-123
oat/plugin/multiSensor/__init__.py 0 0 100%
oat/plugin/multiSensor/createMultipleSensor_dialog.py 36 36 0% 22-90
oat/plugin/multiSensor/loader/__init__.py 0 0 100%
oat/plugin/multiSensor/loader/istsos.py 180 180 0% 22-341
oat/plugin/multiSensor/loader/multicsv.py 232 232 0% 22-426
oat/plugin/process/__init__.py 0 0 100%
oat/plugin/process/imagePlayer.py 32 32 0% 22-83
oat/plugin/process/processThread.py 379 379 0% 23-622
oat/plugin/process/processTs_dialog.py 327 327 0% 23-563
oat/plugin/process/saveSensorList_dialog.py 58 58 0% 23-119
oat/plugin/sensorManager/__init__.py 0 0 100%
oat/plugin/sensorManager/cloneSensor_dialog.py 72 72 0% 22-142
oat/plugin/sensorManager/sensorManager_dialog.py 233 233 0% 23-415
package.py 36 36 0% 3-70
plotting/BubblePlot.py 119 119 0% 1-173
plotting/DataReader.py 122 122 0% 1-186
plotting/MatplotlibWidgetPlot.py 15 15 0% 22-54
plotting/PlottingAdapter.py 169 169 0% 1-235
plotting/__init__.py 0 0 100%
plotting/plot.py 107 107 0% 1-158
plotting/tests/__init__.py 0 0 100%
plotting/tests/bubble_test.py 14 14 0% 1-21
plotting/tests/plotting_test.py 127 127 0% 1-148
plotting/tests/test_runner.py 13 13 0% 1-17
resources.py 9 9 0% 10-1618
resources_rc.py 9 9 0% 10-1872
runPlotCalibration_dialog.py 148 148 0% 28-247
sqlite_utils.py 230 143 38% 38, 42, 46-51, 87, 92-94, 109, 113-114, 123, 137-142, 173, 193, 198, 215-359, 370-410, 437-450
test/__init__.py 29 4 86% 39-42
test/__main__.py 23 5 78% 31-33, 38-39
test/copyFromVector_test.py 39 2 95% 51-52
test/createFarmCrop_test.py 29 3 90% 16, 27-28
test/createFarmPipeline_test.py 29 3 90% 17, 28-29
test/createFarmWells_test.py 35 3 91% 19, 36-37
test/createWaterSitesTable_test.py 33 3 91% 17, 35-36
test/farm_crop_dialog_test.py 31 3 90% 18, 37-38
test/run_usb.py 27 27 0% 2-52
test/run_zonefile_writer.py 22 22 0% 2-47
test/template_run.py 11 11 0% 2-26
test/test_RiverToFields.py 17 17 0% 1-41
test/test_hob.py 11 11 0% 2-27
test/test_params2D.py 11 11 0% 2-26
test/test_params3D.py 11 11 0% 2-26
test/test_reading_list.py 25 25 0% 12-63
test/test_run.py 21 21 0% 2-35
test/test_rvob.py 11 11 0% 2-26
test/test_sqliteutils.py 7 7 0% 12-21
test/test_uzf.py 7 7 0% 6-21
test/updateWd_test.py 33 3 91% 20, 38-39
test/utils.py 36 0 100%
------------------------------------------------------------------------------------------
TOTAL 26193 24223 8%
There is a long way to go, but for the it would be nice to identify the critical pieces that need testing first.