mirror of
https://github.com/pybind/pybind11.git
synced 2026-04-20 06:49:25 +00:00
tests: cleanup and ci hardening (#2397)
* tests: refactor and cleanup * refactor: more consistent * tests: vendor six * tests: more xfails, nicer system * tests: simplify to info * tests: suggestions from @YannickJadoul and @bstaletic * tests: restore some pypy tests that now pass * tests: rename info to env * tests: strict False/True * tests: drop explicit strict=True again * tests: reduce minimum PyTest to 3.1
This commit is contained in:
@@ -5,24 +5,21 @@ Extends output capture as needed by pybind11: ignore constructors, optional unor
|
||||
Adds docstring and exceptions message sanitizers: ignore Python 2 vs 3 differences.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import textwrap
|
||||
import difflib
|
||||
import re
|
||||
import sys
|
||||
import contextlib
|
||||
import platform
|
||||
import difflib
|
||||
import gc
|
||||
import re
|
||||
import textwrap
|
||||
|
||||
import pytest
|
||||
|
||||
# Early diagnostic for failed imports
|
||||
import pybind11_tests # noqa: F401
|
||||
|
||||
_unicode_marker = re.compile(r'u(\'[^\']*\')')
|
||||
_long_marker = re.compile(r'([0-9])L')
|
||||
_hexadecimal = re.compile(r'0x[0-9a-fA-F]+')
|
||||
|
||||
# test_async.py requires support for async and await
|
||||
collect_ignore = []
|
||||
if sys.version_info[:2] < (3, 5):
|
||||
collect_ignore.append("test_async.py")
|
||||
|
||||
|
||||
def _strip_and_dedent(s):
|
||||
"""For triple-quote strings"""
|
||||
@@ -192,63 +189,5 @@ def gc_collect():
|
||||
|
||||
|
||||
def pytest_configure():
|
||||
"""Add import suppression and test requirements to `pytest` namespace"""
|
||||
try:
|
||||
import numpy as np
|
||||
except ImportError:
|
||||
np = None
|
||||
try:
|
||||
import scipy
|
||||
except ImportError:
|
||||
scipy = None
|
||||
try:
|
||||
from pybind11_tests.eigen import have_eigen
|
||||
except ImportError:
|
||||
have_eigen = False
|
||||
|
||||
# Provide simple `six`-like aliases.
|
||||
pytest.PY2 = (sys.version_info.major == 2)
|
||||
pytest.CPYTHON = (platform.python_implementation() == "CPython")
|
||||
pytest.PYPY = (platform.python_implementation() == "PyPy")
|
||||
|
||||
skipif = pytest.mark.skipif
|
||||
pytest.suppress = suppress
|
||||
pytest.requires_numpy = skipif(not np, reason="numpy is not installed")
|
||||
pytest.requires_scipy = skipif(not np, reason="scipy is not installed")
|
||||
pytest.requires_eigen_and_numpy = skipif(not have_eigen or not np,
|
||||
reason="eigen and/or numpy are not installed")
|
||||
pytest.requires_eigen_and_scipy = skipif(
|
||||
not have_eigen or not scipy, reason="eigen and/or scipy are not installed")
|
||||
pytest.unsupported_on_pypy = skipif(pytest.PYPY, reason="unsupported on PyPy")
|
||||
pytest.bug_in_pypy = pytest.mark.xfail(pytest.PYPY, reason="bug in PyPy")
|
||||
pytest.unsupported_on_pypy3 = skipif(pytest.PYPY and not pytest.PY2,
|
||||
reason="unsupported on PyPy3")
|
||||
pytest.unsupported_on_pypy_lt_6 = skipif(pytest.PYPY and sys.pypy_version_info[0] < 6,
|
||||
reason="unsupported on PyPy<6")
|
||||
pytest.unsupported_on_py2 = skipif(pytest.PY2,
|
||||
reason="unsupported on Python 2.x")
|
||||
pytest.gc_collect = gc_collect
|
||||
|
||||
|
||||
def _test_import_pybind11():
|
||||
"""Early diagnostic for test module initialization errors
|
||||
|
||||
When there is an error during initialization, the first import will report the
|
||||
real error while all subsequent imports will report nonsense. This import test
|
||||
is done early (in the pytest configuration file, before any tests) in order to
|
||||
avoid the noise of having all tests fail with identical error messages.
|
||||
|
||||
Any possible exception is caught here and reported manually *without* the stack
|
||||
trace. This further reduces noise since the trace would only show pytest internals
|
||||
which are not useful for debugging pybind11 module issues.
|
||||
"""
|
||||
# noinspection PyBroadException
|
||||
try:
|
||||
import pybind11_tests # noqa: F401 imported but unused
|
||||
except Exception as e:
|
||||
print("Failed to import pybind11_tests from pytest:")
|
||||
print(" {}: {}".format(type(e).__name__, e))
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
_test_import_pybind11()
|
||||
|
||||
Reference in New Issue
Block a user