Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tests to sea ice metrics #1059

Merged
merged 9 commits into from
Mar 4, 2024
Merged

Add tests to sea ice metrics #1059

merged 9 commits into from
Mar 4, 2024

Conversation

acordonez
Copy link
Collaborator

@acordonez acordonez commented Feb 21, 2024

Changes:

  1. Pull functions out of main sea_ice_driver.py script and into a library file under sea_ice/lib/
  2. Create a small test set that address key functions

How to test:

  1. Create dev environment that includes these test dependencies.
  2. Install this branch in dev environment.
  3. Run pytest tests/test_sea_ice.py to run new tests or pytest tests/ to run all tests.

acordonez and others added 7 commits February 21, 2024 13:11
* clean up comments

* remove ignor warnings

* fix logging

* rerun without warnings

* change logging

* time bounds edit

* add plot

* create fig script

* fix json dims

* add shebang

* add import

* move func to lib

* update params

* update dims

---------

Co-authored-by: Ana Ordonez <[email protected]>
@acordonez acordonez marked this pull request as ready for review February 23, 2024 19:50
@lee1043
Copy link
Contributor

lee1043 commented Mar 4, 2024

Review progress

  • Demo 9 notebook (nimbus) -- no error detected for sea_ice_driver.py, consistent results
  • Demo 9 notebook (gates) -- no error detected for sea_ice_driver.py, consistent results
  • manual pytest -- results below: it looks like there is no error from sea-ice unit test
bash-4.2$ pytest 
=========================================================== test session starts ============================================================
platform linux -- Python 3.10.10, pytest-7.3.1, pluggy-1.4.0
rootdir: /home/lee1043/git/pcmdi_metrics_20240202/pcmdi_metrics
configfile: pyproject.toml
plugins: anyio-4.2.0, cov-4.0.0
collected 16 items                                                                                                                         

tests/test_extremes.py 2024-03-04 10:43:44,654 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:44,715 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.2024-03-04 10:43:44,769 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:44,828 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.2024-03-04 10:43:44,907 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:44,971 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.2024-03-04 10:43:45,048 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:45,107 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.2024-03-04 10:43:45,182 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:45,239 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.2024-03-04 10:43:45,311 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
2024-03-04 10:43:45,368 [WARNING]: bounds.py(create_bounds:931) >> The 'lat' coordinate variable is missing a 'units' attribute. Assuming 'units' is 'degrees_north'.
.
tests/test_resources.py ..F
tests/test_sea_ice.py ......Converting units by  multiply 0.01
.

================================================================= FAILURES =================================================================
____________________________________________________________ test_pkg_resources ____________________________________________________________

resource_filename = <MagicMock name='resource_filename' id='140612056115344'>, parse = <MagicMock name='parse' id='140612056320560'>
tmpdir = local('/tmp/pytest-of-lee1043/pytest-0/test_pkg_resources0')

    @mock.patch("pkg_resources.Requirement.parse")
    @mock.patch("pkg_resources.resource_filename")
    def test_pkg_resources(resource_filename, parse, tmpdir):
        resource_filename.return_value = str(tmpdir)
    
        path = resources.resource_path()
    
>       assert path == str(tmpdir)
E       AssertionError: assert '/home/lee104...208/share/pmp' == '/tmp/pytest-...kg_resources0'
E         - /tmp/pytest-of-lee1043/pytest-0/test_pkg_resources0
E         + /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/share/pmp

tests/test_resources.py:47: AssertionError
============================================================= warnings summary =============================================================
../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:106
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:106: DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors.
    __author__ = msg["Author"]

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:107
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:107: DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors.
    __homepage__ = msg["Home-page"]

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:108
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/esmpy/__init__.py:108: DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors.
    __obsoletes__ = msg["obsoletes"]

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/future/standard_library/__init__.py:65
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/future/standard_library/__init__.py:65: DeprecationWarning: the imp module is deprecated in favour of importlib and slated for removal in Python 3.12; see the module's documentation for alternative uses
    import imp

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:121
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:121: DeprecationWarning: pkg_resources is deprecated as an API
    warnings.warn("pkg_resources is deprecated as an API", DeprecationWarning)

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:2870
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:2870: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('mpl_toolkits')`.
  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages
    declare_namespace(pkg)

../../../.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:2870
  /home/lee1043/.conda/envs/pcmdi_metrics_dev_20240208/lib/python3.10/site-packages/pkg_resources/__init__.py:2870: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('sphinxcontrib')`.
  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages
    declare_namespace(pkg)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

