Skip to content

Commit 8379737

Browse files
Move long-runtime unit tests to integration tests (#709)
Moved tests: * climada/util/test/test_lines_polys_handler/test_calc_geom_impact_polys (~ 15.5 sec) * climada/hazard/test/test_storm_europe/test_icon_read (~ 4.5 sec) * climada/hazard/test/test_storm_europe/test_from_footprints (~ 6 sec) * climada/hazard/test/test_ibtracks_with_basin (~6 sec) * climada/hazard/test/test_cutoff_tracks (~5 sec) * climada/hazard/test/test_base/test_write_read_pass (4.5 sec) * climada/hazard/test/test_base/test_raster_to_vector_pass (3.5 sec) * climada/hazard/test/test_base/test_reproject_raster_pass (3.6 sec) --------- Co-authored-by: Lukas Riedel <[email protected]>
1 parent f0fd3a5 commit 8379737

File tree

8 files changed

+497
-313
lines changed

8 files changed

+497
-313
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Removed:
3030
- Added test for non-default impact function id in the `lines_polys_handler` [#676](https://github.com/CLIMADA-project/climada_python/pull/676)
3131
- The sigmoid and step impact functions now require the user to define the hazard type. [#675](https://github.com/CLIMADA-project/climada_python/pull/675)
3232
- Improved error messages produced by `ImpactCalc.impact()` in case hazard type is not found in exposures/impf_set [#691](https://github.com/CLIMADA-project/climada_python/pull/691)
33+
- Tests with long runtime were moved to integration tests in `climada/test` [#709](https://github.com/CLIMADA-project/climada_python/pull/709)
3334

3435
### Fixed
3536

climada/hazard/test/test_base.py

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,46 +1213,6 @@ def test_hazard_pass(self):
12131213
class TestHDF5(unittest.TestCase):
12141214
"""Test reader functionality of the ExposuresExcel class"""
12151215

1216-
def test_write_read_pass(self):
1217-
"""Read a hazard mat file correctly."""
1218-
file_name = str(DATA_DIR.joinpath('test_haz.h5'))
1219-
1220-
# Read demo matlab file
1221-
hazard = Hazard.from_mat(HAZ_TEST_MAT)
1222-
hazard.event_name = list(map(str, hazard.event_name))
1223-
for todense_flag in [False, True]:
1224-
if todense_flag:
1225-
hazard.write_hdf5(file_name, todense=todense_flag)
1226-
else:
1227-
hazard.write_hdf5(file_name)
1228-
1229-
haz_read = Hazard.from_hdf5(file_name)
1230-
1231-
self.assertEqual(str(hazard.tag.file_name), haz_read.tag.file_name)
1232-
self.assertIsInstance(haz_read.tag.file_name, str)
1233-
self.assertEqual(hazard.tag.haz_type, haz_read.tag.haz_type)
1234-
self.assertIsInstance(haz_read.tag.haz_type, str)
1235-
self.assertEqual(hazard.tag.description, haz_read.tag.description)
1236-
self.assertIsInstance(haz_read.tag.description, str)
1237-
self.assertEqual(hazard.units, haz_read.units)
1238-
self.assertIsInstance(haz_read.units, str)
1239-
self.assertTrue(np.array_equal(hazard.centroids.coord, haz_read.centroids.coord))
1240-
self.assertTrue(u_coord.equal_crs(hazard.centroids.crs, haz_read.centroids.crs))
1241-
self.assertTrue(np.array_equal(hazard.event_id, haz_read.event_id))
1242-
self.assertTrue(np.array_equal(hazard.frequency, haz_read.frequency))
1243-
self.assertEqual(hazard.frequency_unit, haz_read.frequency_unit)
1244-
self.assertIsInstance(haz_read.frequency_unit, str)
1245-
self.assertTrue(np.array_equal(hazard.event_name, haz_read.event_name))
1246-
self.assertIsInstance(haz_read.event_name, list)
1247-
self.assertIsInstance(haz_read.event_name[0], str)
1248-
self.assertTrue(np.array_equal(hazard.date, haz_read.date))
1249-
self.assertTrue(np.array_equal(hazard.orig, haz_read.orig))
1250-
self.assertTrue(np.array_equal(hazard.intensity.toarray(),
1251-
haz_read.intensity.toarray()))
1252-
self.assertIsInstance(haz_read.intensity, sparse.csr_matrix)
1253-
self.assertTrue(np.array_equal(hazard.fraction.toarray(), haz_read.fraction.toarray()))
1254-
self.assertIsInstance(haz_read.fraction, sparse.csr_matrix)
1255-
12561216
def test_write_read_unsupported_type(self):
12571217
"""Check if the write command correctly handles unsupported types"""
12581218
file_name = str(DATA_DIR.joinpath('test_unsupported.h5'))
@@ -1280,52 +1240,6 @@ class CustomID:
12801240
class TestCentroids(unittest.TestCase):
12811241
"""Test return period statistics"""
12821242

1283-
def test_reproject_raster_pass(self):
1284-
"""Test reproject_raster reference."""
1285-
haz_fl = Hazard.from_raster([HAZ_DEMO_FL])
1286-
haz_fl.check()
1287-
1288-
haz_fl.reproject_raster(dst_crs='epsg:2202')
1289-
1290-
self.assertEqual(haz_fl.intensity.shape, (1, 1046408))
1291-
self.assertIsInstance(haz_fl.intensity, sparse.csr_matrix)
1292-
self.assertIsInstance(haz_fl.fraction, sparse.csr_matrix)
1293-
self.assertEqual(haz_fl.fraction.shape, (1, 1046408))
1294-
self.assertTrue(u_coord.equal_crs(haz_fl.centroids.meta['crs'], 'epsg:2202'))
1295-
self.assertEqual(haz_fl.centroids.meta['width'], 968)
1296-
self.assertEqual(haz_fl.centroids.meta['height'], 1081)
1297-
self.assertEqual(haz_fl.fraction.min(), 0)
1298-
self.assertEqual(haz_fl.fraction.max(), 1)
1299-
self.assertEqual(haz_fl.intensity.min(), -9999)
1300-
self.assertTrue(haz_fl.intensity.max() < 4.7)
1301-
1302-
def test_raster_to_vector_pass(self):
1303-
"""Test raster_to_vector method"""
1304-
haz_fl = Hazard.from_raster([HAZ_DEMO_FL], haz_type='FL')
1305-
haz_fl.check()
1306-
meta_orig = haz_fl.centroids.meta
1307-
inten_orig = haz_fl.intensity
1308-
fract_orig = haz_fl.fraction
1309-
1310-
haz_fl.raster_to_vector()
1311-
1312-
self.assertEqual(haz_fl.centroids.meta, dict())
1313-
self.assertAlmostEqual(haz_fl.centroids.lat.min(),
1314-
meta_orig['transform'][5]
1315-
+ meta_orig['height'] * meta_orig['transform'][4]
1316-
- meta_orig['transform'][4] / 2)
1317-
self.assertAlmostEqual(haz_fl.centroids.lat.max(),
1318-
meta_orig['transform'][5] + meta_orig['transform'][4] / 2)
1319-
self.assertAlmostEqual(haz_fl.centroids.lon.max(),
1320-
meta_orig['transform'][2]
1321-
+ meta_orig['width'] * meta_orig['transform'][0]
1322-
- meta_orig['transform'][0] / 2)
1323-
self.assertAlmostEqual(haz_fl.centroids.lon.min(),
1324-
meta_orig['transform'][2] + meta_orig['transform'][0] / 2)
1325-
self.assertTrue(u_coord.equal_crs(haz_fl.centroids.crs, meta_orig['crs']))
1326-
self.assertTrue(np.allclose(haz_fl.intensity.data, inten_orig.data))
1327-
self.assertTrue(np.allclose(haz_fl.fraction.data, fract_orig.data))
1328-
13291243
def test_reproject_vector_pass(self):
13301244
"""Test reproject_vector"""
13311245
haz_fl = Hazard('FL',

climada/hazard/test/test_storm_europe.py

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -44,55 +44,6 @@ def test_centroids_from_nc(self):
4444
self.assertTrue(isinstance(cent, Centroids))
4545
self.assertEqual(cent.size, 9944)
4646

47-
def test_from_footprints(self):
48-
"""Test from_footprints constructor, using one small test files"""
49-
def _test_first(haz):
50-
"""Test the expected first entry of the hazard"""
51-
self.assertEqual(haz.tag.haz_type, 'WS')
52-
self.assertEqual(haz.units, 'm/s')
53-
self.assertEqual(haz.event_id.size, 1)
54-
self.assertEqual(haz.date.size, 1)
55-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).year, 1999)
56-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).month, 12)
57-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).day, 26)
58-
self.assertEqual(haz.event_id[0], 1)
59-
self.assertEqual(haz.event_name[0], 'Lothar')
60-
self.assertIsInstance(haz.intensity,
61-
sparse.csr.csr_matrix)
62-
self.assertIsInstance(haz.fraction,
63-
sparse.csr.csr_matrix)
64-
self.assertEqual(haz.intensity.shape, (1, 9944))
65-
self.assertEqual(haz.fraction.shape, (1, 9944))
66-
self.assertEqual(haz.frequency[0], 1.0)
67-
68-
# Load first entry
69-
storms = StormEurope.from_footprints(
70-
WS_DEMO_NC[0], description='test_description')
71-
_test_first(storms)
72-
73-
# Omit the second file, should be the same result
74-
storms = StormEurope.from_footprints(WS_DEMO_NC, files_omit=str(WS_DEMO_NC[1]))
75-
_test_first(storms)
76-
77-
# Now load both
78-
storms = StormEurope.from_footprints(WS_DEMO_NC, description='test_description')
79-
80-
self.assertEqual(storms.tag.haz_type, 'WS')
81-
self.assertEqual(storms.units, 'm/s')
82-
self.assertEqual(storms.event_id.size, 2)
83-
self.assertEqual(storms.date.size, 2)
84-
self.assertEqual(dt.datetime.fromordinal(storms.date[0]).year, 1999)
85-
self.assertEqual(dt.datetime.fromordinal(storms.date[0]).month, 12)
86-
self.assertEqual(dt.datetime.fromordinal(storms.date[0]).day, 26)
87-
self.assertEqual(storms.event_id[0], 1)
88-
self.assertEqual(storms.event_name[0], 'Lothar')
89-
self.assertIsInstance(storms.intensity,
90-
sparse.csr.csr_matrix)
91-
self.assertIsInstance(storms.fraction,
92-
sparse.csr.csr_matrix)
93-
self.assertEqual(storms.intensity.shape, (2, 9944))
94-
self.assertEqual(storms.fraction.shape, (2, 9944))
95-
9647
def test_read_with_ref(self):
9748
"""Test from_footprints while passing in a reference raster."""
9849
storms = StormEurope.from_footprints(WS_DEMO_NC, ref_raster=WS_DEMO_NC[1])
@@ -197,47 +148,6 @@ def test_cosmoe_read(self):
197148
self.assertAlmostEqual(haz.intensity.max(), 36.426735,places=3)
198149
self.assertEqual(haz.fraction.shape, (21, 25))
199150

