From 3ad68169536a150852155e9ff8a9f6f9be54f01e Mon Sep 17 00:00:00 2001 From: Uku Loskit Date: Wed, 10 Jul 2024 03:36:23 +0300 Subject: [PATCH] Convert tests to use pytest instead of unittest (#43) * Convert tests to use pytest instead of unittest * Augment PYTHONPATH for pytest via pyproject.toml * cleanup --------- Co-authored-by: Maxime Desroches --- .github/workflows/tests.yml | 4 ++-- examples/test_compare.py | 10 +++++----- examples/test_kinematic_kf.py | 18 +++++++----------- pyproject.toml | 7 +++++++ requirements.txt | 2 ++ 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0e09120..9b0f82d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,8 +17,8 @@ jobs: - name: Static analysis run: ${{ env.RUN }} "git init && git add -A && pre-commit run --all" - name: Unit Tests - run: ${{ env.RUN }} "cd /project/examples; python -m unittest discover" - + run: ${{ env.RUN }} "pytest" + docker_push: name: docker push runs-on: ubuntu-latest diff --git a/examples/test_compare.py b/examples/test_compare.py index 0b2cdd3..291f29e 100755 --- a/examples/test_compare.py +++ b/examples/test_compare.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 +import pytest import os import sys import sympy as sp import numpy as np -import unittest if __name__ == '__main__': # generating sympy code from rednose.helpers.ekf_sym import gen_code @@ -83,7 +83,7 @@ class CompareFilter: return R -class TestCompare(unittest.TestCase): +class TestCompare: def test_compare(self): np.random.seed(0) @@ -115,9 +115,9 @@ class TestCompare(unittest.TestCase): kf.filter_py.predict_and_update_batch(t, ObservationKind.POSITION, z, R) kf.filter_pyx.predict_and_update_batch(t, ObservationKind.POSITION, z, R) - self.assertAlmostEqual(kf.filter_py.get_filter_time(), kf.filter_pyx.get_filter_time()) - self.assertTrue(np.allclose(kf.filter_py.state(), kf.filter_pyx.state())) - self.assertTrue(np.allclose(kf.filter_py.covs(), kf.filter_pyx.covs())) + assert kf.filter_py.get_filter_time() == pytest.approx(kf.filter_pyx.get_filter_time()) + assert np.allclose(kf.filter_py.state(), kf.filter_pyx.state()) + assert np.allclose(kf.filter_py.covs(), kf.filter_pyx.covs()) if __name__ == "__main__": diff --git a/examples/test_kinematic_kf.py b/examples/test_kinematic_kf.py index 749eaf0..05d4d3e 100644 --- a/examples/test_kinematic_kf.py +++ b/examples/test_kinematic_kf.py @@ -1,12 +1,12 @@ +import pytest import os import numpy as np -import unittest -from kinematic_kf import KinematicKalman, ObservationKind, States # pylint: disable=import-error +from .kinematic_kf import KinematicKalman, ObservationKind, States GENERATED_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'generated')) -class TestKinematic(unittest.TestCase): +class TestKinematic: def test_kinematic_kf(self): np.random.seed(0) @@ -49,10 +49,10 @@ class TestKinematic(unittest.TestCase): xs, xs_meas, xs_kf, vs_kf, xs_kf_std, vs_kf_std = (np.asarray(a) for a in (xs, xs_meas, xs_kf, vs_kf, xs_kf_std, vs_kf_std)) - self.assertAlmostEqual(xs_kf[-1], -0.010866289677966417) - self.assertAlmostEqual(xs_kf_std[-1], 0.04477103863330089) - self.assertAlmostEqual(vs_kf[-1], -0.8553720537261753) - self.assertAlmostEqual(vs_kf_std[-1], 0.6695762270974388) + assert xs_kf[-1] == pytest.approx(-0.010866289677966417) + assert xs_kf_std[-1] == pytest.approx(0.04477103863330089) + assert vs_kf[-1] == pytest.approx(-0.8553720537261753) + assert vs_kf_std[-1] == pytest.approx(0.6695762270974388) if "PLOT" in os.environ: import matplotlib.pyplot as plt # pylint: disable=import-error @@ -80,7 +80,3 @@ class TestKinematic(unittest.TestCase): plt.legend() plt.show() - - -if __name__ == "__main__": - unittest.main() diff --git a/pyproject.toml b/pyproject.toml index b417c70..fa6ae11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,3 +7,10 @@ target-version="py311" select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF100", "A"] ignore = ["W292", "E741", "E402", "C408", "ISC003"] flake8-implicit-str-concat.allow-multiline=false + +[tool.ruff.lint.flake8-tidy-imports.banned-api] +"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!" +"unittest".msg = "Use pytest" + +[tool.pytest.ini_options] +addopts = "--durations=10 -n auto" diff --git a/requirements.txt b/requirements.txt index 453554b..81875a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,5 @@ cffi scons pre-commit Cython +pytest +pytest-xdist