---------- coverage: platform linux, python 3.10.10-final-0 ----------
Name                                                                              Stmts   Miss  Cover
-----------------------------------------------------------------------------------------------------
pcmdi_metrics/__init__.py                                                            11      0   100%
pcmdi_metrics/cloud_feedback/__init__.py                                              0      0   100%
pcmdi_metrics/cloud_feedback/cloud_feedback_driver.py                               113    113     0%
pcmdi_metrics/cloud_feedback/lib/__init__.py                                          5      5     0%
pcmdi_metrics/cloud_feedback/lib/argparse_functions.py                               22     22     0%
pcmdi_metrics/cloud_feedback/lib/cal_CloudRadKernel_xr.py                           642    642     0%
pcmdi_metrics/cloud_feedback/lib/cld_fbks_ecs_assessment_v3.py                      662    662     0%
pcmdi_metrics/cloud_feedback/lib/compute_ECS_xr.py                                   88     88     0%
pcmdi_metrics/cloud_feedback/lib/get_assessment.py                                   98     98     0%
pcmdi_metrics/cloud_feedback/lib/lib_cloud_feedback.py                               18     18     0%
pcmdi_metrics/cloud_feedback/lib/organize_jsons.py                                   48     48     0%
pcmdi_metrics/cloud_feedback/lib/zelinka_analysis.py                                 83     83     0%
pcmdi_metrics/diurnal/__init__.py                                                     2      2     0%
pcmdi_metrics/diurnal/common.py                                                      32     32     0%
pcmdi_metrics/diurnal/fourierFFT.py                                                  39     39     0%
pcmdi_metrics/diurnal/scripts/__init__.py                                             0      0   100%
pcmdi_metrics/diurnal/scripts/compositeDiurnalStatistics.py                         131    131     0%
pcmdi_metrics/diurnal/scripts/computeStdOfDailyMeans.py                              86     86     0%
pcmdi_metrics/diurnal/scripts/fourierDiurnalAllGrid.py                               81     81     0%
pcmdi_metrics/diurnal/scripts/fourierDiurnalGridpoints.py                           110    110     0%
pcmdi_metrics/diurnal/scripts/savg_fourier.py                                       162    162     0%
pcmdi_metrics/diurnal/scripts/std_of_dailymeans.py                                  107    107     0%
pcmdi_metrics/diurnal/scripts/std_of_hourlyvalues.py                                113    113     0%
pcmdi_metrics/diurnal/scripts/std_of_meandiurnalcycle.py                            116    116     0%
pcmdi_metrics/enso/__init__.py                                                        0      0   100%
pcmdi_metrics/enso/enso_driver.py                                                   264    264     0%
pcmdi_metrics/enso/lib/__init__.py                                                    1      1     0%
pcmdi_metrics/enso/lib/enso_lib.py                                                  111    111     0%
pcmdi_metrics/extremes/__init__.py                                                    0      0   100%
pcmdi_metrics/extremes/extremes_driver.py                                           314    314     0%
pcmdi_metrics/extremes/lib/__init__.py                                                0      0   100%
pcmdi_metrics/extremes/lib/compute_metrics.py                                       302    218    28%
pcmdi_metrics/extremes/lib/create_extremes_parser.py                                 44     44     0%
pcmdi_metrics/extremes/lib/metadata.py                                               26     26     0%
pcmdi_metrics/extremes/lib/plot_extremes.py                                         123    123     0%
pcmdi_metrics/extremes/lib/region_utilities.py                                       80     80     0%
pcmdi_metrics/extremes/lib/return_value.py                                          347    347     0%
pcmdi_metrics/extremes/lib/utilities.py                                              90     90     0%
pcmdi_metrics/graphics/__init__.py                                                    8      8     0%
pcmdi_metrics/graphics/bar_chart/__init__.py                                          1      1     0%
pcmdi_metrics/graphics/bar_chart/bar_chart.py                                        69     69     0%
pcmdi_metrics/graphics/bar_chart/lib/__init__.py                                      1      1     0%
pcmdi_metrics/graphics/bar_chart/lib/barChart.py                                     33     33     0%
pcmdi_metrics/graphics/parallel_coordinate_plot/__init__.py                           0      0   100%
pcmdi_metrics/graphics/parallel_coordinate_plot/parallel_coordinate_plot_lib.py     170    170     0%
pcmdi_metrics/graphics/portrait_plot/__init__.py                                      0      0   100%
pcmdi_metrics/graphics/portrait_plot/portrait_plot_lib.py                           246    246     0%
pcmdi_metrics/graphics/share/Metrics.py                                              49     49     0%
pcmdi_metrics/graphics/share/__init__.py                                              0      0   100%
pcmdi_metrics/graphics/share/plot_utils.py                                           53     53     0%
pcmdi_metrics/graphics/share/read_json_mean_clim.py                                 120    120     0%
pcmdi_metrics/graphics/taylor_diagram/__init__.py                                     0      0   100%
pcmdi_metrics/graphics/taylor_diagram/taylor_diagram.py                              94     94     0%
pcmdi_metrics/io/__init__.py                                                          6      0   100%
pcmdi_metrics/io/base.py                                                            598    534    11%
pcmdi_metrics/io/default_regions_define.py                                           33     30     9%
pcmdi_metrics/io/region_from_file.py                                                 20     20     0%
pcmdi_metrics/io/xcdat_dataset_io.py                                                 81     62    23%
pcmdi_metrics/io/xcdat_openxml.py                                                    24     15    38%
pcmdi_metrics/mean_climate/__init__.py                                                0      0   100%
pcmdi_metrics/mean_climate/lib/__init__.py                                            6      0   100%
pcmdi_metrics/mean_climate/lib/calculate_climatology.py                              66     61     8%
pcmdi_metrics/mean_climate/lib/compute_metrics.py                                   157    154     2%
pcmdi_metrics/mean_climate/lib/compute_statistics.py                                150    132    12%
pcmdi_metrics/mean_climate/lib/create_mean_climate_parser.py                         39     36     8%
pcmdi_metrics/mean_climate/lib/load_and_regrid.py                                    82     77     6%
pcmdi_metrics/mean_climate/lib/mean_climate_metrics_to_json.py                       30     26    13%
pcmdi_metrics/mean_climate/lib/pmp_parameter.py                                     160    116    28%
pcmdi_metrics/mean_climate/lib/pmp_parser.py                                         22      9    59%
pcmdi_metrics/mean_climate/mean_climate_driver.py                                   185    185     0%
pcmdi_metrics/mean_climate/pcmdi_compute_climatologies.py                            47     47     0%
pcmdi_metrics/misc/__init__.py                                                        0      0   100%
pcmdi_metrics/misc/scripts/__init__.py                                                1      1     0%
pcmdi_metrics/misc/scripts/get_pmp_data.py                                           35     35     0%
pcmdi_metrics/misc/scripts/parallel_submitter.py                                     46     46     0%
pcmdi_metrics/misc/scripts/parallelize_driver.py                                     80     80     0%
pcmdi_metrics/mjo/__init__.py                                                         0      0   100%
pcmdi_metrics/mjo/lib/__init__.py                                                     6      6     0%
pcmdi_metrics/mjo/lib/argparse_functions.py                                          40     40     0%
pcmdi_metrics/mjo/lib/debug_chk_plot.py                                              39     39     0%
pcmdi_metrics/mjo/lib/dict_merge.py                                                   8      8     0%
pcmdi_metrics/mjo/lib/lib_mjo.py                                                    134    134     0%
pcmdi_metrics/mjo/lib/mjo_metric_calc.py                                             97     97     0%
pcmdi_metrics/mjo/lib/plot_wavenumber_frequency_power.py                             52     52     0%
pcmdi_metrics/mjo/lib/post_process_plot.py                                           40     40     0%
pcmdi_metrics/mjo/lib/post_process_plot_ensemble_mean.py                             46     46     0%
pcmdi_metrics/mjo/mjo_metrics_driver.py                                             151    151     0%
pcmdi_metrics/monsoon_sperber/__init__.py                                             0      0   100%
pcmdi_metrics/monsoon_sperber/driver_monsoon_sperber.py                             298    298     0%
pcmdi_metrics/monsoon_sperber/lib/__init__.py                                         4      4     0%
pcmdi_metrics/monsoon_sperber/lib/argparse_functions.py                              32     32     0%
pcmdi_metrics/monsoon_sperber/lib/calc_metrics.py                                    12     12     0%
pcmdi_metrics/monsoon_sperber/lib/divide_chunks.py                                   59     59     0%
pcmdi_metrics/monsoon_sperber/lib/model_land_only.py                                 47     47     0%
pcmdi_metrics/monsoon_wang/__init__.py                                                2      2     0%
pcmdi_metrics/monsoon_wang/monsoon_precip_index_fncs.py                              50     50     0%
pcmdi_metrics/monsoon_wang/monsoon_wang_driver.py                                   134    134     0%
pcmdi_metrics/precip_distribution/__init__.py                                         0      0   100%
pcmdi_metrics/precip_distribution/lib/__init__.py                                     2      2     0%
pcmdi_metrics/precip_distribution/lib/argparse_functions.py                          20     20     0%
pcmdi_metrics/precip_distribution/lib/lib_precip_distribution.py                   1029   1029     0%
pcmdi_metrics/precip_distribution/precip_distribution_driver.py                      63     63     0%
pcmdi_metrics/precip_variability/__init__.py                                          0      0   100%
pcmdi_metrics/precip_variability/lib/__init__.py                                      2      2     0%
pcmdi_metrics/precip_variability/lib/argparse_functions.py                           18     18     0%
pcmdi_metrics/precip_variability/lib/lib_variability_across_timescales.py           223    223     0%
pcmdi_metrics/precip_variability/variability_across_timescales_PS_driver.py          39     39     0%
pcmdi_metrics/resources.py                                                           13      0   100%
pcmdi_metrics/sea_ice/__init__.py                                                     0      0   100%
pcmdi_metrics/sea_ice/lib/__init__.py                                                 1      0   100%
pcmdi_metrics/sea_ice/lib/sea_ice_lib.py                                            223    149    33%
pcmdi_metrics/sea_ice/lib/sea_ice_parser.py                                          34     32     6%
pcmdi_metrics/sea_ice/sea_ice_driver.py                                             273    273     0%
pcmdi_metrics/sea_ice/sea_ice_parallel.py                                            54     54     0%
pcmdi_metrics/stats/__init__.py                                                       1      0   100%
pcmdi_metrics/stats/compute_statistics.py                                           147    129    12%
pcmdi_metrics/utils/__init__.py                                                       5      0   100%
pcmdi_metrics/utils/create_land_sea_mask.py                                          46     37    20%
pcmdi_metrics/utils/create_target_grid.py                                            12      9    25%
pcmdi_metrics/utils/sort_human.py                                                    10      7    30%
pcmdi_metrics/utils/string_constructor.py                                            53     45    15%
pcmdi_metrics/utils/tree_dict.py                                                      3      1    67%
pcmdi_metrics/utils/utils.py                                                         26     26     0%
pcmdi_metrics/variability_mode/__init__.py                                            0      0   100%
pcmdi_metrics/variability_mode/lib/__init__.py                                        7      7     0%
pcmdi_metrics/variability_mode/lib/argparse_functions.py                             54     54     0%
pcmdi_metrics/variability_mode/lib/calc_stat.py                                      80     80     0%
pcmdi_metrics/variability_mode/lib/dict_merge.py                                      6      6     0%
pcmdi_metrics/variability_mode/lib/eof_analysis.py                                  160    160     0%
pcmdi_metrics/variability_mode/lib/landmask.py                                       41     41     0%
pcmdi_metrics/variability_mode/lib/lib_variability_mode.py                           96     96     0%
pcmdi_metrics/variability_mode/lib/plot_map.py                                      154    154     0%
pcmdi_metrics/variability_mode/lib/version.py                                         3      3     0%
pcmdi_metrics/variability_mode/variability_modes_driver.py                          309    309     0%
pcmdi_metrics/version.py                                                              3      0   100%
-----------------------------------------------------------------------------------------------------
TOTAL                                                                             11644  11205     4%
Coverage HTML written to dir tests_coverage_reports/htmlcov
Coverage XML written to file tests_coverage_reports/coverage.xml

========================================================= short test summary info ==========================================================
FAILED tests/test_resources.py::test_pkg_resources - AssertionError: assert '/home/lee104...208/share/pmp' == '/tmp/pytest-...kg_resources0'
================================================ 1 failed, 15 passed, 7 warnings in 21.82s =================================================

@lee1043
Copy link
Contributor

lee1043 commented Mar 4, 2024

@acordonez thank you for the PR. I find no errors from installing the branch and running the Demo 9 notebook. It looks good to me. Please feel free to merge it. (Sorry for the delay for reviewing!)

@acordonez acordonez merged commit d51ca9b into main Mar 4, 2024
5 checks passed
@acordonez acordonez deleted the 405_sic_ao_tests branch March 4, 2024 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants