Skip to content

Commit

Permalink
[MRG] Parallelize pytests where applicable (#932)
Browse files Browse the repository at this point in the history
* feat: add marks and change pytest runs for pll

* Improve mark name, duplicate test cmds into Make

* chore: update pytest custom marker metadata
  • Loading branch information
asoplata authored Dec 16, 2024
1 parent c374c6a commit 6c69538
Show file tree
Hide file tree
Showing 8 changed files with 19 additions and 7 deletions.
14 changes: 9 additions & 5 deletions .github/workflows/unix_unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install Python dependencies
shell: bash -el {0}
run: |
if [ ${{ matrix.os }} == 'macos-latest' ]; then
python -m pip install --upgrade pip
conda install --yes -c conda-forge mpi4py openmpi
elif [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then
elif [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then
python -m pip install --upgrade pip
python -m pip install mpi4py
fi
Expand All @@ -58,11 +58,15 @@
shell: bash -el {0}
run: |
flake8 --count hnn_core
- name: Test with pytest
- name: Test non-MPI, embarrassingly parallel tests with pytest
shell: bash -el {0}
run: |
python -m pytest ./hnn_core/tests/ -m "not uses_mpi" -n auto --cov=hnn_core --cov-report=xml
- name: Test MPI-using parallel tests with pytest
shell: bash -el {0}
run: |
python -m pytest ./hnn_core/tests/ --cov=hnn_core --cov-report=xml
python -m pytest ./hnn_core/tests/ -m "uses_mpi" --cov=hnn_core --cov-report=xml --cov-append
- name: Upload coverage to Codecov
shell: bash -el {0}
run: |
bash <(curl -s https://codecov.io/bash) -f ./coverage.xml
bash <(curl -s https://codecov.io/bash) -f ./coverage.xml
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ check-manifest:
check-manifest

test: flake
pytest .
pytest ./hnn_core/tests/ -m "not uses_mpi" -n auto
pytest ./hnn_core/tests/ -m "uses_mpi"

flake:
@if command -v flake8 > /dev/null; then \
Expand Down
1 change: 1 addition & 0 deletions hnn_core/tests/test_dipole.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ def test_dipole_simulation():

@requires_mpi4py
@requires_psutil
@pytest.mark.uses_mpi
def test_cell_response_backends(run_hnn_core_fixture):
"""Test cell_response outputs across backends."""

Expand Down
1 change: 1 addition & 0 deletions hnn_core/tests/test_extracellular.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ def test_transfer_resistance():

@requires_mpi4py
@requires_psutil
@pytest.mark.uses_mpi
def test_extracellular_backends(run_hnn_core_fixture):
"""Test extracellular outputs across backends."""
# calculation of CSD requires >=4 electrode contacts
Expand Down
1 change: 1 addition & 0 deletions hnn_core/tests/test_gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ def test_gui_init_network(setup_gui):

@requires_mpi4py
@requires_psutil
@pytest.mark.uses_mpi
def test_gui_run_simulation_mpi():
"""Test if run button triggers simulation with MPIBackend."""
gui = HNNGUI()
Expand Down
2 changes: 2 additions & 0 deletions hnn_core/tests/test_parallel_backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ def test_gid_assignment():


@pytest.mark.incremental
@pytest.mark.uses_mpi
class TestParallelBackends():
dpls_reduced_mpi = None
dpls_reduced_default = None
Expand Down Expand Up @@ -241,6 +242,7 @@ def test_compare_hnn_core(self, run_hnn_core_fixture, backend, n_jobs=1):
# class marked incremental
@requires_mpi4py
@requires_psutil
@pytest.mark.uses_mpi
def test_mpi_failure(run_hnn_core_fixture):
"""Test that an MPI failure is handled and messages are printed"""
# this MPI parameter will cause a MPI job to fail
Expand Down
2 changes: 2 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[pytest]
markers =
uses_mpi: tests which should NOT be run in an embarrassingly-parallel fashion
incremental: run tests with prerequisites in incremental order

2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def run(self):
extras = {
'opt': ['scikit-learn'],
'parallel': ['joblib', 'psutil'],
'test': ['flake8', 'pytest', 'pytest-cov', ],
'test': ['flake8', 'pytest', 'pytest-cov', 'pytest-xdist'],
'docs': ['mne', 'nibabel', 'pooch', 'tdqm',
'sphinx', 'sphinx-gallery',
'sphinx_bootstrap_theme', 'sphinx-copybutton',
Expand Down

0 comments on commit 6c69538

Please sign in to comment.