rename and simplify the assert option:
cmdline usage is now: --assert=rewrite/reinterp/plain there is no conflict detection (don't think that's neccessary)
This commit is contained in:
parent
407ca5b120
commit
46950ef19a
|
@ -1,2 +1,2 @@
|
|||
#
|
||||
__version__ = '2.1.0.dev5'
|
||||
__version__ = '2.1.0.dev6'
|
||||
|
|
|
@ -9,18 +9,18 @@ from _pytest.assertion import util
|
|||
|
||||
def pytest_addoption(parser):
|
||||
group = parser.getgroup("debugconfig")
|
||||
group.addoption('--assertmode', action="store", dest="assertmode",
|
||||
choices=("rewrite", "reinterp", "off", "default"),
|
||||
default="default", metavar="off|reinterp|rewrite",
|
||||
group.addoption('--assert', action="store", dest="assertmode",
|
||||
choices=("rewrite", "reinterp", "plain",),
|
||||
default="rewrite", metavar="MODE",
|
||||
help="""control assertion debugging tools.
|
||||
'off' performs no assertion debugging.
|
||||
'reinterp' reinterprets the expressions in asserts to glean information.
|
||||
'rewrite' (the default) rewrites the assert statements in test modules on import
|
||||
to provide sub-expression results.""")
|
||||
'plain' performs no assertion debugging.
|
||||
'reinterp' reinterprets assert statements after they failed to provide assertion expression information.
|
||||
'rewrite' (the default) rewrites assert statements in test modules on import
|
||||
to provide assert expression information. """)
|
||||
group.addoption('--no-assert', action="store_true", default=False,
|
||||
dest="noassert", help="DEPRECATED equivalent to --assertmode=off")
|
||||
dest="noassert", help="DEPRECATED equivalent to --assert=plain")
|
||||
group.addoption('--nomagic', action="store_true", default=False,
|
||||
dest="nomagic", help="DEPRECATED equivalent to --assertmode=off")
|
||||
dest="nomagic", help="DEPRECATED equivalent to --assert=plain")
|
||||
|
||||
class AssertionState:
|
||||
"""State for the assertion plugin."""
|
||||
|
@ -33,17 +33,13 @@ class AssertionState:
|
|||
def pytest_configure(config):
|
||||
mode = config.getvalue("assertmode")
|
||||
if config.getvalue("noassert") or config.getvalue("nomagic"):
|
||||
if mode not in ("off", "default"):
|
||||
raise pytest.UsageError("assertion options conflict")
|
||||
mode = "off"
|
||||
elif mode == "default":
|
||||
mode = "rewrite"
|
||||
mode = "plain"
|
||||
if mode == "rewrite":
|
||||
try:
|
||||
import ast
|
||||
except ImportError:
|
||||
mode = "reinterp"
|
||||
if mode != "off":
|
||||
if mode != "plain":
|
||||
_load_modules(mode)
|
||||
def callbinrepr(op, left, right):
|
||||
hook_result = config.hook.pytest_assertrepr_compare(
|
||||
|
@ -104,7 +100,8 @@ def warn_about_missing_assertion(mode):
|
|||
specifically = "failing tests may report as passing"
|
||||
|
||||
sys.stderr.write("WARNING: " + specifically +
|
||||
" because assertions are turned off "
|
||||
" because assert statements are not executed "
|
||||
"by the underlying Python interpreter "
|
||||
"(are you using python -O?)\n")
|
||||
|
||||
pytest_assertrepr_compare = util.assertrepr_compare
|
||||
|
|
|
@ -23,7 +23,7 @@ you will see the return value of the function call::
|
|||
|
||||
$ py.test test_assert1.py
|
||||
============================= test session starts ==============================
|
||||
platform darwin -- Python 2.7.0 -- pytest-2.1.0.dev4
|
||||
platform linux2 -- Python 2.6.6 -- pytest-2.1.0.dev6
|
||||
collecting ... collected 1 items
|
||||
|
||||
test_assert1.py F
|
||||
|
@ -37,7 +37,7 @@ you will see the return value of the function call::
|
|||
E + where 3 = f()
|
||||
|
||||
test_assert1.py:5: AssertionError
|
||||
=========================== 1 failed in 0.05 seconds ===========================
|
||||
=========================== 1 failed in 0.01 seconds ===========================
|
||||
|
||||
py.test has support for showing the values of the most common subexpressions
|
||||
including calls, attributes, comparisons, and binary and unary
|
||||
|
@ -105,7 +105,7 @@ if you run this module::
|
|||
|
||||
$ py.test test_assert2.py
|
||||
============================= test session starts ==============================
|
||||
platform darwin -- Python 2.7.0 -- pytest-2.1.0.dev4
|
||||
platform linux2 -- Python 2.6.6 -- pytest-2.1.0.dev6
|
||||
collecting ... collected 1 items
|
||||
|
||||
test_assert2.py F
|
||||
|
@ -124,7 +124,7 @@ if you run this module::
|
|||
E '5'
|
||||
|
||||
test_assert2.py:5: AssertionError
|
||||
=========================== 1 failed in 0.05 seconds ===========================
|
||||
=========================== 1 failed in 0.01 seconds ===========================
|
||||
|
||||
Special comparisons are done for a number of cases:
|
||||
|
||||
|
@ -181,7 +181,7 @@ the conftest file::
|
|||
E vals: 1 != 2
|
||||
|
||||
test_foocompare.py:8: AssertionError
|
||||
1 failed in 0.05 seconds
|
||||
1 failed in 0.01 seconds
|
||||
|
||||
.. _assert-details:
|
||||
.. _`assert introspection`:
|
||||
|
@ -212,8 +212,8 @@ rewritten.
|
|||
py.test rewrites test modules on import. It does this by using an import hook
|
||||
to write a new pyc files. Most of the time this works transparently. However,
|
||||
if you are messing with import yourself, the import hook may interfere. If
|
||||
this is the case, simply use ``--assertmode=reinterp`` or
|
||||
``--assertmode=off``. Additionally, rewriting will fail silently if it cannot
|
||||
this is the case, simply use ``--assert=reinterp`` or
|
||||
``--assert=plain``. Additionally, rewriting will fail silently if it cannot
|
||||
write new pycs, i.e. in a read-only filesystem or a zipfile.
|
||||
|
||||
If an assert statement has not been rewritten or the Python version is less than
|
||||
|
@ -221,7 +221,7 @@ If an assert statement has not been rewritten or the Python version is less than
|
|||
py.test walks the frame of the function containing the assert statement to
|
||||
discover sub-expression results of the failing assert statement. You can force
|
||||
py.test to always use assertion reinterpretation by passing the
|
||||
``--assertmode=reinterp`` option.
|
||||
``--assert=reinterp`` option.
|
||||
|
||||
Assert reinterpretation has a caveat not present with assert rewriting: If
|
||||
evaluating the assert expression has side effects you may get a warning that the
|
||||
|
@ -238,11 +238,11 @@ easy to rewrite the assertion and avoid any trouble::
|
|||
content = f.read()
|
||||
assert content != '...'
|
||||
|
||||
All assert introspection can be turned off by passing ``--assertmode=off``.
|
||||
All assert introspection can be turned off by passing ``--assert=plain``.
|
||||
|
||||
.. versionadded:: 2.1
|
||||
Add assert rewriting as an alternate introspection technique.
|
||||
|
||||
.. versionchanged:: 2.1
|
||||
Introduce the ``--assertmode`` option. Deprecate ``--no-assert`` and
|
||||
Introduce the ``--assert`` option. Deprecate ``--no-assert`` and
|
||||
``--nomagic``.
|
||||
|
|
2
setup.py
2
setup.py
|
@ -22,7 +22,7 @@ def main():
|
|||
name='pytest',
|
||||
description='py.test: simple powerful testing with Python',
|
||||
long_description = long_description,
|
||||
version='2.1.0.dev5',
|
||||
version='2.1.0.dev6',
|
||||
url='http://pytest.org',
|
||||
license='MIT license',
|
||||
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
|
||||
|
|
|
@ -179,26 +179,20 @@ def test_assertion_options(testdir):
|
|||
off_options = (("--no-assert",),
|
||||
("--nomagic",),
|
||||
("--no-assert", "--nomagic"),
|
||||
("--assertmode=off",),
|
||||
("--assertmode=off", "--no-assert"),
|
||||
("--assertmode=off", "--nomagic"),
|
||||
("--assertmode=off," "--no-assert", "--nomagic"))
|
||||
("--assert=plain",),
|
||||
("--assert=plain", "--no-assert"),
|
||||
("--assert=plain", "--nomagic"),
|
||||
("--assert=plain", "--no-assert", "--nomagic"))
|
||||
for opt in off_options:
|
||||
result = testdir.runpytest(*opt)
|
||||
assert "3 == 4" not in result.stdout.str()
|
||||
for mode in "rewrite", "reinterp":
|
||||
for other_opt in off_options[:3]:
|
||||
opt = ("--assertmode=" + mode,) + other_opt
|
||||
result = testdir.runpytest(*opt)
|
||||
assert result.ret == 3
|
||||
assert "assertion options conflict" in result.stderr.str()
|
||||
|
||||
def test_old_assert_mode(testdir):
|
||||
testdir.makepyfile("""
|
||||
def test_in_old_mode():
|
||||
assert "@py_builtins" not in globals()
|
||||
""")
|
||||
result = testdir.runpytest("--assertmode=reinterp")
|
||||
result = testdir.runpytest("--assert=reinterp")
|
||||
assert result.ret == 0
|
||||
|
||||
def test_triple_quoted_string_issue113(testdir):
|
||||
|
@ -246,11 +240,11 @@ def test_warn_missing(testdir):
|
|||
p1 = testdir.makepyfile("")
|
||||
result = testdir.run(sys.executable, "-OO", "-m", "pytest", "-h")
|
||||
result.stderr.fnmatch_lines([
|
||||
"*WARNING*assertion*",
|
||||
"*WARNING*assert statements are not executed*",
|
||||
])
|
||||
result = testdir.run(sys.executable, "-OO", "-m", "pytest", "--no-assert")
|
||||
result.stderr.fnmatch_lines([
|
||||
"*WARNING*assertion*",
|
||||
"*WARNING*assert statements are not executed*",
|
||||
])
|
||||
|
||||
def test_load_fake_pyc(testdir):
|
||||
|
|
Loading…
Reference in New Issue