200-
def test_icon_read(self):
201-
"""test reading from icon grib"""
202-
# for this test the forecast file is supposed to be already downloaded from the dwd
203-
# another download would fail because the files are available for 24h only
204-
# instead, we download it as a test dataset through the climada data api
205-
apiclient = Client()
206-
ds = apiclient.get_dataset_info(name='test_storm_europe_icon_2021012800', status='test_dataset')
207-
dsdir, _ = apiclient.download_dataset(ds)
208-
haz = StormEurope.from_icon_grib(
209-
dt.datetime(2021, 1, 28),
210-
dt.datetime(2021, 1, 28),
211-
model_name='test',
212-
grib_dir=dsdir,
213-
delete_raw_data=False)
214-
self.assertEqual(haz.tag.haz_type, 'WS')
215-
self.assertEqual(haz.units, 'm/s')
216-
self.assertEqual(haz.event_id.size, 40)
217-
self.assertEqual(haz.date.size, 40)
218-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).year, 2021)
219-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).month, 1)
220-
self.assertEqual(dt.datetime.fromordinal(haz.date[0]).day, 28)
221-
self.assertEqual(haz.event_id[-1], 40)
222-
self.assertEqual(haz.event_name[-1], '2021-01-28_ens40')
223-
self.assertIsInstance(haz.intensity,
224-
sparse.csr.csr_matrix)
225-
self.assertIsInstance(haz.fraction,
226-
sparse.csr.csr_matrix)
227-
self.assertEqual(haz.intensity.shape, (40, 49))
228-
self.assertAlmostEqual(haz.intensity.max(), 17.276321,places=3)
229-
self.assertEqual(haz.fraction.shape, (40, 49))
230-
with self.assertLogs('climada.hazard.storm_europe', level='WARNING') as cm:
231-
with self.assertRaises(ValueError):
232-
haz = StormEurope.from_icon_grib(
233-
dt.datetime(2021, 1, 28, 6),
234-
dt.datetime(2021, 1, 28),
235-
model_name='test',
236-
grib_dir=CONFIG.hazard.test_data.str(),
237-
delete_raw_data=False)
238-
self.assertEqual(len(cm.output), 1)
239-
self.assertIn('event definition is inaccuratly implemented', cm.output[0])
240-
241151
def test_generate_forecast(self):
242152
""" testing generating a forecast """
243153
hazard, haz_model, run_datetime, event_date = generate_WS_forecast_hazard(

climada/hazard/test/test_tc_tracks.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -242,34 +242,6 @@ def test_ibtracs_correct_pass(self):
242242
self.assertAlmostEqual(tc_try.data[0].central_pressure.values[5], 1008, places=0)
243243
self.assertAlmostEqual(tc_try.data[0].central_pressure.values[-1], 1012, places=0)
244244

245-
def test_ibtracs_with_basin(self):
246-
"""Filter TCs by (genesis) basin."""
247-
# South Atlantic (not usually a TC location at all)
248-
tc_track = tc.TCTracks.from_ibtracs_netcdf(basin="SA")
249-
self.assertEqual(tc_track.size, 3)
250-
251-
# the basin is not necessarily the genesis basin
252-
tc_track = tc.TCTracks.from_ibtracs_netcdf(
253-
year_range=(1995, 1995), basin="SP", estimate_missing=True)
254-
self.assertEqual(tc_track.size, 6)
255-
self.assertEqual(tc_track.data[0].basin[0], 'SP')
256-
self.assertEqual(tc_track.data[5].basin[0], 'SI')
257-
258-
# genesis in NI
259-
tc_track = tc.TCTracks.from_ibtracs_netcdf(
260-
year_range=(1994, 1994), genesis_basin="NI", estimate_missing=True)
261-
self.assertEqual(tc_track.size, 5)
262-
for tr in tc_track.data:
263-
self.assertEqual(tr.basin[0], "NI")
264-
265-
# genesis in EP, but crosses WP at some point
266-
tc_track = tc.TCTracks.from_ibtracs_netcdf(
267-
year_range=(2002, 2003), basin="WP", genesis_basin="EP")
268-
self.assertEqual(tc_track.size, 3)
269-
for tr in tc_track.data:
270-
self.assertEqual(tr.basin[0], "EP")
271-
self.assertIn("WP", tr.basin)
272-
273245
def test_ibtracs_discard_single_points(self):
274246
"""Check discard_single_points option"""
275247
passed = False

climada/hazard/test/test_tc_tracks_synth.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,14 +598,6 @@ def test_random_walk_single_point(self):
598598
break
599599
self.assertTrue(found)
600600

601-
def test_cutoff_tracks(self):
602-
tc_track = tc.TCTracks.from_ibtracs_netcdf(storm_id='1986226N30276')
603-
tc_track.equal_timestep()
604-
with self.assertLogs('climada.hazard.tc_tracks_synth', level='DEBUG') as cm:
605-
tc_track.calc_perturbed_trajectories(nb_synth_tracks=10)
606-
self.assertIn('The following generated synthetic tracks moved beyond '
607-
'the range of [-70, 70] degrees latitude', cm.output[1])
608-
609601
# Execute Tests
610602
if __name__ == "__main__":
611603
TESTS = unittest.TestLoader().loadTestsFromTestCase(TestDecay)

0 commit comments

Comments
 (0)