123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- """
- Pytest configuration and fixtures for the Numpy test suite.
- """
- import os
- import tempfile
- import hypothesis
- import pytest
- import numpy
- from numpy.core._multiarray_tests import get_fpu_mode
- _old_fpu_mode = None
- _collect_results = {}
- # Use a known and persistent tmpdir for hypothesis' caches, which
- # can be automatically cleared by the OS or user.
- hypothesis.configuration.set_hypothesis_home_dir(
- os.path.join(tempfile.gettempdir(), ".hypothesis")
- )
- # We register two custom profiles for Numpy - for details see
- # https://hypothesis.readthedocs.io/en/latest/settings.html
- # The first is designed for our own CI runs; the latter also
- # forces determinism and is designed for use via np.test()
- hypothesis.settings.register_profile(
- name="numpy-profile", deadline=None, print_blob=True,
- )
- hypothesis.settings.register_profile(
- name="np.test() profile",
- deadline=None, print_blob=True, database=None, derandomize=True,
- suppress_health_check=hypothesis.HealthCheck.all(),
- )
- # Note that the default profile is chosen based on the presence
- # of pytest.ini, but can be overriden by passing the
- # --hypothesis-profile=NAME argument to pytest.
- _pytest_ini = os.path.join(os.path.dirname(__file__), "..", "pytest.ini")
- hypothesis.settings.load_profile(
- "numpy-profile" if os.path.isfile(_pytest_ini) else "np.test() profile"
- )
- def pytest_configure(config):
- config.addinivalue_line("markers",
- "valgrind_error: Tests that are known to error under valgrind.")
- config.addinivalue_line("markers",
- "leaks_references: Tests that are known to leak references.")
- config.addinivalue_line("markers",
- "slow: Tests that are very slow.")
- config.addinivalue_line("markers",
- "slow_pypy: Tests that are very slow on pypy.")
- def pytest_addoption(parser):
- parser.addoption("--available-memory", action="store", default=None,
- help=("Set amount of memory available for running the "
- "test suite. This can result to tests requiring "
- "especially large amounts of memory to be skipped. "
- "Equivalent to setting environment variable "
- "NPY_AVAILABLE_MEM. Default: determined"
- "automatically."))
- def pytest_sessionstart(session):
- available_mem = session.config.getoption('available_memory')
- if available_mem is not None:
- os.environ['NPY_AVAILABLE_MEM'] = available_mem
- #FIXME when yield tests are gone.
- @pytest.hookimpl()
- def pytest_itemcollected(item):
- """
- Check FPU precision mode was not changed during test collection.
- The clumsy way we do it here is mainly necessary because numpy
- still uses yield tests, which can execute code at test collection
- time.
- """
- global _old_fpu_mode
- mode = get_fpu_mode()
- if _old_fpu_mode is None:
- _old_fpu_mode = mode
- elif mode != _old_fpu_mode:
- _collect_results[item] = (_old_fpu_mode, mode)
- _old_fpu_mode = mode
- @pytest.fixture(scope="function", autouse=True)
- def check_fpu_mode(request):
- """
- Check FPU precision mode was not changed during the test.
- """
- old_mode = get_fpu_mode()
- yield
- new_mode = get_fpu_mode()
- if old_mode != new_mode:
- raise AssertionError("FPU precision mode changed from {0:#x} to {1:#x}"
- " during the test".format(old_mode, new_mode))
- collect_result = _collect_results.get(request.node)
- if collect_result is not None:
- old_mode, new_mode = collect_result
- raise AssertionError("FPU precision mode changed from {0:#x} to {1:#x}"
- " when collecting the test".format(old_mode,
- new_mode))
- @pytest.fixture(autouse=True)
- def add_np(doctest_namespace):
- doctest_namespace['np'] = numpy
- @pytest.fixture(autouse=True)
- def env_setup(monkeypatch):
- monkeypatch.setenv('PYTHONHASHSEED', '0')
|