[py-svn] py-virtualenv commit 57132bbe20c5: use new marking idioms, simplify generalized skipping implementation
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Fri Oct 23 13:12:16 CEST 2009
# HG changeset patch -- Bitbucket.org
# Project py-virtualenv
# URL http://bitbucket.org/RonnyPfannschmidt/py-virtualenv/overview/
# User holger krekel <holger at merlinux.eu>
# Date 1256229444 -7200
# Node ID 57132bbe20c575c34de83f196f1006cceaa594b8
# Parent fca2db12253a13bb7eef5b4424a0befc34b50f49
use new marking idioms, simplify generalized skipping implementation
--- a/testing/pytest/plugin/test_pytest_runner.py
+++ b/testing/pytest/plugin/test_pytest_runner.py
@@ -218,7 +218,8 @@ class TestExecutionNonForked(BaseFunctio
py.test.fail("did not raise")
class TestExecutionForked(BaseFunctionalTests):
- skipif = "not hasattr(os, 'fork')"
+ pytestmark = py.test.mark.skipif("not hasattr(os, 'fork')")
+
def getrunner(self):
return runner.forked_run_report
--- a/conftest.py
+++ b/conftest.py
@@ -52,7 +52,7 @@ def pytest_generate_tests(metafunc):
multi = getattr(metafunc.function, 'multi', None)
if multi is None:
return
- assert len(multi.__dict__) == 1
- for name, l in multi.__dict__.items():
+ assert len(multi._kwargs) == 1
+ for name, l in multi._kwargs.items():
for val in l:
metafunc.addcall(funcargs={name: val})
--- a/_py/test/plugin/pytest_keyword.py
+++ b/_py/test/plugin/pytest_keyword.py
@@ -33,6 +33,8 @@ In addition to keyword arguments you can
after which ``test_receive.webtest._args[0] == 'triangular`` holds true.
+.. _`scoped-marking`:
+
Marking classes or modules
----------------------------------------------------
--- a/testing/path/test_local.py
+++ b/testing/path/test_local.py
@@ -208,7 +208,7 @@ class TestLocalPath(common.CommonFSTests
assert l[2] == p3
class TestExecutionOnWindows:
- skipif = "sys.platform != 'win32'"
+ pytestmark = py.test.mark.skipif("sys.platform != 'win32'")
def test_sysfind(self):
x = py.path.local.sysfind('cmd')
@@ -216,7 +216,7 @@ class TestExecutionOnWindows:
assert py.path.local.sysfind('jaksdkasldqwe') is None
class TestExecution:
- skipif = "sys.platform == 'win32'"
+ pytestmark = py.test.mark.skipif("sys.platform == 'win32'")
def test_sysfind(self):
x = py.path.local.sysfind('test')
@@ -346,7 +346,7 @@ def test_homedir():
assert homedir.check(dir=1)
class TestWINLocalPath:
- skipif = "sys.platform != 'win32'"
+ pytestmark = py.test.mark.skipif("sys.platform != 'win32'")
def test_owner_group_not_implemented(self):
py.test.raises(NotImplementedError, "path1.stat().owner")
@@ -395,7 +395,7 @@ class TestWINLocalPath:
old.chdir()
class TestPOSIXLocalPath:
- skipif = "sys.platform == 'win32'"
+ pytestmark = py.test.mark.skipif("sys.platform == 'win32'")
def test_samefile(self, tmpdir):
assert tmpdir.samefile(tmpdir)
--- a/_py/test/plugin/pytest_skipping.py
+++ b/_py/test/plugin/pytest_skipping.py
@@ -13,15 +13,15 @@ reported at the end of test run through
skip a test function conditionally
-------------------------------------------
-Here is an example for skipping a test function on Python3::
+Here is an example for skipping a test function when
+running on Python3::
@py.test.mark.skipif("sys.version_info >= (3,0)")
def test_function():
...
-The 'skipif' marker accepts an **arbitrary python expression**
-as a condition. When setting up the test function the condition
-is evaluated by calling ``eval(expr, namespace)``. The namespace
+During test function setup the skipif condition is
+evaluated by calling ``eval(expr, namespace)``. The namespace
contains the ``sys`` and ``os`` modules as well as the
test ``config`` object. The latter allows you to skip based
on a test configuration value e.g. like this::
@@ -30,6 +30,10 @@ on a test configuration value e.g. like
def test_function(...):
...
+Note that `test marking can be declared at whole class- or module level`_.
+
+.. _`test marking can also be declared at whole class- or module level`: keyword.html#scoped-marking
+
conditionally mark a function as "expected to fail"
-------------------------------------------------------
@@ -123,6 +127,7 @@ def pytest_runtest_makereport(__multical
rep.keywords['xfail'] = True # expr
return rep
+# called by terminalreporter progress reporting
def pytest_report_teststatus(report):
if 'xfail' in report.keywords:
if report.skipped:
@@ -165,29 +170,22 @@ def show_xfailed(terminalreporter):
tr._tw.line(pos)
-def getexpression(item, keyword):
+def evalexpression(item, keyword):
if isinstance(item, py.test.collect.Function):
- val = getattr(item.obj, keyword, None)
- val = getattr(val, '_0', val)
- if val is not None:
- return val
- cls = item.getparent(py.test.collect.Class)
- if cls and hasattr(cls.obj, keyword):
- return getattr(cls.obj, keyword)
- mod = item.getparent(py.test.collect.Module)
- if mod:
- return getattr(mod.obj, keyword, None)
-
-def evalexpression(item, keyword):
- expr = getexpression(item, keyword)
- result = None
- if expr:
- if isinstance(expr, str):
+ markholder = getattr(item.obj, keyword, None)
+ result = False
+ if markholder:
d = {'os': py.std.os, 'sys': py.std.sys, 'config': item.config}
- result = eval(expr, d)
- else:
- result = expr
- return expr, result
+ expr, result = None, True
+ for expr in markholder._args:
+ if isinstance(expr, str):
+ result = eval(expr, d)
+ else:
+ result = expr
+ if not result:
+ break
+ return expr, result
+ return None, False
def folded_skips(skipped):
d = {}
--- a/testing/process/test_forkedfunc.py
+++ b/testing/process/test_forkedfunc.py
@@ -1,6 +1,6 @@
import py, sys, os
-skipif = "not hasattr(os, 'fork')"
+pytestmark = py.test.mark.skipif("not hasattr(os, 'fork')")
def test_waitfinish_removes_tempdir():
ff = py.process.ForkedFunc(boxf1)
--- a/testing/pytest/plugin/test_pytest_skipping.py
+++ b/testing/pytest/plugin/test_pytest_skipping.py
@@ -46,8 +46,8 @@ def test_xfail_decorator(testdir):
def test_xfail_at_module(testdir):
p = testdir.makepyfile("""
- xfail = 'True'
-
+ import py
+ pytestmark = py.test.mark.xfail('True')
def test_intentional_xfail():
assert 0
""")
@@ -76,8 +76,9 @@ def test_skipif_decorator(testdir):
def test_skipif_class(testdir):
p = testdir.makepyfile("""
import py
+
class TestClass:
- skipif = "True"
+ pytestmark = py.test.mark.skipif("True")
def test_that(self):
assert 0
def test_though(self):
@@ -88,36 +89,12 @@ def test_skipif_class(testdir):
"*2 skipped*"
])
-def test_getexpression(testdir):
- from _py.test.plugin.pytest_skipping import getexpression
- l = testdir.getitems("""
- import py
- mod = 5
- class TestClass:
- cls = 4
- @py.test.mark.func(3)
- def test_func(self):
- pass
- @py.test.mark.just
- def test_other(self):
- pass
- """)
- item, item2 = l
- assert getexpression(item, 'xyz') is None
- assert getexpression(item, 'func') == 3
- assert getexpression(item, 'cls') == 4
- assert getexpression(item, 'mod') == 5
-
- assert getexpression(item2, 'just')
-
- item2.parent = None
- assert not getexpression(item2, 'nada')
-
def test_evalexpression_cls_config_example(testdir):
from _py.test.plugin.pytest_skipping import evalexpression
item, = testdir.getitems("""
+ import py
class TestClass:
- skipif = "config._hackxyz"
+ pytestmark = py.test.mark.skipif("config._hackxyz")
def test_func(self):
pass
""")
More information about the pytest-commit
mailing list