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

MAINT: testing standards #130

Merged
merged 5 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
* Added manual test for pysat and pysatNASA Release Candidates
* Added manual test for pysatModels RC pip install
* Updated tests to new pysat and pytest standards
* Added a cap for pysatNASA
* Documentation
* Added badges and instructions for PyPi and Zenodo

Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
pysatModels handles model-centric data loading through pysat and contains a
variety of tools to perform model-data analysis, including model validation.

Come join us on Slack! An invitation to the pysat workspace is available
Come join us on Slack! An invitation to the pysat workspace is available
in the 'About' section of the
[pysat GitHub Repository.](https://github.com/pysat/pysat)

Expand All @@ -27,13 +27,13 @@ examples on how to use the routines
pysatModels uses common Python modules, as well as modules developed by and for
the Space Physics community. This module officially supports Python 3.6+.

| Common modules | Community modules |
| ------------------ | ----------------- |
| numpy | pyForecastTools |
| pandas >= 1.4.0 | pysat >= 3.0.4 |
| requests | pysatNASA |
| scipy | |
| xarray | |
| Common modules | Community modules |
| ------------------ | ------------------ |
| numpy | pyForecastTools |
| pandas >= 1.4.0 | pysat >= 3.0.4 |
| requests | pysatNASA <= 0.0.4 |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am ok with the higher cap.

| scipy | |
| xarray | |

## Installation through PyPi

Expand Down
6 changes: 3 additions & 3 deletions docs/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ the Space Physics community. This module officially supports Python 3.6+.
Common modules Community modules
============== =================
numpy pysat
pandas pyForecastTools
requests
pandas pysatNASA
requests pyForecastTools
scipy
xarray
============== =================
Expand Down Expand Up @@ -85,7 +85,7 @@ is set up, you may choose to register the the :py:mod:`pysatModel` model

.. code:: python


import pysat
import pysatModels as pymod

Expand Down
8 changes: 4 additions & 4 deletions pysatModels/tests/test_methods_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
class TestMethodsGeneralLogging(object):
"""Unit tests for log messages raised by general methods."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment."""
self.ch = logging.StreamHandler()
self.ch.setLevel(logging.INFO)
self.model = pysat.Instrument("pysat", "testmodel")

return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment."""

del self.ch, self.model
Expand Down Expand Up @@ -50,7 +50,7 @@ def test_general_clean(self, caplog):
class TestMethodsGeneralDownload(object):
"""Unit tests for general methods handling downloads."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment."""
# TODO(#100): remove if-statement when it is always triggered
tkwargs = {}
Expand All @@ -65,7 +65,7 @@ def setup(self):

return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment."""

if os.path.isfile(self.out_file):
Expand Down
69 changes: 9 additions & 60 deletions pysatModels/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,78 +14,27 @@
import sys
import tempfile

# Import the test classes from pysat
import pysat
from pysat.tests.instrument_test_class import InstTestClass
from pysat.tests.classes import cls_instrument_library as clslib

import pysatModels

# Retrieve the lists of Model instruments and testing methods
instruments = pysat.utils.generate_instrument_list(inst_loc=pysatModels.models)
method_list = [func for func in dir(InstTestClass)
if callable(getattr(InstTestClass, func))]

# Search tests for iteration via pytestmark, update instrument list
for method in method_list:
if hasattr(getattr(InstTestClass, method), 'pytestmark'):
# Get list of names of pytestmarks
mark_name = [mod_mark.name for mod_mark
in getattr(InstTestClass, method).pytestmark]

# Add instruments from your library
if 'all_inst' in mark_name:
mark = pytest.mark.parametrize("inst_name", instruments['names'])
getattr(InstTestClass, method).pytestmark.append(mark)
elif 'download' in mark_name:
mark = pytest.mark.parametrize("inst_dict",
instruments['download'])
getattr(InstTestClass, method).pytestmark.append(mark)
elif 'no_download' in mark_name:
mark = pytest.mark.parametrize("inst_dict",
instruments['no_download'])
getattr(InstTestClass, method).pytestmark.append(mark)


class TestModels(InstTestClass):
instruments = clslib.InstLibTests.initialize_test_package(
clslib.InstLibTests, inst_loc=pysatModels.models)


class TestModels(clslib.InstLibTests):
"""Main class for instrument tests.

Note
----
Uses class level setup and teardown so that all tests use the same
temporary directory. We do not want to geneate a new tempdir for each test,
as the load tests need to be the same as the download tests.
All standard tests, setup, and teardown inherited from the core pysat
instrument test class.

"""

def setup_class(self):
"""Initialize the testing setup once before all tests are run."""
# Make sure to use a temporary directory so that the user setup is not
# altered
# TODO(#100): remove if-statement when it is always triggered
tkwargs = {}
if sys.version_info.major >= 3 and sys.version_info.minor >= 10:
tkwargs = {"ignore_cleanup_errors": True}
self.tempdir = tempfile.TemporaryDirectory(**tkwargs)
self.saved_path = pysat.params['data_dirs']
pysat.params.data['data_dirs'] = [self.tempdir.name]

# Assign the location of the model Instrument sub-modules
self.inst_loc = pysatModels.models
return

def teardown_class(self):
"""Clean up downloaded files and parameters from tests."""

pysat.params.data['data_dirs'] = self.saved_path

# TODO(#100): Remove try/except when Python 3.10 is the lowest version
try:
self.tempdir.cleanup()
except Exception:
pass

del self.inst_loc, self.saved_path, self.tempdir
return


class TestSAMIPysatVersion(object):
"""Test SAMI load code for pysat version differences across v3.0.2."""
Expand Down
8 changes: 4 additions & 4 deletions pysatModels/tests/test_utils_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def eval_xarray_output(inst, xdata):
class TestUtilsConvertLoadModelXarray(object):
"""Unit tests for `utils.convert.load_model_xarray`."""

def setup(self):
def setup_method(self):
"""Create a clean testing setup before each method."""
self.ftime = pysat.instruments.pysat_testing_xarray._test_dates['']['']
self.filename = "%Y-%m-%d.nofile"
Expand All @@ -76,7 +76,7 @@ def setup(self):
self.xout = None
self.temp_file = 'None'

def teardown(self):
def teardown_method(self):
"""Clean up test environment after each method."""
if os.path.isfile(self.temp_file):
os.remove(self.temp_file)
Expand Down Expand Up @@ -130,11 +130,11 @@ def test_load_inst(self, mkey, mval):
class TestUtilsConvertPysatXarray(object):
"""Unit tests for utils.convert.convert_pysat_to_xarray."""

def setup(self):
def setup_method(self):
"""Create a clean testing setup before each method."""
self.ref_time = pysat.instruments.pysat_testing._test_dates['']['']

def teardown(self):
def teardown_method(self):
"""Clean up test environment after each method."""
del self.ref_time

Expand Down
36 changes: 18 additions & 18 deletions pysatModels/tests/test_utils_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
class TestUtilsExtractInstThroughMod(object):
"""Unit tests for `instrument_view_through_model`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing')
Expand Down Expand Up @@ -51,7 +51,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out, self.input_kwargs
Expand Down Expand Up @@ -205,7 +205,7 @@ def test_success_for_some_already_ran_data(self, caplog):
class TestUtilsExtractModObs(TestUtilsExtractInstThroughMod):
"""Unit tests for `utils.extract.extract_modelled_observations`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing')
Expand Down Expand Up @@ -233,7 +233,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out, self.input_kwargs
Expand Down Expand Up @@ -351,7 +351,7 @@ def test_success_for_some_already_ran_data(self, caplog):
class TestUtilsExtractModObsXarray(TestUtilsExtractModObs):
"""Xarray unit tests for `utils.extract.extract_modelled_observations`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing_xarray')
Expand Down Expand Up @@ -379,7 +379,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out, self.input_kwargs
Expand All @@ -393,7 +393,7 @@ def teardown(self):
class TestUtilsExtractModObsXarray2D(TestUtilsExtractModObs):
"""Xarray unit tests for `utils.extract.extract_modelled_observations`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray')
Expand Down Expand Up @@ -421,7 +421,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out, self.input_kwargs
Expand All @@ -431,7 +431,7 @@ def teardown(self):
class TestUtilsExtractInstModViewXarray(TestUtilsExtractInstThroughMod):
"""Xarray unit tests for `instrument_view_through_model`."""

def setup(self):
def setup_method(self):
"""Run before every method to create a clean testing setup."""

self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray')
Expand Down Expand Up @@ -464,7 +464,7 @@ def setup(self):

return

def teardown(self):
def teardown_method(self):
"""Run after every method to clean up previous testing."""

del self.inst, self.model, self.input_args, self.out, self.input_kwargs
Expand All @@ -482,7 +482,7 @@ def teardown(self):
class TestUtilsAltitudePressure(object):
"""Unit tests for `utils.extract.instrument_altitude_to_model_pressure`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing')
Expand All @@ -509,7 +509,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out
Expand Down Expand Up @@ -618,7 +618,7 @@ def test_alternate_output_names(self):
class TestUtilsAltitudePressureXarray(TestUtilsAltitudePressure):
"""Xarray unit tests for `instrument_altitude_to_model_pressure`."""

def setup(self):
def setup_method(self):
"""Set up the unit test environment for each method."""

self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray')
Expand All @@ -645,7 +645,7 @@ def setup(self):
self.out = []
return

def teardown(self):
def teardown_method(self):
"""Clean up the unit test environment after each method."""

del self.inst, self.model, self.input_args, self.out
Expand All @@ -660,7 +660,7 @@ def teardown(self):
class TestUtilsExtractInstModIrregView(object):
"""Unit tests for `utils.extract.instrument_view_irregular_model`."""

def setup(self):
def setup_method(self):
"""Run before every method to create a clean testing setup."""

self.inst = pysat.Instrument(platform='pysat', name='testing',
Expand Down Expand Up @@ -689,7 +689,7 @@ def setup(self):

return

def teardown(self):
def teardown_method(self):
"""Run after every method to clean up previous testing."""

del self.inst, self.model, self.input_args, self.out, self.in_kwargs
Expand Down Expand Up @@ -773,7 +773,7 @@ def test_bad_kwarg_input(self, bad_key, bad_val, err_msg):
class TestUtilsExtractInstModIrregViewXarray(TestUtilsExtractInstModIrregView):
"""Xarray unit tests for `instrument_view_irregular_model`."""

def setup(self):
def setup_method(self):
"""Run before every method to create a clean testing setup."""

self.inst = pysat.Instrument(platform='pysat', name='testing2d_xarray',
Expand Down Expand Up @@ -802,7 +802,7 @@ def setup(self):

return

def teardown(self):
def teardown_method(self):
"""Run after every method to clean up previous testing."""

del self.inst, self.model, self.input_args, self.out, self.in_kwargs
Expand Down
Loading
Loading