Skip to content

Commit e6159a6

Browse files
committed
Testing improvements.
1. Record duration 2. Speed up some tests 3. Silence logging
1 parent 573dd75 commit e6159a6

File tree

7 files changed

+49
-25
lines changed

7 files changed

+49
-25
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ jobs:
6262
- name: Run Tests
6363
id: status
6464
run: |
65-
pytest -n auto --cov=./ --cov-report=xml --hypothesis-profile ci
65+
pytest --durations=20 --durations-min=0.5 -n auto --cov=./ --cov-report=xml --hypothesis-profile ci
6666
- name: Upload code coverage to Codecov
6767
uses: codecov/[email protected]
6868
with:

flox/aggregations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def generic_aggregate(
7676
try:
7777
method = getattr(aggregate_flox, func)
7878
except AttributeError:
79-
logger.debug(f"Couldn't find {func} for engine='flox'. Falling back to numpy")
79+
# logger.debug(f"Couldn't find {func} for engine='flox'. Falling back to numpy")
8080
method = get_npg_aggregation(func, engine="numpy")
8181

8282
elif engine == "numbagg":
@@ -94,7 +94,7 @@ def generic_aggregate(
9494
method = getattr(aggregate_numbagg, func)
9595

9696
except AttributeError:
97-
logger.debug(f"Couldn't find {func} for engine='numbagg'. Falling back to numpy")
97+
# logger.debug(f"Couldn't find {func} for engine='numbagg'. Falling back to numpy")
9898
method = get_npg_aggregation(func, engine="numpy")
9999

100100
elif engine in ["numpy", "numba"]:

flox/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2011,7 +2011,7 @@ def _validate_reindex(
20112011
reindex = True
20122012

20132013
assert isinstance(reindex, bool)
2014-
logger.debug("Leaving _validate_reindex: reindex is {}".format(reindex)) # noqa
2014+
# logger.debug("Leaving _validate_reindex: reindex is {}".format(reindex)) # noqa
20152015

20162016
return reindex
20172017

tests/conftest.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,15 @@
2828
)
2929
def engine(request):
3030
return request.param
31+
32+
33+
@pytest.fixture(
34+
scope="module",
35+
params=[
36+
"flox",
37+
"numpy",
38+
pytest.param("numbagg", marks=requires_numbagg),
39+
],
40+
)
41+
def engine_no_numba(request):
42+
return request.param

tests/test_core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def test_groupby_reduce(
187187
assert_equal(expected_result, result)
188188

189189

190-
def gen_array_by(size, func: str):
190+
def gen_array_by(size, func):
191191
by = np.ones(size[-1])
192192
rng = np.random.default_rng(12345)
193193
array = rng.random(tuple(6 if s == 1 else s for s in size))

tests/test_properties.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import warnings
12
from typing import Any, Callable
23

34
import pandas as pd
@@ -51,7 +52,9 @@ def not_overflowing_array(array: np.ndarray[Any, Any]) -> bool:
5152

5253
array = array.ravel()
5354
array = array[notnull(array)]
54-
result = bool(np.all((array < info.max / array.size) & (array > info.min / array.size)))
55+
with warnings.catch_warnings():
56+
warnings.simplefilter("ignore", RuntimeWarning)
57+
result = bool(np.all((array < info.max / array.size) & (array > info.min / array.size)))
5558
# note(f"returning {result}, {array.min()} vs {info.min}, {array.max()} vs {info.max}")
5659
return result
5760

tests/test_xarray.py

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,9 @@
2222

2323
dask.config.set(scheduler="sync")
2424

25-
try:
26-
# test against legacy xarray implementation
27-
xr.set_options(use_flox=False)
28-
except ValueError:
29-
pass
30-
31-
25+
# test against legacy xarray implementation
26+
# avoid some compilation overhead
27+
xr.set_options(use_flox=False, use_numbagg=False)
3228
tolerance64 = {"rtol": 1e-15, "atol": 1e-18}
3329
np.random.seed(123)
3430

@@ -37,7 +33,8 @@
3733
@pytest.mark.parametrize("min_count", [None, 1, 3])
3834
@pytest.mark.parametrize("add_nan", [True, False])
3935
@pytest.mark.parametrize("skipna", [True, False])
40-
def test_xarray_reduce(skipna, add_nan, min_count, engine, reindex):
36+
def test_xarray_reduce(skipna, add_nan, min_count, engine_no_numba, reindex):
37+
engine = engine_no_numba
4138
if skipna is False and min_count is not None:
4239
pytest.skip()
4340

@@ -57,7 +54,13 @@ def test_xarray_reduce(skipna, add_nan, min_count, engine, reindex):
5754

5855
expected = da.groupby("labels").sum(skipna=skipna, min_count=min_count)
5956
actual = xarray_reduce(
60-
da, "labels", func="sum", skipna=skipna, min_count=min_count, engine=engine, reindex=reindex
57+
da,
58+
"labels",
59+
func="sum",
60+
skipna=skipna,
61+
min_count=min_count,
62+
engine=engine,
63+
reindex=reindex,
6164
)
6265
assert_equal(expected, actual)
6366

@@ -85,9 +88,10 @@ def test_xarray_reduce(skipna, add_nan, min_count, engine, reindex):
8588
# TODO: sort
8689
@pytest.mark.parametrize("pass_expected_groups", [True, False])
8790
@pytest.mark.parametrize("chunk", (pytest.param(True, marks=requires_dask), False))
88-
def test_xarray_reduce_multiple_groupers(pass_expected_groups, chunk, engine):
91+
def test_xarray_reduce_multiple_groupers(pass_expected_groups, chunk, engine_no_numba):
8992
if chunk and pass_expected_groups is False:
9093
pytest.skip()
94+
engine = engine_no_numba
9195

9296
arr = np.ones((4, 12))
9397
labels = np.array(["a", "a", "c", "c", "c", "b", "b", "c", "c", "b", "b", "f"])
@@ -131,9 +135,10 @@ def test_xarray_reduce_multiple_groupers(pass_expected_groups, chunk, engine):
131135

132136
@pytest.mark.parametrize("pass_expected_groups", [True, False])
133137
@pytest.mark.parametrize("chunk", (pytest.param(True, marks=requires_dask), False))
134-
def test_xarray_reduce_multiple_groupers_2(pass_expected_groups, chunk, engine):
138+
def test_xarray_reduce_multiple_groupers_2(pass_expected_groups, chunk, engine_no_numba):
135139
if chunk and pass_expected_groups is False:
136140
pytest.skip()
141+
engine = engine_no_numba
137142

138143
arr = np.ones((2, 12))
139144
labels = np.array(["a", "a", "c", "c", "c", "b", "b", "c", "c", "b", "b", "f"])
@@ -187,7 +192,8 @@ def test_validate_expected_groups(expected_groups):
187192

188193
@requires_cftime
189194
@requires_dask
190-
def test_xarray_reduce_single_grouper(engine):
195+
def test_xarray_reduce_single_grouper(engine_no_numba):
196+
engine = engine_no_numba
191197
# DataArray
192198
ds = xr.Dataset(
193199
{"Tair": (("time", "x", "y"), dask.array.ones((36, 205, 275), chunks=(9, -1, -1)))},
@@ -293,15 +299,17 @@ def test_rechunk_for_blockwise(inchunks, expected):
293299
# TODO: dim=None, dim=Ellipsis, groupby unindexed dim
294300

295301

296-
def test_groupby_duplicate_coordinate_labels(engine):
302+
def test_groupby_duplicate_coordinate_labels(engine_no_numba):
303+
engine = engine_no_numba
297304
# fix for http://stackoverflow.com/questions/38065129
298305
array = xr.DataArray([1, 2, 3], [("x", [1, 1, 2])])
299306
expected = xr.DataArray([3, 3], [("x", [1, 2])])
300307
actual = xarray_reduce(array, array.x, func="sum", engine=engine)
301308
assert_equal(expected, actual)
302309

303310

304-
def test_multi_index_groupby_sum(engine):
311+
def test_multi_index_groupby_sum(engine_no_numba):
312+
engine = engine_no_numba
305313
# regression test for xarray GH873
306314
ds = xr.Dataset(
307315
{"foo": (("x", "y", "z"), np.ones((3, 4, 2)))},
@@ -327,7 +335,8 @@ def test_multi_index_groupby_sum(engine):
327335

328336

329337
@pytest.mark.parametrize("chunks", (None, pytest.param(2, marks=requires_dask)))
330-
def test_xarray_groupby_bins(chunks, engine):
338+
def test_xarray_groupby_bins(chunks, engine_no_numba):
339+
engine = engine_no_numba
331340
array = xr.DataArray([1, 1, 1, 1, 1], dims="x")
332341
labels = xr.DataArray([1, 1.5, 1.9, 2, 3], dims="x", name="labels")
333342

@@ -495,11 +504,11 @@ def test_alignment_error():
495504
@pytest.mark.parametrize("dtype_out", [np.float64, "float64", np.dtype("float64")])
496505
@pytest.mark.parametrize("dtype", [np.float32, np.float64])
497506
@pytest.mark.parametrize("chunk", (pytest.param(True, marks=requires_dask), False))
498-
def test_dtype(add_nan, chunk, dtype, dtype_out, engine):
499-
if engine == "numbagg":
507+
def test_dtype(add_nan, chunk, dtype, dtype_out, engine_no_numba):
508+
if engine_no_numba == "numbagg":
500509
# https://github.com/numbagg/numbagg/issues/121
501510
pytest.skip()
502-
511+
engine = engine_no_numba
503512
xp = dask.array if chunk else np
504513
data = xp.linspace(0, 1, 48, dtype=dtype).reshape((4, 12))
505514

@@ -707,7 +716,7 @@ def test_multiple_quantiles(q, chunk, by_ndim, skipna):
707716
da = xr.DataArray(array, dims=("x", *dims))
708717
by = xr.DataArray(labels, dims=dims, name="by")
709718

710-
actual = xarray_reduce(da, by, func="quantile", skipna=skipna, q=q)
719+
actual = xarray_reduce(da, by, func="quantile", skipna=skipna, q=q, engine="flox")
711720
with xr.set_options(use_flox=False):
712721
expected = da.groupby(by).quantile(q, skipna=skipna)
713722
xr.testing.assert_allclose(expected, actual)

0 commit comments

Comments
 (0)