id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 1960287586,I_kwDOAMm_X850151i,8370,Testing NamedArray and Variable,14077947,closed,0,,,2,2023-10-25T00:18:50Z,2023-11-28T15:11:27Z,2023-11-28T15:11:27Z,CONTRIBUTOR,,,,"Starting a new issue to continue the discussion from https://github.com/pydata/xarray/issues/8244 about the test structure for NamedArray (xref https://github.com/pydata/xarray/issues/8238). > > > In theory it seems like we'd want to test both Variable and NamedArray, but I also don't like the idea of them potentially diverging once we switch to a new repo. OTOH perhaps there won't be much updating of such core functionality. > > > > > > Maybe we could avoid divergence by importing from the NamedArray test suite and using the same arithmetic tests but on the Variable class? > > i'm of the same opinion as @TomNicholas that we can package the shared tests in namedarray, and have the tests for Variable inherit those tests while also including their own specific tests. It should work to use `pytest_collection_modifyitems` to collect tests from namedarray that should be also tested in xarray without modification. It's slightly more complicated to add external tests that need to override fixtures, but https://github.com/pytest-dev/pytest/issues/421#issuecomment-943386533 lays out a nice solution (see example pseudo-code below for NamedArray/Variable example). I recognize that this type of property testing would be well suited for Hypothesis, but also expect that would slow down progress too much to be an immediate solution. @andersy005 when do you think would be the best time to test out this method for migrating tests? I could try it out anytime and don't see many downsides to testing while namedarray is still coupled with xarray. ```python # namedarray/testing.py import numpy as np class NamedArrayTestSuite: @pytest.fixture def target(self): """"""Fixture that needs to be re-declared"""""" assert 0 @pytest.fixture def data(self): return 0.5 * np.arange(10).reshape(2, 5) def test_properties(self, target, data): assert target.dims == (""x"", ""y"") assert np.array_equal(target.data, data) assert target.attrs == {""key"": ""value""} assert target.ndim == 2 assert target.sizes == {""x"": 2, ""y"": 5} assert target.size == 10 assert target.nbytes == 80 assert len(target) == 2 ``` ```python # namedarray/tests/test_namedarray.py from namedarray.testing import NamedArrayTestSuite from namedarray import NamedArray class TestNamedArray(NamedArrayTestSuite): @pytest.fixture def target(self, data): return NamedArray([""x"", ""y""], data, {""key"": ""value""}) ``` ```python # xarray/tests/test_variable.py from namedarray.testing import NamedArrayTestSuite from xarray import Variable class TestVariable(NamedArrayTestSuite): @pytest.fixture def target(self, data): data = 0.5 * np.arange(10).reshape(2, 5) return Variable([""x"", ""y""], data, {""key"": ""value""}) ``` ","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/8370/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue