Author: Ronan Lamy <[email protected]>
Branch: py3.6
Changeset: r98565:b195c68558a4
Date: 2020-01-21 03:41 +0000
http://bitbucket.org/pypy/pypy/changeset/b195c68558a4/
Log: Add @pytest.mark.pypy_only to simplify skipping PyPy-specific app-
level tests on CPython
diff --git a/pypy/conftest.py b/pypy/conftest.py
--- a/pypy/conftest.py
+++ b/pypy/conftest.py
@@ -68,6 +68,9 @@
if not mode_A and not mode_D: # 'own' tests
from rpython.conftest import LeakFinder
config.pluginmanager.register(LeakFinder())
+ if mode_A:
+ from pypy.tool.pytest.apptest import PythonInterpreter
+ config.applevel = PythonInterpreter(config.option.python)
def pytest_addoption(parser):
group = parser.getgroup("pypy options")
@@ -201,13 +204,16 @@
@pytest.hookimpl(tryfirst=True)
def pytest_runtest_setup(item):
if isinstance(item, py.test.collect.Function):
+ config = item.config
+ if item.get_marker(name='pypy_only') and not config.applevel.is_pypy:
+ pytest.skip('PyPy-specific test')
appclass = item.getparent(py.test.Class)
if appclass is not None:
from pypy.tool.pytest.objspace import gettestobjspace
# Make cls.space and cls.runappdirect available in tests.
spaceconfig = getattr(appclass.obj, 'spaceconfig', {})
appclass.obj.space = gettestobjspace(**spaceconfig)
- appclass.obj.runappdirect = option.runappdirect
+ appclass.obj.runappdirect = config.option.runappdirect
def pytest_ignore_collect(path, config):
if (config.getoption('direct_apptest') and not path.isdir()
diff --git a/pypy/interpreter/test/test_argument.py
b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -806,7 +806,7 @@
exc = raises(TypeError, '(lambda *, kw: 0)(1, kw=3)')
assert str(exc.value) == "<lambda>() takes 0 positional arguments but
1 positional argument (and 1 keyword-only argument) were given"
- @py.test.mark.skipif("config.option.runappdirect")
+ @pytest.mark.pypy_only
def test_error_message_method(self):
class A(object):
def f0():
@@ -823,14 +823,14 @@
# does not contain the warning about missing self
assert exc.value.args[0] == "f0() takes 0 positional arguments but 1
was given"
- @py.test.mark.skipif("config.option.runappdirect")
+ @pytest.mark.pypy_only
def test_error_message_module_function(self):
import operator # use countOf because it's defined at applevel
exc = raises(TypeError, lambda : operator.countOf(1, 2, 3))
# does not contain the warning about missing self
assert exc.value.args[0] == "countOf() takes 2 positional arguments
but 3 were given"
- @py.test.mark.skipif("config.option.runappdirect")
+ @pytest.mark.pypy_only
def test_error_message_bound_method(self):
class A(object):
def f0():
diff --git a/pypy/tool/pytest/apptest.py b/pypy/tool/pytest/apptest.py
--- a/pypy/tool/pytest/apptest.py
+++ b/pypy/tool/pytest/apptest.py
@@ -35,6 +35,24 @@
def __init__(self, excinfo):
self.excinfo = excinfo
+class PythonInterpreter(object):
+ def __init__(self, path):
+ self.path = path
+ self._is_pypy = None
+
+ @property
+ def is_pypy(self):
+ if self._is_pypy is not None:
+ return self._is_pypy
+ CODE = "import sys; print('__pypy__' in sys.builtin_module_names)"
+ res, stdout, stderr = run_subprocess( self.path, ["-c", CODE])
+ if res != 0:
+ raise ValueError("Invalid Python interpreter")
+ print stdout
+ is_pypy = stdout.strip() == 'True'
+ self._is_pypy = is_pypy
+ return is_pypy
+
def py3k_repr(value):
"return the repr() that py3k would give for an object."""
@@ -120,7 +138,7 @@
pytest.fail("DID NOT RAISE")
self.value = tp[1]
return issubclass(tp[0], self.expected_exception)
-
+
__builtins__.raises = raises
class Test:
pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit