Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73d787df3a | ||
|
|
fa3161011a | ||
|
|
2921ca6e64 | ||
|
|
43c0346d68 | ||
|
|
3ed8e28ef3 | ||
|
|
b84a646389 | ||
|
|
b815f67e65 | ||
|
|
55ebf261ce | ||
|
|
b50911285a | ||
|
|
a43205b4bc | ||
|
|
2b75a311a7 | ||
|
|
26e1784e52 | ||
|
|
dad3e77319 | ||
|
|
3a1c15316b | ||
|
|
a6636fddcd | ||
|
|
738933938a | ||
|
|
342f2cdc17 | ||
|
|
5bd5b8c68a | ||
|
|
a48c47b53b | ||
|
|
9a56bb05be | ||
|
|
ef1b91ba87 | ||
|
|
643e5a9c44 | ||
|
|
b8486037d3 | ||
|
|
78a82c05ef | ||
|
|
853975d93b | ||
|
|
f93995e15c | ||
|
|
f940967e23 | ||
|
|
cbaa7dd56a | ||
|
|
8133d1955e | ||
|
|
738b715655 | ||
|
|
1d5316a28b | ||
|
|
0030ceb11c | ||
|
|
42b3125783 | ||
|
|
50a0d4fa95 | ||
|
|
deff54aae0 | ||
|
|
22a2734d9a | ||
|
|
17985b893d | ||
|
|
1d55c49a9a | ||
|
|
8cc210708c | ||
|
|
4970f6d5c2 | ||
|
|
f883628939 | ||
|
|
40839b5a3a | ||
|
|
5e56d77542 | ||
|
|
630428c611 | ||
|
|
8b4c59e606 | ||
|
|
1ac1ee6fcb | ||
|
|
b7b9c54d27 | ||
|
|
e86fe38144 | ||
|
|
5b26178397 | ||
|
|
130100bba1 | ||
|
|
93e55ad2fa |
@@ -1,19 +1,19 @@
|
||||
exclude: doc/en/example/py2py3/test_py2.py
|
||||
repos:
|
||||
- repo: https://github.com/ambv/black
|
||||
rev: 18.4a4
|
||||
rev: 18.6b4
|
||||
hooks:
|
||||
- id: black
|
||||
args: [--safe, --quiet]
|
||||
language_version: python3.6
|
||||
- repo: https://github.com/asottile/blacken-docs
|
||||
rev: v0.1.1
|
||||
rev: v0.2.0
|
||||
hooks:
|
||||
- id: blacken-docs
|
||||
additional_dependencies: [black==18.5b1]
|
||||
additional_dependencies: [black==18.6b4]
|
||||
language_version: python3.6
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v1.2.3
|
||||
rev: v1.3.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
|
||||
@@ -37,8 +37,8 @@ jobs:
|
||||
python: 'pypy-5.4'
|
||||
- env: TOXENV=py35
|
||||
python: '3.5'
|
||||
- env: TOXENV=py35-freeze
|
||||
python: '3.5'
|
||||
- env: TOXENV=py36-freeze
|
||||
python: '3.6'
|
||||
- env: TOXENV=py37
|
||||
python: 'nightly'
|
||||
|
||||
|
||||
2
AUTHORS
2
AUTHORS
@@ -126,6 +126,7 @@ Maik Figura
|
||||
Mandeep Bhutani
|
||||
Manuel Krebber
|
||||
Marc Schlaich
|
||||
Marcelo Duarte Trevisani
|
||||
Marcin Bachry
|
||||
Mark Abramowitz
|
||||
Markus Unterwaditzer
|
||||
@@ -157,6 +158,7 @@ Oleg Sushchenko
|
||||
Oliver Bestwalter
|
||||
Omar Kohl
|
||||
Omer Hadari
|
||||
Ondřej Súkup
|
||||
Patrick Hayes
|
||||
Paweł Adamczak
|
||||
Pedro Algarvio
|
||||
|
||||
@@ -8,6 +8,52 @@
|
||||
|
||||
.. towncrier release notes start
|
||||
|
||||
Pytest 3.6.3 (2018-07-04)
|
||||
=========================
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
- Fix ``ImportWarning`` triggered by explicit relative imports in
|
||||
assertion-rewritten package modules. (`#3061
|
||||
<https://github.com/pytest-dev/pytest/issues/3061>`_)
|
||||
|
||||
- Fix error in ``pytest.approx`` when dealing with 0-dimension numpy
|
||||
arrays. (`#3593 <https://github.com/pytest-dev/pytest/issues/3593>`_)
|
||||
|
||||
- No longer raise ``ValueError`` when using the ``get_marker`` API. (`#3605
|
||||
<https://github.com/pytest-dev/pytest/issues/3605>`_)
|
||||
|
||||
- Fix problem where log messages with non-ascii characters would not
|
||||
appear in the output log file.
|
||||
(`#3630 <https://github.com/pytest-dev/pytest/issues/3630>`_)
|
||||
|
||||
- No longer raise ``AttributeError`` when legacy marks can't be stored in
|
||||
functions. (`#3631 <https://github.com/pytest-dev/pytest/issues/3631>`_)
|
||||
|
||||
|
||||
Improved Documentation
|
||||
----------------------
|
||||
|
||||
- The description above the example for ``@pytest.mark.skipif`` now better
|
||||
matches the code. (`#3611
|
||||
<https://github.com/pytest-dev/pytest/issues/3611>`_)
|
||||
|
||||
|
||||
Trivial/Internal Changes
|
||||
------------------------
|
||||
|
||||
- Internal refactoring: removed unused ``CallSpec2tox ._globalid_args``
|
||||
attribute and ``metafunc`` parameter from ``CallSpec2.copy()``. (`#3598
|
||||
<https://github.com/pytest-dev/pytest/issues/3598>`_)
|
||||
|
||||
- Silence usage of ``reduce`` warning in Python 2 (`#3609
|
||||
<https://github.com/pytest-dev/pytest/issues/3609>`_)
|
||||
|
||||
- Fix usage of ``attr.ib`` deprecated ``convert`` parameter. (`#3653
|
||||
<https://github.com/pytest-dev/pytest/issues/3653>`_)
|
||||
|
||||
|
||||
Pytest 3.6.2 (2018-06-20)
|
||||
=========================
|
||||
|
||||
|
||||
@@ -10,10 +10,6 @@ taking a lot of time to make a new one.
|
||||
pytest releases must be prepared on **Linux** because the docs and examples expect
|
||||
to be executed in that platform.
|
||||
|
||||
#. Install development dependencies in a virtual environment with::
|
||||
|
||||
pip3 install -U -r tasks/requirements.txt
|
||||
|
||||
#. Create a branch ``release-X.Y.Z`` with the version for the release.
|
||||
|
||||
* **patch releases**: from the latest ``master``;
|
||||
@@ -22,9 +18,19 @@ taking a lot of time to make a new one.
|
||||
|
||||
Ensure your are in a clean work tree.
|
||||
|
||||
#. Generate docs, changelog, announcements and a **local** tag::
|
||||
#. Install development dependencies in a virtual environment with::
|
||||
|
||||
$ pip3 install -U -r tasks/requirements.txt
|
||||
|
||||
#. Generate docs, changelog, announcements, and a **local** tag::
|
||||
|
||||
$ invoke generate.pre-release <VERSION>
|
||||
|
||||
#. Execute pre-commit on all files to ensure the docs are conformant and commit your results::
|
||||
|
||||
$ pre-commit run --all-files
|
||||
$ git commit -am "Fix files with pre-commit"
|
||||
|
||||
invoke generate.pre-release <VERSION>
|
||||
|
||||
#. Open a PR for this branch targeting ``master``.
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ environment:
|
||||
- TOXENV: "py36-pluggymaster"
|
||||
- TOXENV: "py27-nobyte"
|
||||
- TOXENV: "doctesting"
|
||||
- TOXENV: "py35-freeze"
|
||||
- TOXENV: "py36-freeze"
|
||||
- TOXENV: "docs"
|
||||
|
||||
install:
|
||||
@@ -46,3 +46,7 @@ test_script:
|
||||
cache:
|
||||
- '%LOCALAPPDATA%\pip\cache'
|
||||
- '%USERPROFILE%\.cache\pre-commit'
|
||||
|
||||
# We don't deploy anything on tags with AppVeyor, we use Travis instead, so we
|
||||
# might as well save resources
|
||||
skip_tags: true
|
||||
|
||||
@@ -6,6 +6,7 @@ Release announcements
|
||||
:maxdepth: 2
|
||||
|
||||
|
||||
release-3.6.3
|
||||
release-3.6.2
|
||||
release-3.6.1
|
||||
release-3.6.0
|
||||
|
||||
@@ -23,7 +23,7 @@ a full list of details. A few feature highlights:
|
||||
called if the corresponding setup method succeeded.
|
||||
|
||||
- integrate tab-completion on command line options if you
|
||||
have `argcomplete <http://pypi.python.org/pypi/argcomplete>`_
|
||||
have `argcomplete <https://pypi.org/project/argcomplete/>`_
|
||||
configured.
|
||||
|
||||
- allow boolean expression directly with skipif/xfail
|
||||
|
||||
28
doc/en/announce/release-3.6.3.rst
Normal file
28
doc/en/announce/release-3.6.3.rst
Normal file
@@ -0,0 +1,28 @@
|
||||
pytest-3.6.3
|
||||
=======================================
|
||||
|
||||
pytest 3.6.3 has just been released to PyPI.
|
||||
|
||||
This is a bug-fix release, being a drop-in replacement. To upgrade::
|
||||
|
||||
pip install --upgrade pytest
|
||||
|
||||
The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
|
||||
|
||||
Thanks to all who contributed to this release, among them:
|
||||
|
||||
* AdamEr8
|
||||
* Anthony Sottile
|
||||
* Bruno Oliveira
|
||||
* Jean-Paul Calderone
|
||||
* Jon Dufresne
|
||||
* Marcelo Duarte Trevisani
|
||||
* Ondřej Súkup
|
||||
* Ronny Pfannschmidt
|
||||
* T.E.A de Souza
|
||||
* Victor
|
||||
* victor
|
||||
|
||||
|
||||
Happy testing,
|
||||
The pytest Development Team
|
||||
@@ -90,7 +90,7 @@ For information about fixtures, see :ref:`fixtures`. To see a complete list of a
|
||||
monkeypatch.setitem(mapping, name, value)
|
||||
monkeypatch.delitem(obj, name, raising=True)
|
||||
monkeypatch.setenv(name, value, prepend=False)
|
||||
monkeypatch.delenv(name, value, raising=True)
|
||||
monkeypatch.delenv(name, raising=True)
|
||||
monkeypatch.syspath_prepend(path)
|
||||
monkeypatch.chdir(path)
|
||||
|
||||
|
||||
@@ -25,9 +25,7 @@ def pytest_generate_tests(metafunc):
|
||||
|
||||
|
||||
class TestFailing(object):
|
||||
|
||||
def test_simple(self):
|
||||
|
||||
def f():
|
||||
return 42
|
||||
|
||||
@@ -40,7 +38,6 @@ class TestFailing(object):
|
||||
otherfunc_multi(42, 6 * 9)
|
||||
|
||||
def test_not(self):
|
||||
|
||||
def f():
|
||||
return 42
|
||||
|
||||
@@ -48,7 +45,6 @@ class TestFailing(object):
|
||||
|
||||
|
||||
class TestSpecialisedExplanations(object):
|
||||
|
||||
def test_eq_text(self):
|
||||
assert "spam" == "eggs"
|
||||
|
||||
@@ -106,7 +102,6 @@ class TestSpecialisedExplanations(object):
|
||||
|
||||
|
||||
def test_attribute():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -115,7 +110,6 @@ def test_attribute():
|
||||
|
||||
|
||||
def test_attribute_instance():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -123,9 +117,7 @@ def test_attribute_instance():
|
||||
|
||||
|
||||
def test_attribute_failure():
|
||||
|
||||
class Foo(object):
|
||||
|
||||
def _get_b(self):
|
||||
raise Exception("Failed to get attrib")
|
||||
|
||||
@@ -136,7 +128,6 @@ def test_attribute_failure():
|
||||
|
||||
|
||||
def test_attribute_multiple():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -151,7 +142,6 @@ def globf(x):
|
||||
|
||||
|
||||
class TestRaises(object):
|
||||
|
||||
def test_raises(self):
|
||||
s = "qwe" # NOQA
|
||||
raises(TypeError, "int(s)")
|
||||
@@ -193,9 +183,7 @@ def test_dynamic_compile_shows_nicely():
|
||||
|
||||
|
||||
class TestMoreErrors(object):
|
||||
|
||||
def test_complex_error(self):
|
||||
|
||||
def f():
|
||||
return 44
|
||||
|
||||
@@ -218,7 +206,6 @@ class TestMoreErrors(object):
|
||||
assert s.startswith(g)
|
||||
|
||||
def test_startswith_nested(self):
|
||||
|
||||
def f():
|
||||
return "123"
|
||||
|
||||
@@ -246,9 +233,7 @@ class TestMoreErrors(object):
|
||||
|
||||
|
||||
class TestCustomAssertMsg(object):
|
||||
|
||||
def test_single_line(self):
|
||||
|
||||
class A(object):
|
||||
a = 1
|
||||
|
||||
@@ -256,7 +241,6 @@ class TestCustomAssertMsg(object):
|
||||
assert A.a == b, "A.a appears not to be b"
|
||||
|
||||
def test_multiline(self):
|
||||
|
||||
class A(object):
|
||||
a = 1
|
||||
|
||||
@@ -266,7 +250,6 @@ class TestCustomAssertMsg(object):
|
||||
), "A.a appears not to be b\n" "or does not appear to be b\none of those"
|
||||
|
||||
def test_custom_repr(self):
|
||||
|
||||
class JSON(object):
|
||||
a = 1
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import py
|
||||
|
||||
failure_demo = py.path.local(__file__).dirpath("failure_demo.py")
|
||||
pytest_plugins = "pytester",
|
||||
pytest_plugins = ("pytester",)
|
||||
|
||||
|
||||
def test_failure_demo_fails_properly(testdir):
|
||||
|
||||
@@ -3,7 +3,6 @@ def setup_module(module):
|
||||
|
||||
|
||||
class TestStateFullThing(object):
|
||||
|
||||
def setup_class(cls):
|
||||
cls.classcount += 1
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ def setup(request):
|
||||
|
||||
|
||||
class CostlySetup(object):
|
||||
|
||||
def __init__(self):
|
||||
import time
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ def python2(request, python1):
|
||||
|
||||
|
||||
class Python(object):
|
||||
|
||||
def __init__(self, version, picklefile):
|
||||
self.pythonpath = py.path.local.sysfind(version)
|
||||
if not self.pythonpath:
|
||||
|
||||
@@ -9,7 +9,6 @@ def pytest_collect_file(parent, path):
|
||||
|
||||
|
||||
class YamlFile(pytest.File):
|
||||
|
||||
def collect(self):
|
||||
import yaml # we need a yaml parser, e.g. PyYAML
|
||||
|
||||
@@ -19,7 +18,6 @@ class YamlFile(pytest.File):
|
||||
|
||||
|
||||
class YamlItem(pytest.Item):
|
||||
|
||||
def __init__(self, name, parent, spec):
|
||||
super(YamlItem, self).__init__(name, parent)
|
||||
self.spec = spec
|
||||
|
||||
@@ -5,7 +5,6 @@ py3 = sys.version_info[0] >= 3
|
||||
|
||||
|
||||
class DummyCollector(pytest.collect.File):
|
||||
|
||||
def collect(self):
|
||||
return []
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ def test_function():
|
||||
|
||||
|
||||
class TestClass(object):
|
||||
|
||||
def test_method(self):
|
||||
pass
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ get on the terminal - we are working on that)::
|
||||
self = <failure_demo.TestFailing object at 0xdeadbeef>
|
||||
|
||||
def test_simple(self):
|
||||
|
||||
def f():
|
||||
return 42
|
||||
|
||||
@@ -44,7 +43,7 @@ get on the terminal - we are working on that)::
|
||||
E + where 42 = <function TestFailing.test_simple.<locals>.f at 0xdeadbeef>()
|
||||
E + and 43 = <function TestFailing.test_simple.<locals>.g at 0xdeadbeef>()
|
||||
|
||||
failure_demo.py:37: AssertionError
|
||||
failure_demo.py:35: AssertionError
|
||||
____________________ TestFailing.test_simple_multiline _____________________
|
||||
|
||||
self = <failure_demo.TestFailing object at 0xdeadbeef>
|
||||
@@ -52,7 +51,7 @@ get on the terminal - we are working on that)::
|
||||
def test_simple_multiline(self):
|
||||
> otherfunc_multi(42, 6 * 9)
|
||||
|
||||
failure_demo.py:40:
|
||||
failure_demo.py:38:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
|
||||
a = 42, b = 54
|
||||
@@ -67,7 +66,6 @@ get on the terminal - we are working on that)::
|
||||
self = <failure_demo.TestFailing object at 0xdeadbeef>
|
||||
|
||||
def test_not(self):
|
||||
|
||||
def f():
|
||||
return 42
|
||||
|
||||
@@ -75,7 +73,7 @@ get on the terminal - we are working on that)::
|
||||
E assert not 42
|
||||
E + where 42 = <function TestFailing.test_not.<locals>.f at 0xdeadbeef>()
|
||||
|
||||
failure_demo.py:47: AssertionError
|
||||
failure_demo.py:44: AssertionError
|
||||
_________________ TestSpecialisedExplanations.test_eq_text _________________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -86,7 +84,7 @@ get on the terminal - we are working on that)::
|
||||
E - spam
|
||||
E + eggs
|
||||
|
||||
failure_demo.py:53: AssertionError
|
||||
failure_demo.py:49: AssertionError
|
||||
_____________ TestSpecialisedExplanations.test_eq_similar_text _____________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -99,7 +97,7 @@ get on the terminal - we are working on that)::
|
||||
E + foo 2 bar
|
||||
E ? ^
|
||||
|
||||
failure_demo.py:56: AssertionError
|
||||
failure_demo.py:52: AssertionError
|
||||
____________ TestSpecialisedExplanations.test_eq_multiline_text ____________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -112,7 +110,7 @@ get on the terminal - we are working on that)::
|
||||
E + eggs
|
||||
E bar
|
||||
|
||||
failure_demo.py:59: AssertionError
|
||||
failure_demo.py:55: AssertionError
|
||||
______________ TestSpecialisedExplanations.test_eq_long_text _______________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -129,7 +127,7 @@ get on the terminal - we are working on that)::
|
||||
E + 1111111111b222222222
|
||||
E ? ^
|
||||
|
||||
failure_demo.py:64: AssertionError
|
||||
failure_demo.py:60: AssertionError
|
||||
_________ TestSpecialisedExplanations.test_eq_long_text_multiline __________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -149,7 +147,7 @@ get on the terminal - we are working on that)::
|
||||
E
|
||||
E ...Full output truncated (7 lines hidden), use '-vv' to show
|
||||
|
||||
failure_demo.py:69: AssertionError
|
||||
failure_demo.py:65: AssertionError
|
||||
_________________ TestSpecialisedExplanations.test_eq_list _________________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -160,7 +158,7 @@ get on the terminal - we are working on that)::
|
||||
E At index 2 diff: 2 != 3
|
||||
E Use -v to get the full diff
|
||||
|
||||
failure_demo.py:72: AssertionError
|
||||
failure_demo.py:68: AssertionError
|
||||
______________ TestSpecialisedExplanations.test_eq_list_long _______________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -173,7 +171,7 @@ get on the terminal - we are working on that)::
|
||||
E At index 100 diff: 1 != 2
|
||||
E Use -v to get the full diff
|
||||
|
||||
failure_demo.py:77: AssertionError
|
||||
failure_demo.py:73: AssertionError
|
||||
_________________ TestSpecialisedExplanations.test_eq_dict _________________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -191,7 +189,7 @@ get on the terminal - we are working on that)::
|
||||
E
|
||||
E ...Full output truncated (2 lines hidden), use '-vv' to show
|
||||
|
||||
failure_demo.py:80: AssertionError
|
||||
failure_demo.py:76: AssertionError
|
||||
_________________ TestSpecialisedExplanations.test_eq_set __________________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -209,7 +207,7 @@ get on the terminal - we are working on that)::
|
||||
E
|
||||
E ...Full output truncated (2 lines hidden), use '-vv' to show
|
||||
|
||||
failure_demo.py:83: AssertionError
|
||||
failure_demo.py:79: AssertionError
|
||||
_____________ TestSpecialisedExplanations.test_eq_longer_list ______________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -220,7 +218,7 @@ get on the terminal - we are working on that)::
|
||||
E Right contains more items, first extra item: 3
|
||||
E Use -v to get the full diff
|
||||
|
||||
failure_demo.py:86: AssertionError
|
||||
failure_demo.py:82: AssertionError
|
||||
_________________ TestSpecialisedExplanations.test_in_list _________________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -229,7 +227,7 @@ get on the terminal - we are working on that)::
|
||||
> assert 1 in [0, 2, 3, 4, 5]
|
||||
E assert 1 in [0, 2, 3, 4, 5]
|
||||
|
||||
failure_demo.py:89: AssertionError
|
||||
failure_demo.py:85: AssertionError
|
||||
__________ TestSpecialisedExplanations.test_not_in_text_multiline __________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -248,7 +246,7 @@ get on the terminal - we are working on that)::
|
||||
E
|
||||
E ...Full output truncated (2 lines hidden), use '-vv' to show
|
||||
|
||||
failure_demo.py:93: AssertionError
|
||||
failure_demo.py:89: AssertionError
|
||||
___________ TestSpecialisedExplanations.test_not_in_text_single ____________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -261,7 +259,7 @@ get on the terminal - we are working on that)::
|
||||
E single foo line
|
||||
E ? +++
|
||||
|
||||
failure_demo.py:97: AssertionError
|
||||
failure_demo.py:93: AssertionError
|
||||
_________ TestSpecialisedExplanations.test_not_in_text_single_long _________
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -274,7 +272,7 @@ get on the terminal - we are working on that)::
|
||||
E head head foo tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail
|
||||
E ? +++
|
||||
|
||||
failure_demo.py:101: AssertionError
|
||||
failure_demo.py:97: AssertionError
|
||||
______ TestSpecialisedExplanations.test_not_in_text_single_long_term _______
|
||||
|
||||
self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef>
|
||||
@@ -287,11 +285,10 @@ get on the terminal - we are working on that)::
|
||||
E head head fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffftail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail
|
||||
E ? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
failure_demo.py:105: AssertionError
|
||||
failure_demo.py:101: AssertionError
|
||||
______________________________ test_attribute ______________________________
|
||||
|
||||
def test_attribute():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -300,11 +297,10 @@ get on the terminal - we are working on that)::
|
||||
E assert 1 == 2
|
||||
E + where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0xdeadbeef>.b
|
||||
|
||||
failure_demo.py:114: AssertionError
|
||||
failure_demo.py:109: AssertionError
|
||||
_________________________ test_attribute_instance __________________________
|
||||
|
||||
def test_attribute_instance():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -313,13 +309,11 @@ get on the terminal - we are working on that)::
|
||||
E + where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef>.b
|
||||
E + where <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
|
||||
|
||||
failure_demo.py:122: AssertionError
|
||||
failure_demo.py:116: AssertionError
|
||||
__________________________ test_attribute_failure __________________________
|
||||
|
||||
def test_attribute_failure():
|
||||
|
||||
class Foo(object):
|
||||
|
||||
def _get_b(self):
|
||||
raise Exception("Failed to get attrib")
|
||||
|
||||
@@ -328,7 +322,7 @@ get on the terminal - we are working on that)::
|
||||
i = Foo()
|
||||
> assert i.b == 2
|
||||
|
||||
failure_demo.py:135:
|
||||
failure_demo.py:127:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
|
||||
self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0xdeadbeef>
|
||||
@@ -337,11 +331,10 @@ get on the terminal - we are working on that)::
|
||||
> raise Exception("Failed to get attrib")
|
||||
E Exception: Failed to get attrib
|
||||
|
||||
failure_demo.py:130: Exception
|
||||
failure_demo.py:122: Exception
|
||||
_________________________ test_attribute_multiple __________________________
|
||||
|
||||
def test_attribute_multiple():
|
||||
|
||||
class Foo(object):
|
||||
b = 1
|
||||
|
||||
@@ -355,7 +348,7 @@ get on the terminal - we are working on that)::
|
||||
E + and 2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef>.b
|
||||
E + where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
|
||||
|
||||
failure_demo.py:146: AssertionError
|
||||
failure_demo.py:137: AssertionError
|
||||
__________________________ TestRaises.test_raises __________________________
|
||||
|
||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||
@@ -364,13 +357,13 @@ get on the terminal - we are working on that)::
|
||||
s = "qwe" # NOQA
|
||||
> raises(TypeError, "int(s)")
|
||||
|
||||
failure_demo.py:157:
|
||||
failure_demo.py:147:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
|
||||
> int(s)
|
||||
E ValueError: invalid literal for int() with base 10: 'qwe'
|
||||
|
||||
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python_api.py:634>:1: ValueError
|
||||
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python_api.py:635>:1: ValueError
|
||||
______________________ TestRaises.test_raises_doesnt _______________________
|
||||
|
||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||
@@ -379,7 +372,7 @@ get on the terminal - we are working on that)::
|
||||
> raises(IOError, "int('3')")
|
||||
E Failed: DID NOT RAISE <class 'OSError'>
|
||||
|
||||
failure_demo.py:160: Failed
|
||||
failure_demo.py:150: Failed
|
||||
__________________________ TestRaises.test_raise ___________________________
|
||||
|
||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||
@@ -388,7 +381,7 @@ get on the terminal - we are working on that)::
|
||||
> raise ValueError("demo error")
|
||||
E ValueError: demo error
|
||||
|
||||
failure_demo.py:163: ValueError
|
||||
failure_demo.py:153: ValueError
|
||||
________________________ TestRaises.test_tupleerror ________________________
|
||||
|
||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||
@@ -397,7 +390,7 @@ get on the terminal - we are working on that)::
|
||||
> a, b = [1] # NOQA
|
||||
E ValueError: not enough values to unpack (expected 2, got 1)
|
||||
|
||||
failure_demo.py:166: ValueError
|
||||
failure_demo.py:156: ValueError
|
||||
______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______
|
||||
|
||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||
@@ -408,7 +401,7 @@ get on the terminal - we are working on that)::
|
||||
> a, b = items.pop()
|
||||
E TypeError: 'int' object is not iterable
|
||||
|
||||
failure_demo.py:171: TypeError
|
||||
failure_demo.py:161: TypeError
|
||||
--------------------------- Captured stdout call ---------------------------
|
||||
items is [1, 2, 3]
|
||||
________________________ TestRaises.test_some_error ________________________
|
||||
@@ -419,7 +412,7 @@ get on the terminal - we are working on that)::
|
||||
> if namenotexi: # NOQA
|
||||
E NameError: name 'namenotexi' is not defined
|
||||
|
||||
failure_demo.py:174: NameError
|
||||
failure_demo.py:164: NameError
|
||||
____________________ test_dynamic_compile_shows_nicely _____________________
|
||||
|
||||
def test_dynamic_compile_shows_nicely():
|
||||
@@ -434,20 +427,19 @@ get on the terminal - we are working on that)::
|
||||
sys.modules[name] = module
|
||||
> module.foo()
|
||||
|
||||
failure_demo.py:192:
|
||||
failure_demo.py:182:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
|
||||
def foo():
|
||||
> assert 1 == 0
|
||||
E AssertionError
|
||||
|
||||
<2-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:189>:2: AssertionError
|
||||
<2-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:179>:2: AssertionError
|
||||
____________________ TestMoreErrors.test_complex_error _____________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
|
||||
def test_complex_error(self):
|
||||
|
||||
def f():
|
||||
return 44
|
||||
|
||||
@@ -456,7 +448,7 @@ get on the terminal - we are working on that)::
|
||||
|
||||
> somefunc(f(), g())
|
||||
|
||||
failure_demo.py:205:
|
||||
failure_demo.py:193:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
failure_demo.py:11: in somefunc
|
||||
otherfunc(x, y)
|
||||
@@ -478,7 +470,7 @@ get on the terminal - we are working on that)::
|
||||
> a, b = items
|
||||
E ValueError: not enough values to unpack (expected 2, got 0)
|
||||
|
||||
failure_demo.py:209: ValueError
|
||||
failure_demo.py:197: ValueError
|
||||
____________________ TestMoreErrors.test_z2_type_error _____________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -488,7 +480,7 @@ get on the terminal - we are working on that)::
|
||||
> a, b = items
|
||||
E TypeError: 'int' object is not iterable
|
||||
|
||||
failure_demo.py:213: TypeError
|
||||
failure_demo.py:201: TypeError
|
||||
______________________ TestMoreErrors.test_startswith ______________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -501,13 +493,12 @@ get on the terminal - we are working on that)::
|
||||
E + where False = <built-in method startswith of str object at 0xdeadbeef>('456')
|
||||
E + where <built-in method startswith of str object at 0xdeadbeef> = '123'.startswith
|
||||
|
||||
failure_demo.py:218: AssertionError
|
||||
failure_demo.py:206: AssertionError
|
||||
__________________ TestMoreErrors.test_startswith_nested ___________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
|
||||
def test_startswith_nested(self):
|
||||
|
||||
def f():
|
||||
return "123"
|
||||
|
||||
@@ -521,7 +512,7 @@ get on the terminal - we are working on that)::
|
||||
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0xdeadbeef>()
|
||||
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0xdeadbeef>()
|
||||
|
||||
failure_demo.py:228: AssertionError
|
||||
failure_demo.py:215: AssertionError
|
||||
_____________________ TestMoreErrors.test_global_func ______________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -532,7 +523,7 @@ get on the terminal - we are working on that)::
|
||||
E + where False = isinstance(43, float)
|
||||
E + where 43 = globf(42)
|
||||
|
||||
failure_demo.py:231: AssertionError
|
||||
failure_demo.py:218: AssertionError
|
||||
_______________________ TestMoreErrors.test_instance _______________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -543,7 +534,7 @@ get on the terminal - we are working on that)::
|
||||
E assert 42 != 42
|
||||
E + where 42 = <failure_demo.TestMoreErrors object at 0xdeadbeef>.x
|
||||
|
||||
failure_demo.py:235: AssertionError
|
||||
failure_demo.py:222: AssertionError
|
||||
_______________________ TestMoreErrors.test_compare ________________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -553,7 +544,7 @@ get on the terminal - we are working on that)::
|
||||
E assert 11 < 5
|
||||
E + where 11 = globf(10)
|
||||
|
||||
failure_demo.py:238: AssertionError
|
||||
failure_demo.py:225: AssertionError
|
||||
_____________________ TestMoreErrors.test_try_finally ______________________
|
||||
|
||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||
@@ -564,13 +555,12 @@ get on the terminal - we are working on that)::
|
||||
> assert x == 0
|
||||
E assert 1 == 0
|
||||
|
||||
failure_demo.py:243: AssertionError
|
||||
failure_demo.py:230: AssertionError
|
||||
___________________ TestCustomAssertMsg.test_single_line ___________________
|
||||
|
||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||
|
||||
def test_single_line(self):
|
||||
|
||||
class A(object):
|
||||
a = 1
|
||||
|
||||
@@ -580,13 +570,12 @@ get on the terminal - we are working on that)::
|
||||
E assert 1 == 2
|
||||
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_single_line.<locals>.A'>.a
|
||||
|
||||
failure_demo.py:256: AssertionError
|
||||
failure_demo.py:241: AssertionError
|
||||
____________________ TestCustomAssertMsg.test_multiline ____________________
|
||||
|
||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||
|
||||
def test_multiline(self):
|
||||
|
||||
class A(object):
|
||||
a = 1
|
||||
|
||||
@@ -600,13 +589,12 @@ get on the terminal - we are working on that)::
|
||||
E assert 1 == 2
|
||||
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_multiline.<locals>.A'>.a
|
||||
|
||||
failure_demo.py:264: AssertionError
|
||||
failure_demo.py:248: AssertionError
|
||||
___________________ TestCustomAssertMsg.test_custom_repr ___________________
|
||||
|
||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||
|
||||
def test_custom_repr(self):
|
||||
|
||||
class JSON(object):
|
||||
a = 1
|
||||
|
||||
@@ -623,7 +611,7 @@ get on the terminal - we are working on that)::
|
||||
E assert 1 == 2
|
||||
E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a
|
||||
|
||||
failure_demo.py:278: AssertionError
|
||||
failure_demo.py:261: AssertionError
|
||||
============================= warnings summary =============================
|
||||
<undetermined location>
|
||||
Metafunc.addcall is deprecated and scheduled to be removed in pytest 4.0.
|
||||
|
||||
@@ -416,7 +416,7 @@ Now we can profile which test functions execute the slowest::
|
||||
========================= slowest 3 test durations =========================
|
||||
0.30s call test_some_are_slow.py::test_funcslow2
|
||||
0.20s call test_some_are_slow.py::test_funcslow1
|
||||
0.10s call test_some_are_slow.py::test_funcfast
|
||||
0.13s call test_some_are_slow.py::test_funcfast
|
||||
========================= 3 passed in 0.12 seconds =========================
|
||||
|
||||
incremental testing - test steps
|
||||
|
||||
@@ -154,7 +154,7 @@ This makes use of the automatic caching mechanisms of pytest.
|
||||
Another good approach is by adding the data files in the ``tests`` folder.
|
||||
There are also community plugins available to help managing this aspect of
|
||||
testing, e.g. `pytest-datadir <https://github.com/gabrielcnr/pytest-datadir>`__
|
||||
and `pytest-datafiles <https://pypi.python.org/pypi/pytest-datafiles>`__.
|
||||
and `pytest-datafiles <https://pypi.org/project/pytest-datafiles/>`__.
|
||||
|
||||
.. _smtpshared:
|
||||
|
||||
|
||||
@@ -80,11 +80,11 @@ during import time.
|
||||
|
||||
If you wish to skip something conditionally then you can use ``skipif`` instead.
|
||||
Here is an example of marking a test function to be skipped
|
||||
when run on a Python3.6 interpreter::
|
||||
when run on an interpreter earlier than Python3.6 ::
|
||||
|
||||
import sys
|
||||
@pytest.mark.skipif(sys.version_info < (3,6),
|
||||
reason="requires python3.6")
|
||||
reason="requires python3.6 or higher")
|
||||
def test_function():
|
||||
...
|
||||
|
||||
|
||||
@@ -274,6 +274,7 @@ class Traceback(list):
|
||||
""" Traceback objects encapsulate and offer higher level
|
||||
access to Traceback entries.
|
||||
"""
|
||||
|
||||
Entry = TracebackEntry
|
||||
|
||||
def __init__(self, tb, excinfo=None):
|
||||
@@ -382,8 +383,11 @@ class ExceptionInfo(object):
|
||||
""" wraps sys.exc_info() objects and offers
|
||||
help for navigating the traceback.
|
||||
"""
|
||||
|
||||
_striptext = ""
|
||||
_assert_start_repr = "AssertionError(u'assert " if _PY2 else "AssertionError('assert "
|
||||
_assert_start_repr = (
|
||||
"AssertionError(u'assert " if _PY2 else "AssertionError('assert "
|
||||
)
|
||||
|
||||
def __init__(self, tup=None, exprinfo=None):
|
||||
import _pytest._code
|
||||
@@ -424,7 +428,7 @@ class ExceptionInfo(object):
|
||||
text = text.rstrip()
|
||||
if tryshort:
|
||||
if text.startswith(self._striptext):
|
||||
text = text[len(self._striptext):]
|
||||
text = text[len(self._striptext) :]
|
||||
return text
|
||||
|
||||
def errisinstance(self, exc):
|
||||
@@ -497,6 +501,7 @@ class ExceptionInfo(object):
|
||||
@attr.s
|
||||
class FormattedExcinfo(object):
|
||||
""" presenting information about failing Functions and Generators. """
|
||||
|
||||
# for traceback entries
|
||||
flow_marker = ">"
|
||||
fail_marker = "E"
|
||||
@@ -556,7 +561,7 @@ class FormattedExcinfo(object):
|
||||
for line in source.lines[:line_index]:
|
||||
lines.append(space_prefix + line)
|
||||
lines.append(self.flow_marker + " " + source.lines[line_index])
|
||||
for line in source.lines[line_index + 1:]:
|
||||
for line in source.lines[line_index + 1 :]:
|
||||
lines.append(space_prefix + line)
|
||||
if excinfo is not None:
|
||||
indent = 4 if short else self._getindent(source)
|
||||
@@ -691,7 +696,7 @@ class FormattedExcinfo(object):
|
||||
else:
|
||||
if recursionindex is not None:
|
||||
extraline = "!!! Recursion detected (same locals & position)"
|
||||
traceback = traceback[:recursionindex + 1]
|
||||
traceback = traceback[: recursionindex + 1]
|
||||
else:
|
||||
extraline = None
|
||||
|
||||
@@ -722,15 +727,19 @@ class FormattedExcinfo(object):
|
||||
repr_chain += [(reprtraceback, reprcrash, descr)]
|
||||
if e.__cause__ is not None:
|
||||
e = e.__cause__
|
||||
excinfo = ExceptionInfo(
|
||||
(type(e), e, e.__traceback__)
|
||||
) if e.__traceback__ else None
|
||||
excinfo = (
|
||||
ExceptionInfo((type(e), e, e.__traceback__))
|
||||
if e.__traceback__
|
||||
else None
|
||||
)
|
||||
descr = "The above exception was the direct cause of the following exception:"
|
||||
elif (e.__context__ is not None and not e.__suppress_context__):
|
||||
elif e.__context__ is not None and not e.__suppress_context__:
|
||||
e = e.__context__
|
||||
excinfo = ExceptionInfo(
|
||||
(type(e), e, e.__traceback__)
|
||||
) if e.__traceback__ else None
|
||||
excinfo = (
|
||||
ExceptionInfo((type(e), e, e.__traceback__))
|
||||
if e.__traceback__
|
||||
else None
|
||||
)
|
||||
descr = "During handling of the above exception, another exception occurred:"
|
||||
else:
|
||||
e = None
|
||||
@@ -739,7 +748,6 @@ class FormattedExcinfo(object):
|
||||
|
||||
|
||||
class TerminalRepr(object):
|
||||
|
||||
def __str__(self):
|
||||
s = self.__unicode__()
|
||||
if _PY2:
|
||||
@@ -759,7 +767,6 @@ class TerminalRepr(object):
|
||||
|
||||
|
||||
class ExceptionRepr(TerminalRepr):
|
||||
|
||||
def __init__(self):
|
||||
self.sections = []
|
||||
|
||||
@@ -773,7 +780,6 @@ class ExceptionRepr(TerminalRepr):
|
||||
|
||||
|
||||
class ExceptionChainRepr(ExceptionRepr):
|
||||
|
||||
def __init__(self, chain):
|
||||
super(ExceptionChainRepr, self).__init__()
|
||||
self.chain = chain
|
||||
@@ -792,7 +798,6 @@ class ExceptionChainRepr(ExceptionRepr):
|
||||
|
||||
|
||||
class ReprExceptionInfo(ExceptionRepr):
|
||||
|
||||
def __init__(self, reprtraceback, reprcrash):
|
||||
super(ReprExceptionInfo, self).__init__()
|
||||
self.reprtraceback = reprtraceback
|
||||
@@ -831,7 +836,6 @@ class ReprTraceback(TerminalRepr):
|
||||
|
||||
|
||||
class ReprTracebackNative(ReprTraceback):
|
||||
|
||||
def __init__(self, tblines):
|
||||
self.style = "native"
|
||||
self.reprentries = [ReprEntryNative(tblines)]
|
||||
@@ -885,7 +889,6 @@ class ReprEntry(TerminalRepr):
|
||||
|
||||
|
||||
class ReprFileLocation(TerminalRepr):
|
||||
|
||||
def __init__(self, path, lineno, message):
|
||||
self.path = str(path)
|
||||
self.lineno = lineno
|
||||
@@ -903,7 +906,6 @@ class ReprFileLocation(TerminalRepr):
|
||||
|
||||
|
||||
class ReprLocals(TerminalRepr):
|
||||
|
||||
def __init__(self, lines):
|
||||
self.lines = lines
|
||||
|
||||
@@ -913,7 +915,6 @@ class ReprLocals(TerminalRepr):
|
||||
|
||||
|
||||
class ReprFuncArgs(TerminalRepr):
|
||||
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ class Source(object):
|
||||
""" an immutable object holding a source code fragment,
|
||||
possibly deindenting it.
|
||||
"""
|
||||
|
||||
_compilecounter = 0
|
||||
|
||||
def __init__(self, *parts, **kwargs):
|
||||
@@ -60,7 +61,7 @@ class Source(object):
|
||||
if key.step not in (None, 1):
|
||||
raise IndexError("cannot slice a Source with a step")
|
||||
newsource = Source()
|
||||
newsource.lines = self.lines[key.start:key.stop]
|
||||
newsource.lines = self.lines[key.start : key.stop]
|
||||
return newsource
|
||||
|
||||
def __len__(self):
|
||||
@@ -178,7 +179,7 @@ class Source(object):
|
||||
except SyntaxError:
|
||||
ex = sys.exc_info()[1]
|
||||
# re-represent syntax errors from parsing python strings
|
||||
msglines = self.lines[:ex.lineno]
|
||||
msglines = self.lines[: ex.lineno]
|
||||
if ex.offset:
|
||||
msglines.append(" " * ex.offset + "^")
|
||||
msglines.append("(code was compiled probably from here: %s)" % filename)
|
||||
@@ -313,7 +314,7 @@ def deindent(lines, offset=None):
|
||||
except (IndentationError, tokenize.TokenError):
|
||||
pass
|
||||
# Add any lines we didn't see. E.g. if an exception was raised.
|
||||
newlines.extend(lines[len(newlines):])
|
||||
newlines.extend(lines[len(newlines) :])
|
||||
return newlines
|
||||
|
||||
|
||||
|
||||
@@ -45,6 +45,14 @@ else:
|
||||
return ast.Call(a, b, c, None, None)
|
||||
|
||||
|
||||
if sys.version_info >= (3, 4):
|
||||
from importlib.util import spec_from_file_location
|
||||
else:
|
||||
|
||||
def spec_from_file_location(*_, **__):
|
||||
return None
|
||||
|
||||
|
||||
class AssertionRewritingHook(object):
|
||||
"""PEP302 Import hook which rewrites asserts."""
|
||||
|
||||
@@ -213,6 +221,8 @@ class AssertionRewritingHook(object):
|
||||
# Normally, this attribute is 3.2+.
|
||||
mod.__cached__ = pyc
|
||||
mod.__loader__ = self
|
||||
# Normally, this attribute is 3.4+
|
||||
mod.__spec__ = spec_from_file_location(name, co.co_filename, loader=self)
|
||||
py.builtin.exec_(co, mod.__dict__)
|
||||
except: # noqa
|
||||
if name in sys.modules:
|
||||
@@ -309,7 +319,7 @@ def _rewrite_test(config, fn):
|
||||
if (
|
||||
not source.startswith(BOM_UTF8)
|
||||
and cookie_re.match(source[0:end1]) is None
|
||||
and cookie_re.match(source[end1 + 1:end2]) is None
|
||||
and cookie_re.match(source[end1 + 1 : end2]) is None
|
||||
):
|
||||
if hasattr(state, "_indecode"):
|
||||
# encodings imported us again, so don't rewrite.
|
||||
|
||||
@@ -322,7 +322,7 @@ def _compare_eq_dict(left, right, verbose=False):
|
||||
def _notin_text(term, text, verbose=False):
|
||||
index = text.find(term)
|
||||
head = text[:index]
|
||||
tail = text[index + len(term):]
|
||||
tail = text[index + len(term) :]
|
||||
correct_text = head + tail
|
||||
diff = _diff_text(correct_text, text, verbose)
|
||||
newdiff = [u("%s is contained here:") % py.io.saferepr(term, maxsize=42)]
|
||||
|
||||
@@ -18,7 +18,6 @@ from os.path import sep as _sep, altsep as _altsep
|
||||
|
||||
|
||||
class Cache(object):
|
||||
|
||||
def __init__(self, config):
|
||||
self.config = config
|
||||
self._cachedir = Cache.cache_dir_from_config(config)
|
||||
@@ -199,9 +198,7 @@ class NFPlugin(object):
|
||||
|
||||
items[:] = self._get_increasing_order(
|
||||
six.itervalues(new_items)
|
||||
) + self._get_increasing_order(
|
||||
six.itervalues(other_items)
|
||||
)
|
||||
) + self._get_increasing_order(six.itervalues(other_items))
|
||||
self.cached_nodeids = [x.nodeid for x in items if isinstance(x, pytest.Item)]
|
||||
|
||||
def _get_increasing_order(self, items):
|
||||
|
||||
@@ -531,7 +531,6 @@ class FDCapture(FDCaptureBinary):
|
||||
|
||||
|
||||
class SysCapture(object):
|
||||
|
||||
def __init__(self, fd, tmpfile=None):
|
||||
name = patchsysdict[fd]
|
||||
self._old = getattr(sys, name)
|
||||
@@ -569,7 +568,6 @@ class SysCapture(object):
|
||||
|
||||
|
||||
class SysCaptureBinary(SysCapture):
|
||||
|
||||
def snap(self):
|
||||
res = self.tmpfile.buffer.getvalue()
|
||||
self.tmpfile.seek(0)
|
||||
|
||||
@@ -72,12 +72,8 @@ def iscoroutinefunction(func):
|
||||
Note: copied and modified from Python 3.5's builtin couroutines.py to avoid import asyncio directly,
|
||||
which in turns also initializes the "logging" module as side-effect (see issue #8).
|
||||
"""
|
||||
return (
|
||||
getattr(func, "_is_coroutine", False)
|
||||
or (
|
||||
hasattr(inspect, "iscoroutinefunction")
|
||||
and inspect.iscoroutinefunction(func)
|
||||
)
|
||||
return getattr(func, "_is_coroutine", False) or (
|
||||
hasattr(inspect, "iscoroutinefunction") and inspect.iscoroutinefunction(func)
|
||||
)
|
||||
|
||||
|
||||
@@ -138,17 +134,13 @@ def getfuncargnames(function, is_method=False, cls=None):
|
||||
# If this function should be treated as a bound method even though
|
||||
# it's passed as an unbound method or function, remove the first
|
||||
# parameter name.
|
||||
if (
|
||||
is_method
|
||||
or (
|
||||
cls
|
||||
and not isinstance(cls.__dict__.get(function.__name__, None), staticmethod)
|
||||
)
|
||||
if is_method or (
|
||||
cls and not isinstance(cls.__dict__.get(function.__name__, None), staticmethod)
|
||||
):
|
||||
arg_names = arg_names[1:]
|
||||
# Remove any names that will be replaced with mocks.
|
||||
if hasattr(function, "__wrapped__"):
|
||||
arg_names = arg_names[num_mock_patch_args(function):]
|
||||
arg_names = arg_names[num_mock_patch_args(function) :]
|
||||
return arg_names
|
||||
|
||||
|
||||
@@ -340,7 +332,6 @@ if _PY2:
|
||||
from py.io import TextIO
|
||||
|
||||
class CaptureIO(TextIO):
|
||||
|
||||
@property
|
||||
def encoding(self):
|
||||
return getattr(self, "_encoding", "UTF-8")
|
||||
@@ -350,7 +341,6 @@ else:
|
||||
import io
|
||||
|
||||
class CaptureIO(io.TextIOWrapper):
|
||||
|
||||
def __init__(self):
|
||||
super(CaptureIO, self).__init__(
|
||||
io.BytesIO(), encoding="UTF-8", newline="", write_through=True
|
||||
|
||||
@@ -30,7 +30,6 @@ hookspec = HookspecMarker("pytest")
|
||||
|
||||
|
||||
class ConftestImportFailure(Exception):
|
||||
|
||||
def __init__(self, path, excinfo):
|
||||
Exception.__init__(self, path, excinfo)
|
||||
self.path = path
|
||||
@@ -318,9 +317,11 @@ class PytestPluginManager(PluginManager):
|
||||
self._configured = True
|
||||
|
||||
def _warn(self, message):
|
||||
kwargs = message if isinstance(message, dict) else {
|
||||
"code": "I1", "message": message, "fslocation": None, "nodeid": None
|
||||
}
|
||||
kwargs = (
|
||||
message
|
||||
if isinstance(message, dict)
|
||||
else {"code": "I1", "message": message, "fslocation": None, "nodeid": None}
|
||||
)
|
||||
self.hook.pytest_logwarning.call_historic(kwargs=kwargs)
|
||||
|
||||
#
|
||||
@@ -335,9 +336,11 @@ class PytestPluginManager(PluginManager):
|
||||
here.
|
||||
"""
|
||||
current = py.path.local()
|
||||
self._confcutdir = current.join(
|
||||
namespace.confcutdir, abs=True
|
||||
) if namespace.confcutdir else None
|
||||
self._confcutdir = (
|
||||
current.join(namespace.confcutdir, abs=True)
|
||||
if namespace.confcutdir
|
||||
else None
|
||||
)
|
||||
self._noconftest = namespace.noconftest
|
||||
testpaths = namespace.file_or_dir
|
||||
foundanchor = False
|
||||
@@ -405,7 +408,9 @@ class PytestPluginManager(PluginManager):
|
||||
try:
|
||||
mod = conftestpath.pyimport()
|
||||
if hasattr(mod, "pytest_plugins") and self._configured:
|
||||
from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST
|
||||
from _pytest.deprecated import (
|
||||
PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST
|
||||
)
|
||||
|
||||
warnings.warn(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST)
|
||||
except Exception:
|
||||
@@ -477,7 +482,8 @@ class PytestPluginManager(PluginManager):
|
||||
except ImportError as e:
|
||||
new_exc_type = ImportError
|
||||
new_exc_message = 'Error importing plugin "%s": %s' % (
|
||||
modname, safe_str(e.args[0])
|
||||
modname,
|
||||
safe_str(e.args[0]),
|
||||
)
|
||||
new_exc = new_exc_type(new_exc_message)
|
||||
|
||||
@@ -518,7 +524,6 @@ def _ensure_removed_sysmodule(modname):
|
||||
|
||||
|
||||
class Notset(object):
|
||||
|
||||
def __repr__(self):
|
||||
return "<NOTSET>"
|
||||
|
||||
|
||||
@@ -149,6 +149,7 @@ class Argument(object):
|
||||
and ignoring choices and integer prefixes
|
||||
https://docs.python.org/3/library/optparse.html#optparse-standard-option-types
|
||||
"""
|
||||
|
||||
_typ_map = {"int": int, "string": str, "float": float, "complex": complex}
|
||||
|
||||
def __init__(self, *names, **attrs):
|
||||
@@ -274,7 +275,6 @@ class Argument(object):
|
||||
|
||||
|
||||
class OptionGroup(object):
|
||||
|
||||
def __init__(self, name, description="", parser=None):
|
||||
self.name = name
|
||||
self.description = description
|
||||
@@ -312,7 +312,6 @@ class OptionGroup(object):
|
||||
|
||||
|
||||
class MyOptionParser(argparse.ArgumentParser):
|
||||
|
||||
def __init__(self, parser, extra_info=None):
|
||||
if not extra_info:
|
||||
extra_info = {}
|
||||
@@ -378,9 +377,8 @@ class DropShorterLongHelpFormatter(argparse.HelpFormatter):
|
||||
xxoption = option[2:]
|
||||
if xxoption.split()[0] not in option_map:
|
||||
shortened = xxoption.replace("-", "")
|
||||
if (
|
||||
shortened not in short_long
|
||||
or len(short_long[shortened]) < len(xxoption)
|
||||
if shortened not in short_long or len(short_long[shortened]) < len(
|
||||
xxoption
|
||||
):
|
||||
short_long[shortened] = xxoption
|
||||
# now short_long has been filled out to the longest with dashes
|
||||
|
||||
@@ -5,4 +5,5 @@ class UsageError(Exception):
|
||||
class PrintHelp(Exception):
|
||||
"""Raised when pytest should print it's help to skip the rest of the
|
||||
argument parsing and validation."""
|
||||
|
||||
pass
|
||||
|
||||
@@ -74,7 +74,6 @@ def get_common_ancestor(paths):
|
||||
|
||||
|
||||
def get_dirs_from_args(args):
|
||||
|
||||
def is_option(x):
|
||||
return str(x).startswith("-")
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ def pytest_configure(config):
|
||||
|
||||
class pytestPDB(object):
|
||||
""" Pseudo PDB that defers to the real pdb. """
|
||||
|
||||
_pluginmanager = None
|
||||
_config = None
|
||||
_pdb_cls = pdb.Pdb
|
||||
@@ -87,7 +88,6 @@ class pytestPDB(object):
|
||||
|
||||
|
||||
class PdbInvoke(object):
|
||||
|
||||
def pytest_exception_interact(self, node, call, report):
|
||||
capman = node.config.pluginmanager.getplugin("capturemanager")
|
||||
if capman:
|
||||
@@ -114,7 +114,9 @@ def _enter_pdb(node, excinfo, rep):
|
||||
showcapture = node.config.option.showcapture
|
||||
|
||||
for sectionname, content in (
|
||||
("stdout", rep.capstdout), ("stderr", rep.capstderr), ("log", rep.caplog)
|
||||
("stdout", rep.capstdout),
|
||||
("stderr", rep.capstderr),
|
||||
("log", rep.caplog),
|
||||
):
|
||||
if showcapture in (sectionname, "all") and content:
|
||||
tw.sep(">", "captured " + sectionname)
|
||||
@@ -148,9 +150,7 @@ def _find_last_non_hidden_frame(stack):
|
||||
|
||||
|
||||
def post_mortem(t):
|
||||
|
||||
class Pdb(pytestPDB._pdb_cls):
|
||||
|
||||
def get_stack(self, f, t):
|
||||
stack, i = pdb.Pdb.get_stack(self, f, t)
|
||||
if f is None:
|
||||
|
||||
@@ -22,7 +22,9 @@ FUNCARG_PREFIX = (
|
||||
"Please remove the prefix and use the @pytest.fixture decorator instead."
|
||||
)
|
||||
|
||||
CFG_PYTEST_SECTION = "[pytest] section in {filename} files is deprecated, use [tool:pytest] instead."
|
||||
CFG_PYTEST_SECTION = (
|
||||
"[pytest] section in {filename} files is deprecated, use [tool:pytest] instead."
|
||||
)
|
||||
|
||||
GETFUNCARGVALUE = "use of getfuncargvalue is deprecated, use getfixturevalue"
|
||||
|
||||
|
||||
@@ -105,7 +105,6 @@ def _is_doctest(config, path, parent):
|
||||
|
||||
|
||||
class ReprFailDoctest(TerminalRepr):
|
||||
|
||||
def __init__(self, reprlocation_lines):
|
||||
# List of (reprlocation, lines) tuples
|
||||
self.reprlocation_lines = reprlocation_lines
|
||||
@@ -118,7 +117,6 @@ class ReprFailDoctest(TerminalRepr):
|
||||
|
||||
|
||||
class MultipleDoctestFailures(Exception):
|
||||
|
||||
def __init__(self, failures):
|
||||
super(MultipleDoctestFailures, self).__init__()
|
||||
self.failures = failures
|
||||
@@ -172,7 +170,6 @@ def _get_runner(checker=None, verbose=None, optionflags=0, continue_on_failure=T
|
||||
|
||||
|
||||
class DoctestItem(pytest.Item):
|
||||
|
||||
def __init__(self, name, parent, runner=None, dtest=None):
|
||||
super(DoctestItem, self).__init__(name, parent)
|
||||
self.runner = runner
|
||||
@@ -243,7 +240,7 @@ class DoctestItem(pytest.Item):
|
||||
for (i, x) in enumerate(lines)
|
||||
]
|
||||
# trim docstring error lines to 10
|
||||
lines = lines[max(example.lineno - 9, 0):example.lineno + 1]
|
||||
lines = lines[max(example.lineno - 9, 0) : example.lineno + 1]
|
||||
else:
|
||||
lines = [
|
||||
"EXAMPLE LOCATION UNKNOWN, not showing all tests of that example"
|
||||
@@ -255,9 +252,7 @@ class DoctestItem(pytest.Item):
|
||||
if isinstance(failure, doctest.DocTestFailure):
|
||||
lines += checker.output_difference(
|
||||
example, failure.got, report_choice
|
||||
).split(
|
||||
"\n"
|
||||
)
|
||||
).split("\n")
|
||||
else:
|
||||
inner_excinfo = ExceptionInfo(failure.exc_info)
|
||||
lines += ["UNEXPECTED EXCEPTION: %s" % repr(inner_excinfo.value)]
|
||||
@@ -347,7 +342,6 @@ def _check_all_skipped(test):
|
||||
|
||||
|
||||
class DoctestModule(pytest.Module):
|
||||
|
||||
def collect(self):
|
||||
import doctest
|
||||
|
||||
@@ -480,9 +474,7 @@ def _get_report_choice(key):
|
||||
DOCTEST_REPORT_CHOICE_NDIFF: doctest.REPORT_NDIFF,
|
||||
DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE: doctest.REPORT_ONLY_FIRST_FAILURE,
|
||||
DOCTEST_REPORT_CHOICE_NONE: 0,
|
||||
}[
|
||||
key
|
||||
]
|
||||
}[key]
|
||||
|
||||
|
||||
def _fix_spoof_python2(runner, encoding):
|
||||
@@ -502,7 +494,6 @@ def _fix_spoof_python2(runner, encoding):
|
||||
from doctest import _SpoofOut
|
||||
|
||||
class UnicodeSpoof(_SpoofOut):
|
||||
|
||||
def getvalue(self):
|
||||
result = _SpoofOut.getvalue(self)
|
||||
if encoding and isinstance(result, bytes):
|
||||
|
||||
@@ -65,7 +65,6 @@ scope2props["function"] = scope2props["instance"] + ("function", "keywords")
|
||||
|
||||
|
||||
def scopeproperty(name=None, doc=None):
|
||||
|
||||
def decoratescope(func):
|
||||
scopename = name or func.__name__
|
||||
|
||||
@@ -276,7 +275,6 @@ def get_direct_param_fixture_func(request):
|
||||
|
||||
|
||||
class FuncFixtureInfo(object):
|
||||
|
||||
def __init__(self, argnames, names_closure, name2fixturedefs):
|
||||
self.argnames = argnames
|
||||
self.names_closure = names_closure
|
||||
@@ -698,7 +696,6 @@ class FixtureLookupError(LookupError):
|
||||
|
||||
|
||||
class FixtureLookupErrorRepr(TerminalRepr):
|
||||
|
||||
def __init__(self, filename, firstlineno, tblines, errorstring, argname):
|
||||
self.tblines = tblines
|
||||
self.errorstring = errorstring
|
||||
@@ -837,9 +834,10 @@ class FixtureDef(object):
|
||||
return hook.pytest_fixture_setup(fixturedef=self, request=request)
|
||||
|
||||
def __repr__(self):
|
||||
return (
|
||||
"<FixtureDef name=%r scope=%r baseid=%r >"
|
||||
% (self.argname, self.scope, self.baseid)
|
||||
return "<FixtureDef name=%r scope=%r baseid=%r >" % (
|
||||
self.argname,
|
||||
self.scope,
|
||||
self.baseid,
|
||||
)
|
||||
|
||||
|
||||
@@ -1064,7 +1062,7 @@ class FixtureManager(object):
|
||||
if nodeid.startswith(baseid):
|
||||
if baseid:
|
||||
i = len(baseid)
|
||||
nextchar = nodeid[i:i + 1]
|
||||
nextchar = nodeid[i : i + 1]
|
||||
if nextchar and nextchar not in ":/":
|
||||
continue
|
||||
autousenames.extend(basenames)
|
||||
@@ -1171,7 +1169,7 @@ class FixtureManager(object):
|
||||
self.config.warn(
|
||||
"C1", deprecated.FUNCARG_PREFIX.format(name=name), nodeid=nodeid
|
||||
)
|
||||
name = name[len(self._argprefix):]
|
||||
name = name[len(self._argprefix) :]
|
||||
elif not isinstance(marker, FixtureFunctionMarker):
|
||||
# magic globals with __getattr__ might have got us a wrong
|
||||
# fixture attribute
|
||||
|
||||
@@ -149,7 +149,7 @@ def showhelp(config):
|
||||
type = "string"
|
||||
spec = "%s (%s)" % (name, type)
|
||||
line = " %-24s %s" % (spec, help)
|
||||
tw.line(line[:tw.fullwidth])
|
||||
tw.line(line[: tw.fullwidth])
|
||||
|
||||
tw.line()
|
||||
tw.line("environment variables:")
|
||||
|
||||
@@ -55,7 +55,6 @@ _py_ext_re = re.compile(r"\.py$")
|
||||
|
||||
|
||||
def bin_xml_escape(arg):
|
||||
|
||||
def repl(matchobj):
|
||||
i = ord(matchobj.group())
|
||||
if i <= 0xFF:
|
||||
@@ -67,7 +66,6 @@ def bin_xml_escape(arg):
|
||||
|
||||
|
||||
class _NodeReporter(object):
|
||||
|
||||
def __init__(self, nodeid, xml):
|
||||
|
||||
self.id = nodeid
|
||||
@@ -358,7 +356,6 @@ def mangle_test_address(address):
|
||||
|
||||
|
||||
class LogXML(object):
|
||||
|
||||
def __init__(self, logfile, prefix, suite_name="pytest", logging="no"):
|
||||
logfile = os.path.expanduser(os.path.expandvars(logfile))
|
||||
self.logfile = os.path.normpath(os.path.abspath(logfile))
|
||||
@@ -544,9 +541,7 @@ class LogXML(object):
|
||||
skips=self.stats["skipped"],
|
||||
tests=numtests,
|
||||
time="%.3f" % suite_time_delta,
|
||||
).unicode(
|
||||
indent=0
|
||||
)
|
||||
).unicode(indent=0)
|
||||
)
|
||||
logfile.close()
|
||||
|
||||
|
||||
@@ -392,7 +392,9 @@ class LoggingPlugin(object):
|
||||
config, "log_file_date_format", "log_date_format"
|
||||
)
|
||||
# Each pytest runtests session will write to a clean logfile
|
||||
self.log_file_handler = logging.FileHandler(log_file, mode="w")
|
||||
self.log_file_handler = logging.FileHandler(
|
||||
log_file, mode="w", encoding="UTF-8"
|
||||
)
|
||||
log_file_formatter = logging.Formatter(
|
||||
log_file_format, datefmt=log_file_date_format
|
||||
)
|
||||
@@ -409,9 +411,7 @@ class LoggingPlugin(object):
|
||||
"""
|
||||
return self._config.getoption(
|
||||
"--log-cli-level"
|
||||
) is not None or self._config.getini(
|
||||
"log_cli"
|
||||
)
|
||||
) is not None or self._config.getini("log_cli")
|
||||
|
||||
@contextmanager
|
||||
def _runtest_for(self, item, when):
|
||||
|
||||
@@ -343,7 +343,6 @@ def _patched_find_module():
|
||||
|
||||
|
||||
class FSHookProxy(object):
|
||||
|
||||
def __init__(self, fspath, pm, remove_mods):
|
||||
self.fspath = fspath
|
||||
self.pm = pm
|
||||
@@ -361,6 +360,7 @@ class NoMatch(Exception):
|
||||
|
||||
class Interrupted(KeyboardInterrupt):
|
||||
""" signals an interrupted test run. """
|
||||
|
||||
__module__ = "builtins" # for py3
|
||||
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ def cached_eval(config, expr, d):
|
||||
|
||||
|
||||
class MarkEvaluator(object):
|
||||
|
||||
def __init__(self, item, name):
|
||||
self.item = item
|
||||
self._marks = None
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import inspect
|
||||
import warnings
|
||||
from collections import namedtuple
|
||||
from functools import reduce
|
||||
from operator import attrgetter
|
||||
|
||||
import attr
|
||||
|
||||
from ..deprecated import MARK_PARAMETERSET_UNPACKING, MARK_INFO_ATTRIBUTE
|
||||
from ..compat import NOTSET, getfslineno, MappingMixin
|
||||
from six.moves import map, reduce
|
||||
from six.moves import map
|
||||
|
||||
|
||||
EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark"
|
||||
@@ -24,9 +25,10 @@ def alias(name, warning=None):
|
||||
|
||||
|
||||
def istestfunc(func):
|
||||
return hasattr(func, "__call__") and getattr(
|
||||
func, "__name__", "<lambda>"
|
||||
) != "<lambda>"
|
||||
return (
|
||||
hasattr(func, "__call__")
|
||||
and getattr(func, "__name__", "<lambda>") != "<lambda>"
|
||||
)
|
||||
|
||||
|
||||
def get_empty_parameterset_mark(config, argnames, func):
|
||||
@@ -39,18 +41,20 @@ def get_empty_parameterset_mark(config, argnames, func):
|
||||
raise LookupError(requested_mark)
|
||||
fs, lineno = getfslineno(func)
|
||||
reason = "got empty parameter set %r, function %s at %s:%d" % (
|
||||
argnames, func.__name__, fs, lineno
|
||||
argnames,
|
||||
func.__name__,
|
||||
fs,
|
||||
lineno,
|
||||
)
|
||||
return mark(reason=reason)
|
||||
|
||||
|
||||
class ParameterSet(namedtuple("ParameterSet", "values, marks, id")):
|
||||
|
||||
@classmethod
|
||||
def param(cls, *values, **kw):
|
||||
marks = kw.pop("marks", ())
|
||||
if isinstance(marks, MarkDecorator):
|
||||
marks = marks,
|
||||
marks = (marks,)
|
||||
else:
|
||||
assert isinstance(marks, (tuple, list, set))
|
||||
|
||||
@@ -87,7 +91,7 @@ class ParameterSet(namedtuple("ParameterSet", "values, marks, id")):
|
||||
argval = argval.args[-1]
|
||||
assert not isinstance(argval, ParameterSet)
|
||||
if legacy_force_tuple:
|
||||
argval = argval,
|
||||
argval = (argval,)
|
||||
|
||||
if newmarks:
|
||||
warnings.warn(MARK_PARAMETERSET_UNPACKING)
|
||||
@@ -221,9 +225,18 @@ def get_unpacked_marks(obj):
|
||||
obtain the unpacked marks that are stored on an object
|
||||
"""
|
||||
mark_list = getattr(obj, "pytestmark", [])
|
||||
|
||||
if not isinstance(mark_list, list):
|
||||
mark_list = [mark_list]
|
||||
return normalize_mark_list(mark_list)
|
||||
|
||||
|
||||
def normalize_mark_list(mark_list):
|
||||
"""
|
||||
normalizes marker decorating helpers to mark objects
|
||||
|
||||
:type mark_list: List[Union[Mark, Markdecorator]]
|
||||
:rtype: List[Mark]
|
||||
"""
|
||||
return [getattr(mark, "mark", mark) for mark in mark_list] # unpack MarkDecorator
|
||||
|
||||
|
||||
@@ -246,7 +259,7 @@ def store_legacy_markinfo(func, mark):
|
||||
if holder is None:
|
||||
holder = MarkInfo.for_mark(mark)
|
||||
setattr(func, mark.name, holder)
|
||||
else:
|
||||
elif isinstance(holder, MarkInfo):
|
||||
holder.add_mark(mark)
|
||||
|
||||
|
||||
@@ -281,7 +294,7 @@ def _marked(func, mark):
|
||||
class MarkInfo(object):
|
||||
""" Marking object created by :class:`MarkDecorator` instances. """
|
||||
|
||||
_marks = attr.ib(convert=list)
|
||||
_marks = attr.ib(converter=list)
|
||||
|
||||
@_marks.validator
|
||||
def validate_marks(self, attribute, value):
|
||||
@@ -332,6 +345,7 @@ class MarkGenerator(object):
|
||||
|
||||
will set a 'slowtest' :class:`MarkInfo` object
|
||||
on the ``test_function`` object. """
|
||||
|
||||
_config = None
|
||||
|
||||
def __getattr__(self, name):
|
||||
@@ -361,7 +375,6 @@ MARK_GEN = MarkGenerator()
|
||||
|
||||
|
||||
class NodeKeywords(MappingMixin):
|
||||
|
||||
def __init__(self, node):
|
||||
self.node = node
|
||||
self.parent = node.parent
|
||||
@@ -408,6 +421,7 @@ class NodeMarkers(object):
|
||||
unstable api
|
||||
|
||||
"""
|
||||
|
||||
own_markers = attr.ib(default=attr.Factory(list))
|
||||
|
||||
def update(self, add_markers):
|
||||
|
||||
@@ -22,7 +22,7 @@ def monkeypatch():
|
||||
monkeypatch.setitem(mapping, name, value)
|
||||
monkeypatch.delitem(obj, name, raising=True)
|
||||
monkeypatch.setenv(name, value, prepend=False)
|
||||
monkeypatch.delenv(name, value, raising=True)
|
||||
monkeypatch.delenv(name, raising=True)
|
||||
monkeypatch.syspath_prepend(path)
|
||||
monkeypatch.chdir(path)
|
||||
|
||||
@@ -86,7 +86,6 @@ def derive_importpath(import_path, raising):
|
||||
|
||||
|
||||
class Notset(object):
|
||||
|
||||
def __repr__(self):
|
||||
return "<notset>"
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ def ischildnode(baseid, nodeid):
|
||||
node_parts = _splitnode(nodeid)
|
||||
if len(node_parts) < len(base_parts):
|
||||
return False
|
||||
return node_parts[:len(base_parts)] == base_parts
|
||||
return node_parts[: len(base_parts)] == base_parts
|
||||
|
||||
|
||||
@attr.s
|
||||
@@ -335,7 +335,6 @@ def _check_initialpaths_for_relpath(session, fspath):
|
||||
|
||||
|
||||
class FSCollector(Collector):
|
||||
|
||||
def __init__(self, fspath, parent=None, config=None, session=None, nodeid=None):
|
||||
fspath = py.path.local(fspath) # xxx only for test_resultlog.py?
|
||||
name = fspath.basename
|
||||
@@ -369,6 +368,7 @@ class Item(Node):
|
||||
""" a basic test invocation item. Note that for a single function
|
||||
there might be multiple test invocation items.
|
||||
"""
|
||||
|
||||
nextitem = None
|
||||
|
||||
def __init__(self, name, parent=None, config=None, session=None, nodeid=None):
|
||||
|
||||
@@ -43,6 +43,7 @@ class Skipped(OutcomeException):
|
||||
|
||||
class Failed(OutcomeException):
|
||||
""" raised from an explicit call to pytest.fail() """
|
||||
|
||||
__module__ = "builtins"
|
||||
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@ def pytest_configure(config):
|
||||
|
||||
|
||||
class LsofFdLeakChecker(object):
|
||||
|
||||
def get_open_files(self):
|
||||
out = self._exec_lsof()
|
||||
open_files = self._parse_lsof_output(out)
|
||||
@@ -73,7 +72,6 @@ class LsofFdLeakChecker(object):
|
||||
return py.process.cmdexec("lsof -Ffn0 -p %d" % pid)
|
||||
|
||||
def _parse_lsof_output(self, out):
|
||||
|
||||
def isopen(line):
|
||||
return line.startswith("f") and (
|
||||
"deleted" not in line
|
||||
@@ -195,7 +193,6 @@ def _pytest(request):
|
||||
|
||||
|
||||
class PytestArg(object):
|
||||
|
||||
def __init__(self, request):
|
||||
self.request = request
|
||||
|
||||
@@ -211,7 +208,6 @@ def get_public_names(values):
|
||||
|
||||
|
||||
class ParsedCall(object):
|
||||
|
||||
def __init__(self, name, kwargs):
|
||||
self.__dict__.update(kwargs)
|
||||
self._name = name
|
||||
@@ -423,13 +419,12 @@ class RunResult(object):
|
||||
"failed": d.get("failed", 0),
|
||||
"error": d.get("error", 0),
|
||||
}
|
||||
assert (
|
||||
obtained == dict(passed=passed, skipped=skipped, failed=failed, error=error)
|
||||
assert obtained == dict(
|
||||
passed=passed, skipped=skipped, failed=failed, error=error
|
||||
)
|
||||
|
||||
|
||||
class CwdSnapshot(object):
|
||||
|
||||
def __init__(self):
|
||||
self.__saved = os.getcwd()
|
||||
|
||||
@@ -438,7 +433,6 @@ class CwdSnapshot(object):
|
||||
|
||||
|
||||
class SysModulesSnapshot(object):
|
||||
|
||||
def __init__(self, preserve=None):
|
||||
self.__preserve = preserve
|
||||
self.__saved = dict(sys.modules)
|
||||
@@ -453,7 +447,6 @@ class SysModulesSnapshot(object):
|
||||
|
||||
|
||||
class SysPathsSnapshot(object):
|
||||
|
||||
def __init__(self):
|
||||
self.__saved = list(sys.path), list(sys.meta_path)
|
||||
|
||||
@@ -778,7 +771,6 @@ class Testdir(object):
|
||||
rec = []
|
||||
|
||||
class Collect(object):
|
||||
|
||||
def pytest_configure(x, config):
|
||||
rec.append(self.make_hook_recorder(config.pluginmanager))
|
||||
|
||||
@@ -910,8 +902,10 @@ class Testdir(object):
|
||||
for item in items:
|
||||
if item.name == funcname:
|
||||
return item
|
||||
assert 0, (
|
||||
"%r item not found in module:\n%s\nitems: %s" % (funcname, source, items)
|
||||
assert 0, "%r item not found in module:\n%s\nitems: %s" % (
|
||||
funcname,
|
||||
source,
|
||||
items,
|
||||
)
|
||||
|
||||
def getitems(self, source):
|
||||
@@ -1115,7 +1109,6 @@ def getdecoded(out):
|
||||
|
||||
|
||||
class LineComp(object):
|
||||
|
||||
def __init__(self):
|
||||
self.stringio = py.io.TextIO()
|
||||
|
||||
@@ -1202,7 +1195,7 @@ class LineMatcher(object):
|
||||
"""
|
||||
for i, line in enumerate(self.lines):
|
||||
if fnline == line or fnmatch(line, fnline):
|
||||
return self.lines[i + 1:]
|
||||
return self.lines[i + 1 :]
|
||||
raise ValueError("line %r not found in output" % fnline)
|
||||
|
||||
def _log(self, *args):
|
||||
|
||||
@@ -39,7 +39,11 @@ from _pytest.compat import (
|
||||
get_default_arg_names,
|
||||
)
|
||||
from _pytest.outcomes import fail
|
||||
from _pytest.mark.structures import transfer_markers, get_unpacked_marks
|
||||
from _pytest.mark.structures import (
|
||||
transfer_markers,
|
||||
get_unpacked_marks,
|
||||
normalize_mark_list,
|
||||
)
|
||||
|
||||
|
||||
# relative paths that we use to filter traceback entries from appearing to the user;
|
||||
@@ -69,13 +73,12 @@ def filter_traceback(entry):
|
||||
# entry.path might point to a non-existing file, in which case it will
|
||||
# also return a str object. see #1133
|
||||
p = py.path.local(entry.path)
|
||||
return not p.relto(_pluggy_dir) and not p.relto(_pytest_dir) and not p.relto(
|
||||
_py_dir
|
||||
return (
|
||||
not p.relto(_pluggy_dir) and not p.relto(_pytest_dir) and not p.relto(_py_dir)
|
||||
)
|
||||
|
||||
|
||||
def pyobj_property(name):
|
||||
|
||||
def get(self):
|
||||
node = self.getparent(getattr(__import__("pytest"), name))
|
||||
if node is not None:
|
||||
@@ -258,7 +261,6 @@ class PyobjMixin(PyobjContext):
|
||||
super(PyobjMixin, self).__init__(*k, **kw)
|
||||
|
||||
def obj():
|
||||
|
||||
def fget(self):
|
||||
obj = getattr(self, "_obj", None)
|
||||
if obj is None:
|
||||
@@ -320,7 +322,6 @@ class PyobjMixin(PyobjContext):
|
||||
|
||||
|
||||
class PyCollector(PyobjMixin, nodes.Collector):
|
||||
|
||||
def funcnamefilter(self, name):
|
||||
return self._matches_prefix_or_glob_option("python_functions", name)
|
||||
|
||||
@@ -487,9 +488,11 @@ class Module(nodes.File, PyCollector):
|
||||
exc_info = ExceptionInfo()
|
||||
if self.config.getoption("verbose") < 2:
|
||||
exc_info.traceback = exc_info.traceback.filter(filter_traceback)
|
||||
exc_repr = exc_info.getrepr(
|
||||
style="short"
|
||||
) if exc_info.traceback else exc_info.exconly()
|
||||
exc_repr = (
|
||||
exc_info.getrepr(style="short")
|
||||
if exc_info.traceback
|
||||
else exc_info.exconly()
|
||||
)
|
||||
formatted_tb = safe_str(exc_repr)
|
||||
raise self.CollectError(
|
||||
"ImportError while importing test module '{fspath}'.\n"
|
||||
@@ -673,7 +676,6 @@ class FunctionMixin(PyobjMixin):
|
||||
|
||||
|
||||
class Generator(FunctionMixin, PyCollector):
|
||||
|
||||
def collect(self):
|
||||
# test generators are seen as collectors but they also
|
||||
# invoke setup/teardown on popular request
|
||||
@@ -728,20 +730,18 @@ def hasnew(obj):
|
||||
|
||||
|
||||
class CallSpec2(object):
|
||||
|
||||
def __init__(self, metafunc):
|
||||
self.metafunc = metafunc
|
||||
self.funcargs = {}
|
||||
self._idlist = []
|
||||
self.params = {}
|
||||
self._globalid = NOTSET
|
||||
self._globalid_args = set()
|
||||
self._globalparam = NOTSET
|
||||
self._arg2scopenum = {} # used for sorting parametrized resources
|
||||
self.marks = []
|
||||
self.indices = {}
|
||||
|
||||
def copy(self, metafunc):
|
||||
def copy(self):
|
||||
cs = CallSpec2(self.metafunc)
|
||||
cs.funcargs.update(self.funcargs)
|
||||
cs.params.update(self.params)
|
||||
@@ -750,7 +750,6 @@ class CallSpec2(object):
|
||||
cs._arg2scopenum.update(self._arg2scopenum)
|
||||
cs._idlist = list(self._idlist)
|
||||
cs._globalid = self._globalid
|
||||
cs._globalid_args = self._globalid_args
|
||||
cs._globalparam = self._globalparam
|
||||
return cs
|
||||
|
||||
@@ -778,7 +777,7 @@ class CallSpec2(object):
|
||||
self.indices[arg] = param_index
|
||||
self._arg2scopenum[arg] = scopenum
|
||||
self._idlist.append(id)
|
||||
self.marks.extend(marks)
|
||||
self.marks.extend(normalize_mark_list(marks))
|
||||
|
||||
def setall(self, funcargs, id, param):
|
||||
for x in funcargs:
|
||||
@@ -933,7 +932,7 @@ class Metafunc(fixtures.FuncargnamesCompatAttr):
|
||||
param.values, argnames
|
||||
)
|
||||
)
|
||||
newcallspec = callspec.copy(self)
|
||||
newcallspec = callspec.copy()
|
||||
newcallspec.setmulti2(
|
||||
valtypes,
|
||||
argnames,
|
||||
@@ -1004,9 +1003,9 @@ def _find_parametrized_scope(argnames, arg2fixturedefs, indirect):
|
||||
from _pytest.fixtures import scopes
|
||||
|
||||
indirect_as_list = isinstance(indirect, (list, tuple))
|
||||
all_arguments_are_fixtures = indirect is True or indirect_as_list and len(
|
||||
indirect
|
||||
) == argnames
|
||||
all_arguments_are_fixtures = (
|
||||
indirect is True or indirect_as_list and len(indirect) == argnames
|
||||
)
|
||||
if all_arguments_are_fixtures:
|
||||
fixturedefs = arg2fixturedefs or {}
|
||||
used_scopes = [fixturedef[0].scope for name, fixturedef in fixturedefs.items()]
|
||||
@@ -1028,8 +1027,9 @@ def _idval(val, argname, idx, idfn, config=None):
|
||||
# See issue https://github.com/pytest-dev/pytest/issues/2169
|
||||
import warnings
|
||||
|
||||
msg = "Raised while trying to determine id of parameter %s at position %d." % (
|
||||
argname, idx
|
||||
msg = (
|
||||
"Raised while trying to determine id of parameter %s at position %d."
|
||||
% (argname, idx)
|
||||
)
|
||||
msg += "\nUpdate your code as this will raise an error in pytest-4.0."
|
||||
warnings.warn(msg, DeprecationWarning)
|
||||
@@ -1224,6 +1224,7 @@ class Function(FunctionMixin, nodes.Item, fixtures.FuncargnamesCompatAttr):
|
||||
""" a Function Item is responsible for setting up and executing a
|
||||
Python test function.
|
||||
"""
|
||||
|
||||
_genid = None
|
||||
# disable since functions handle it themselfes
|
||||
_ALLOW_MARKERS = False
|
||||
@@ -1257,7 +1258,7 @@ class Function(FunctionMixin, nodes.Item, fixtures.FuncargnamesCompatAttr):
|
||||
# feel free to cry, this was broken for years before
|
||||
# and keywords cant fix it per design
|
||||
self.keywords[mark.name] = mark
|
||||
self.own_markers.extend(callspec.marks)
|
||||
self.own_markers.extend(normalize_mark_list(callspec.marks))
|
||||
if keywords:
|
||||
self.keywords.update(keywords)
|
||||
|
||||
|
||||
@@ -86,9 +86,11 @@ class ApproxNumpy(ApproxBase):
|
||||
# shape of the array...
|
||||
import numpy as np
|
||||
|
||||
return "approx({!r})".format(
|
||||
list(self._approx_scalar(x) for x in np.asarray(self.expected))
|
||||
)
|
||||
list_scalars = []
|
||||
for x in np.ndindex(self.expected.shape):
|
||||
list_scalars.append(self._approx_scalar(np.asscalar(self.expected[x])))
|
||||
|
||||
return "approx({!r})".format(list_scalars)
|
||||
|
||||
if sys.version_info[0] == 2:
|
||||
__cmp__ = _cmp_raises_type_error
|
||||
@@ -172,6 +174,7 @@ class ApproxScalar(ApproxBase):
|
||||
"""
|
||||
Perform approximate comparisons for single numbers only.
|
||||
"""
|
||||
|
||||
DEFAULT_ABSOLUTE_TOLERANCE = 1e-12
|
||||
DEFAULT_RELATIVE_TOLERANCE = 1e-6
|
||||
|
||||
@@ -269,9 +272,7 @@ class ApproxScalar(ApproxBase):
|
||||
# we aren't even going to use it.
|
||||
relative_tolerance = set_default(
|
||||
self.rel, self.DEFAULT_RELATIVE_TOLERANCE
|
||||
) * abs(
|
||||
self.expected
|
||||
)
|
||||
) * abs(self.expected)
|
||||
|
||||
if relative_tolerance < 0:
|
||||
raise ValueError(
|
||||
@@ -650,7 +651,6 @@ raises.Exception = fail.Exception
|
||||
|
||||
|
||||
class RaisesContext(object):
|
||||
|
||||
def __init__(self, expected_exception, message, match_expr):
|
||||
self.expected_exception = expected_exception
|
||||
self.message = message
|
||||
|
||||
@@ -193,13 +193,10 @@ class WarningsRecorder(warnings.catch_warnings):
|
||||
|
||||
|
||||
class WarningsChecker(WarningsRecorder):
|
||||
|
||||
def __init__(self, expected_warning=None, match_expr=None):
|
||||
super(WarningsChecker, self).__init__()
|
||||
|
||||
msg = (
|
||||
"exceptions must be old-style classes or " "derived from Warning, not %s"
|
||||
)
|
||||
msg = "exceptions must be old-style classes or " "derived from Warning, not %s"
|
||||
if isinstance(expected_warning, tuple):
|
||||
for exc in expected_warning:
|
||||
if not inspect.isclass(exc):
|
||||
|
||||
@@ -68,7 +68,6 @@ def generic_path(item):
|
||||
|
||||
|
||||
class ResultLog(object):
|
||||
|
||||
def __init__(self, config, logfile):
|
||||
self.config = config
|
||||
self.logfile = logfile # preferably line buffered
|
||||
|
||||
@@ -186,6 +186,7 @@ def call_runtest_hook(item, when, **kwds):
|
||||
|
||||
class CallInfo(object):
|
||||
""" Result/Exception info a function invocation. """
|
||||
|
||||
#: None or ExceptionInfo object.
|
||||
excinfo = None
|
||||
|
||||
@@ -221,13 +222,15 @@ def getslaveinfoline(node):
|
||||
d = node.slaveinfo
|
||||
ver = "%s.%s.%s" % d["version_info"][:3]
|
||||
node._slaveinfocache = s = "[%s] %s -- Python %s %s" % (
|
||||
d["id"], d["sysplatform"], ver, d["executable"]
|
||||
d["id"],
|
||||
d["sysplatform"],
|
||||
ver,
|
||||
d["executable"],
|
||||
)
|
||||
return s
|
||||
|
||||
|
||||
class BaseReport(object):
|
||||
|
||||
def __init__(self, **kw):
|
||||
self.__dict__.update(kw)
|
||||
|
||||
@@ -401,7 +404,9 @@ class TestReport(BaseReport):
|
||||
|
||||
def __repr__(self):
|
||||
return "<TestReport %r when=%r outcome=%r>" % (
|
||||
self.nodeid, self.when, self.outcome
|
||||
self.nodeid,
|
||||
self.when,
|
||||
self.outcome,
|
||||
)
|
||||
|
||||
|
||||
@@ -442,7 +447,6 @@ def pytest_make_collect_report(collector):
|
||||
|
||||
|
||||
class CollectReport(BaseReport):
|
||||
|
||||
def __init__(self, nodeid, outcome, longrepr, result, sections=(), **extra):
|
||||
self.nodeid = nodeid
|
||||
self.outcome = outcome
|
||||
@@ -457,12 +461,13 @@ class CollectReport(BaseReport):
|
||||
|
||||
def __repr__(self):
|
||||
return "<CollectReport %r lenresult=%s outcome=%r>" % (
|
||||
self.nodeid, len(self.result), self.outcome
|
||||
self.nodeid,
|
||||
len(self.result),
|
||||
self.outcome,
|
||||
)
|
||||
|
||||
|
||||
class CollectErrorRepr(TerminalRepr):
|
||||
|
||||
def __init__(self, msg):
|
||||
self.longrepr = msg
|
||||
|
||||
@@ -529,7 +534,7 @@ class SetupState(object):
|
||||
def _teardown_towards(self, needed_collectors):
|
||||
exc = None
|
||||
while self.stack:
|
||||
if self.stack == needed_collectors[:len(self.stack)]:
|
||||
if self.stack == needed_collectors[: len(self.stack)]:
|
||||
break
|
||||
try:
|
||||
self._pop_and_teardown()
|
||||
@@ -551,7 +556,7 @@ class SetupState(object):
|
||||
for col in self.stack:
|
||||
if hasattr(col, "_prepare_exc"):
|
||||
py.builtin._reraise(*col._prepare_exc)
|
||||
for col in needed_collectors[len(self.stack):]:
|
||||
for col in needed_collectors[len(self.stack) :]:
|
||||
self.stack.append(col)
|
||||
try:
|
||||
col.setup()
|
||||
|
||||
@@ -157,9 +157,11 @@ def pytest_runtest_makereport(item, call):
|
||||
else:
|
||||
rep.outcome = "passed"
|
||||
rep.wasxfail = explanation
|
||||
elif getattr(item, "_skipped_by_mark", False) and rep.skipped and type(
|
||||
rep.longrepr
|
||||
) is tuple:
|
||||
elif (
|
||||
getattr(item, "_skipped_by_mark", False)
|
||||
and rep.skipped
|
||||
and type(rep.longrepr) is tuple
|
||||
):
|
||||
# skipped by mark.skipif; change the location of the failure
|
||||
# to point to the item definition, otherwise it will display
|
||||
# the location of where the skip exception was raised within pytest
|
||||
@@ -274,7 +276,6 @@ def show_skipped(terminalreporter, lines):
|
||||
|
||||
|
||||
def shower(stat, format):
|
||||
|
||||
def show_(terminalreporter, lines):
|
||||
return show_simple(terminalreporter, lines, stat, format)
|
||||
|
||||
|
||||
@@ -220,7 +220,6 @@ class WarningReport(object):
|
||||
|
||||
|
||||
class TerminalReporter(object):
|
||||
|
||||
def __init__(self, config, file=None):
|
||||
import _pytest.config
|
||||
|
||||
@@ -407,13 +406,16 @@ class TerminalReporter(object):
|
||||
def pytest_runtest_logfinish(self, nodeid):
|
||||
if self.verbosity <= 0 and self._show_progress_info:
|
||||
self._progress_nodeids_reported.add(nodeid)
|
||||
last_item = len(
|
||||
self._progress_nodeids_reported
|
||||
) == self._session.testscollected
|
||||
last_item = (
|
||||
len(self._progress_nodeids_reported) == self._session.testscollected
|
||||
)
|
||||
if last_item:
|
||||
self._write_progress_information_filling_space()
|
||||
else:
|
||||
past_edge = self._tw.chars_on_current_line + self._PROGRESS_LENGTH + 1 >= self._screen_width
|
||||
past_edge = (
|
||||
self._tw.chars_on_current_line + self._PROGRESS_LENGTH + 1
|
||||
>= self._screen_width
|
||||
)
|
||||
if past_edge:
|
||||
msg = self._get_progress_information_message()
|
||||
self._tw.write(msg + "\n", cyan=True)
|
||||
@@ -462,8 +464,8 @@ class TerminalReporter(object):
|
||||
line = "collected "
|
||||
else:
|
||||
line = "collecting "
|
||||
line += str(self._numcollected) + " item" + (
|
||||
"" if self._numcollected == 1 else "s"
|
||||
line += (
|
||||
str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s")
|
||||
)
|
||||
if errors:
|
||||
line += " / %d errors" % errors
|
||||
@@ -495,7 +497,9 @@ class TerminalReporter(object):
|
||||
verinfo = ".".join(map(str, sys.pypy_version_info[:3]))
|
||||
msg += "[pypy-%s-%s]" % (verinfo, sys.pypy_version_info[3])
|
||||
msg += ", pytest-%s, py-%s, pluggy-%s" % (
|
||||
pytest.__version__, py.__version__, pluggy.__version__
|
||||
pytest.__version__,
|
||||
py.__version__,
|
||||
pluggy.__version__,
|
||||
)
|
||||
if (
|
||||
self.verbosity > 0
|
||||
@@ -563,10 +567,10 @@ class TerminalReporter(object):
|
||||
for item in items:
|
||||
needed_collectors = item.listchain()[1:] # strip root node
|
||||
while stack:
|
||||
if stack == needed_collectors[:len(stack)]:
|
||||
if stack == needed_collectors[: len(stack)]:
|
||||
break
|
||||
stack.pop()
|
||||
for col in needed_collectors[len(stack):]:
|
||||
for col in needed_collectors[len(stack) :]:
|
||||
stack.append(col)
|
||||
# if col.name == "()":
|
||||
# continue
|
||||
@@ -624,11 +628,10 @@ class TerminalReporter(object):
|
||||
)
|
||||
|
||||
def _locationline(self, nodeid, fspath, lineno, domain):
|
||||
|
||||
def mkrel(nodeid):
|
||||
line = self.config.cwd_relative_nodeid(nodeid)
|
||||
if domain and line.endswith(domain):
|
||||
line = line[:-len(domain)]
|
||||
line = line[: -len(domain)]
|
||||
values = domain.split("[")
|
||||
values[0] = values[0].replace(".", "::") # don't replace '.' in params
|
||||
line += "[".join(values)
|
||||
|
||||
@@ -163,15 +163,13 @@ class TestCaseFunction(Function):
|
||||
# implements the skipping machinery (see #2137)
|
||||
# analog to pythons Lib/unittest/case.py:run
|
||||
testMethod = getattr(self._testcase, self._testcase._testMethodName)
|
||||
if (
|
||||
getattr(self._testcase.__class__, "__unittest_skip__", False)
|
||||
or getattr(testMethod, "__unittest_skip__", False)
|
||||
if getattr(self._testcase.__class__, "__unittest_skip__", False) or getattr(
|
||||
testMethod, "__unittest_skip__", False
|
||||
):
|
||||
# If the class or method was skipped.
|
||||
skip_why = (
|
||||
getattr(self._testcase.__class__, "__unittest_skip_why__", "")
|
||||
or getattr(testMethod, "__unittest_skip_why__", "")
|
||||
)
|
||||
skip_why = getattr(
|
||||
self._testcase.__class__, "__unittest_skip_why__", ""
|
||||
) or getattr(testMethod, "__unittest_skip_why__", "")
|
||||
try: # PY3, unittest2 on PY2
|
||||
self._testcase._addSkip(self, self._testcase, skip_why)
|
||||
except TypeError: # PY2
|
||||
|
||||
@@ -75,9 +75,8 @@ def catch_warnings_for_item(item):
|
||||
warn_msg = warning.message
|
||||
unicode_warning = False
|
||||
|
||||
if (
|
||||
compat._PY2
|
||||
and any(isinstance(m, compat.UNICODE_TYPES) for m in warn_msg.args)
|
||||
if compat._PY2 and any(
|
||||
isinstance(m, compat.UNICODE_TYPES) for m in warn_msg.args
|
||||
):
|
||||
new_args = []
|
||||
for m in warn_msg.args:
|
||||
|
||||
@@ -22,16 +22,16 @@ def announce(ctx, version):
|
||||
|
||||
contributors = set(stdout.splitlines())
|
||||
|
||||
template_name = "release.minor.rst" if version.endswith(
|
||||
".0"
|
||||
) else "release.patch.rst"
|
||||
template_text = Path(__file__).parent.joinpath(template_name).read_text(
|
||||
encoding="UTF-8"
|
||||
template_name = (
|
||||
"release.minor.rst" if version.endswith(".0") else "release.patch.rst"
|
||||
)
|
||||
template_text = (
|
||||
Path(__file__).parent.joinpath(template_name).read_text(encoding="UTF-8")
|
||||
)
|
||||
|
||||
contributors_text = "\n".join(
|
||||
"* {}".format(name) for name in sorted(contributors)
|
||||
) + "\n"
|
||||
contributors_text = (
|
||||
"\n".join("* {}".format(name) for name in sorted(contributors)) + "\n"
|
||||
)
|
||||
text = template_text.format(version=version, contributors=contributors_text)
|
||||
|
||||
target = Path(__file__).parent.joinpath(
|
||||
|
||||
@@ -13,7 +13,6 @@ from _pytest.main import EXIT_NOTESTSCOLLECTED, EXIT_USAGEERROR
|
||||
|
||||
|
||||
class TestGeneralUsage(object):
|
||||
|
||||
def test_config_error(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -458,7 +457,6 @@ class TestGeneralUsage(object):
|
||||
|
||||
|
||||
class TestInvocationVariants(object):
|
||||
|
||||
def test_earlyinit(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -557,9 +555,7 @@ class TestInvocationVariants(object):
|
||||
out, err = capsys.readouterr()
|
||||
|
||||
def test_invoke_plugin_api(self, testdir, capsys):
|
||||
|
||||
class MyPlugin(object):
|
||||
|
||||
def pytest_addoption(self, parser):
|
||||
parser.addoption("--myopt")
|
||||
|
||||
@@ -798,9 +794,10 @@ class TestInvocationVariants(object):
|
||||
"""Test backward compatibility for get_plugin_manager function. See #787."""
|
||||
import _pytest.config
|
||||
|
||||
assert type(
|
||||
_pytest.config.get_plugin_manager()
|
||||
) is _pytest.config.PytestPluginManager
|
||||
assert (
|
||||
type(_pytest.config.get_plugin_manager())
|
||||
is _pytest.config.PytestPluginManager
|
||||
)
|
||||
|
||||
def test_has_plugin(self, request):
|
||||
"""Test hasplugin function of the plugin manager (#932)."""
|
||||
|
||||
@@ -26,7 +26,6 @@ def test_code_gives_back_name_for_not_existing_file():
|
||||
|
||||
|
||||
def test_code_with_class():
|
||||
|
||||
class A(object):
|
||||
pass
|
||||
|
||||
@@ -54,7 +53,6 @@ def test_code_source():
|
||||
|
||||
|
||||
def test_frame_getsourcelineno_myself():
|
||||
|
||||
def func():
|
||||
return sys._getframe(0)
|
||||
|
||||
@@ -65,7 +63,6 @@ def test_frame_getsourcelineno_myself():
|
||||
|
||||
|
||||
def test_getstatement_empty_fullsource():
|
||||
|
||||
def func():
|
||||
return sys._getframe(0)
|
||||
|
||||
@@ -111,7 +108,6 @@ def test_unicode_handling_syntax_error():
|
||||
|
||||
|
||||
def test_code_getargs():
|
||||
|
||||
def f1(x):
|
||||
pass
|
||||
|
||||
@@ -138,7 +134,6 @@ def test_code_getargs():
|
||||
|
||||
|
||||
def test_frame_getargs():
|
||||
|
||||
def f1(x):
|
||||
return sys._getframe(0)
|
||||
|
||||
@@ -165,7 +160,6 @@ def test_frame_getargs():
|
||||
|
||||
|
||||
class TestExceptionInfo(object):
|
||||
|
||||
def test_bad_getsource(self):
|
||||
try:
|
||||
if False:
|
||||
@@ -178,7 +172,6 @@ class TestExceptionInfo(object):
|
||||
|
||||
|
||||
class TestTracebackEntry(object):
|
||||
|
||||
def test_getsource(self):
|
||||
try:
|
||||
if False:
|
||||
@@ -194,7 +187,6 @@ class TestTracebackEntry(object):
|
||||
|
||||
|
||||
class TestReprFuncArgs(object):
|
||||
|
||||
def test_not_raise_exception_with_mixed_encoding(self):
|
||||
from _pytest._code.code import ReprFuncArgs
|
||||
|
||||
|
||||
@@ -65,7 +65,6 @@ def test_excinfo_simple():
|
||||
|
||||
|
||||
def test_excinfo_getstatement():
|
||||
|
||||
def g():
|
||||
raise ValueError
|
||||
|
||||
@@ -112,7 +111,6 @@ def h():
|
||||
|
||||
|
||||
class TestTraceback_f_g_h(object):
|
||||
|
||||
def setup_method(self, method):
|
||||
try:
|
||||
h()
|
||||
@@ -194,7 +192,6 @@ class TestTraceback_f_g_h(object):
|
||||
],
|
||||
)
|
||||
def test_traceback_filter_selective(self, tracebackhide, matching):
|
||||
|
||||
def f():
|
||||
#
|
||||
raise ValueError
|
||||
@@ -224,7 +221,6 @@ class TestTraceback_f_g_h(object):
|
||||
assert len(ntraceback) == len(traceback) - 1
|
||||
|
||||
def test_traceback_recursion_index(self):
|
||||
|
||||
def f(n):
|
||||
if n < 10:
|
||||
n += 1
|
||||
@@ -236,7 +232,6 @@ class TestTraceback_f_g_h(object):
|
||||
assert recindex == 3
|
||||
|
||||
def test_traceback_only_specific_recursion_errors(self, monkeypatch):
|
||||
|
||||
def f(n):
|
||||
if n == 0:
|
||||
raise RuntimeError("hello")
|
||||
@@ -248,7 +243,6 @@ class TestTraceback_f_g_h(object):
|
||||
assert "RuntimeError: hello" in str(repr.reprcrash)
|
||||
|
||||
def test_traceback_no_recursion_index(self):
|
||||
|
||||
def do_stuff():
|
||||
raise RuntimeError
|
||||
|
||||
@@ -288,7 +282,6 @@ class TestTraceback_f_g_h(object):
|
||||
assert excinfo.traceback.recursionindex() is None
|
||||
|
||||
def test_traceback_getcrashentry(self):
|
||||
|
||||
def i():
|
||||
__tracebackhide__ = True
|
||||
raise ValueError
|
||||
@@ -312,7 +305,6 @@ class TestTraceback_f_g_h(object):
|
||||
assert entry.frame.code.name == "h"
|
||||
|
||||
def test_traceback_getcrashentry_empty(self):
|
||||
|
||||
def g():
|
||||
__tracebackhide__ = True
|
||||
raise ValueError
|
||||
@@ -429,10 +421,8 @@ def test_match_raises_error(testdir):
|
||||
|
||||
|
||||
class TestFormattedExcinfo(object):
|
||||
|
||||
@pytest.fixture
|
||||
def importasmod(self, request):
|
||||
|
||||
def importasmod(source):
|
||||
source = _pytest._code.Source(source)
|
||||
tmpdir = request.getfixturevalue("tmpdir")
|
||||
@@ -519,7 +509,6 @@ raise ValueError()
|
||||
pr = FormattedExcinfo()
|
||||
|
||||
class FakeCode(object):
|
||||
|
||||
class raw(object):
|
||||
co_filename = "?"
|
||||
|
||||
@@ -537,7 +526,6 @@ raise ValueError()
|
||||
f_globals = {}
|
||||
|
||||
class FakeTracebackEntry(_pytest._code.Traceback.Entry):
|
||||
|
||||
def __init__(self, tb, excinfo=None):
|
||||
self.lineno = 5 + 3
|
||||
|
||||
@@ -882,7 +870,6 @@ raise ValueError()
|
||||
from _pytest._code.code import TerminalRepr
|
||||
|
||||
class MyRepr(TerminalRepr):
|
||||
|
||||
def toterminal(self, tw):
|
||||
tw.line(py.builtin._totext("я", "utf-8"))
|
||||
|
||||
@@ -1303,7 +1290,6 @@ def test_exception_repr_extraction_error_on_recursion():
|
||||
"""
|
||||
|
||||
class numpy_like(object):
|
||||
|
||||
def __eq__(self, other):
|
||||
if type(other) is numpy_like:
|
||||
raise ValueError(
|
||||
@@ -1343,7 +1329,6 @@ def test_no_recursion_index_on_recursion_error():
|
||||
try:
|
||||
|
||||
class RecursionDepthError(object):
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self, "_" + attr)
|
||||
|
||||
|
||||
@@ -58,9 +58,7 @@ def test_source_from_function():
|
||||
|
||||
|
||||
def test_source_from_method():
|
||||
|
||||
class TestClass(object):
|
||||
|
||||
def test_method(self):
|
||||
pass
|
||||
|
||||
@@ -75,7 +73,6 @@ def test_source_from_lines():
|
||||
|
||||
|
||||
def test_source_from_inner_function():
|
||||
|
||||
def f():
|
||||
pass
|
||||
|
||||
@@ -199,7 +196,6 @@ class TestSourceParsingAndCompiling(object):
|
||||
assert str(source) == "x=3"
|
||||
|
||||
def test_compile_and_getsource_through_same_function(self):
|
||||
|
||||
def gensource(source):
|
||||
return _pytest._code.compile(source)
|
||||
|
||||
@@ -337,13 +333,12 @@ class TestSourceParsingAndCompiling(object):
|
||||
|
||||
@pytest.mark.parametrize("name", ["", None, "my"])
|
||||
def test_compilefuncs_and_path_sanity(self, name):
|
||||
|
||||
def check(comp, name):
|
||||
co = comp(self.source, name)
|
||||
if not name:
|
||||
expected = "codegen %s:%d>" % (mypath, mylineno + 2 + 3)
|
||||
expected = "codegen %s:%d>" % (mypath, mylineno + 2 + 2)
|
||||
else:
|
||||
expected = "codegen %r %s:%d>" % (name, mypath, mylineno + 2 + 3)
|
||||
expected = "codegen %r %s:%d>" % (name, mypath, mylineno + 2 + 2)
|
||||
fn = co.co_filename
|
||||
assert fn.endswith(expected)
|
||||
|
||||
@@ -359,9 +354,7 @@ class TestSourceParsingAndCompiling(object):
|
||||
|
||||
|
||||
def test_getstartingblock_singleline():
|
||||
|
||||
class A(object):
|
||||
|
||||
def __init__(self, *args):
|
||||
frame = sys._getframe(1)
|
||||
self.source = _pytest._code.Frame(frame).statement
|
||||
@@ -373,7 +366,6 @@ def test_getstartingblock_singleline():
|
||||
|
||||
|
||||
def test_getline_finally():
|
||||
|
||||
def c():
|
||||
pass
|
||||
|
||||
@@ -406,7 +398,6 @@ def test_getfuncsource_dynamic():
|
||||
|
||||
|
||||
def test_getfuncsource_with_multine_string():
|
||||
|
||||
def f():
|
||||
c = """while True:
|
||||
pass
|
||||
@@ -538,14 +529,12 @@ def test_getfslineno():
|
||||
|
||||
|
||||
def test_code_of_object_instance_with_call():
|
||||
|
||||
class A(object):
|
||||
pass
|
||||
|
||||
pytest.raises(TypeError, lambda: _pytest._code.Source(A()))
|
||||
|
||||
class WithCall(object):
|
||||
|
||||
def __call__(self):
|
||||
pass
|
||||
|
||||
@@ -553,7 +542,6 @@ def test_code_of_object_instance_with_call():
|
||||
assert "pass" in str(code.source())
|
||||
|
||||
class Hello(object):
|
||||
|
||||
def __call__(self):
|
||||
pass
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ def test_getstartingblock_multiline():
|
||||
"""
|
||||
|
||||
class A(object):
|
||||
|
||||
def __init__(self, *args):
|
||||
frame = sys._getframe(1)
|
||||
self.source = _pytest._code.Frame(frame).statement
|
||||
|
||||
@@ -84,7 +84,6 @@ def test_str_args_deprecated(tmpdir, testdir):
|
||||
warnings = []
|
||||
|
||||
class Collect(object):
|
||||
|
||||
def pytest_logwarning(self, message):
|
||||
warnings.append(message)
|
||||
|
||||
@@ -260,6 +259,7 @@ def test_pytest_plugins_in_non_top_level_conftest_deprecated_no_false_positives(
|
||||
)
|
||||
res = testdir.runpytest_subprocess()
|
||||
assert res.ret == 0
|
||||
assert str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[
|
||||
0
|
||||
] not in res.stderr.str()
|
||||
assert (
|
||||
str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0]
|
||||
not in res.stderr.str()
|
||||
)
|
||||
|
||||
@@ -18,7 +18,6 @@ def test_coloredlogformatter():
|
||||
)
|
||||
|
||||
class ColorConfig(object):
|
||||
|
||||
class option(object):
|
||||
pass
|
||||
|
||||
@@ -26,9 +25,8 @@ def test_coloredlogformatter():
|
||||
tw.hasmarkup = True
|
||||
formatter = ColoredLevelFormatter(tw, logfmt)
|
||||
output = formatter.format(record)
|
||||
assert (
|
||||
output
|
||||
== ("dummypath 10 " "\x1b[32mINFO \x1b[0m Test Message")
|
||||
assert output == (
|
||||
"dummypath 10 " "\x1b[32mINFO \x1b[0m Test Message"
|
||||
)
|
||||
|
||||
tw.hasmarkup = False
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import os
|
||||
from io import open
|
||||
|
||||
import six
|
||||
|
||||
@@ -520,16 +521,22 @@ def test_sections_single_new_line_after_test_outcome(testdir, request):
|
||||
"=* 1 passed in *=",
|
||||
]
|
||||
)
|
||||
assert re.search(
|
||||
r"(.+)live log teardown(.+)\n(.+)WARNING(.+)\n(.+)WARNING(.+)",
|
||||
result.stdout.str(),
|
||||
re.MULTILINE,
|
||||
) is not None
|
||||
assert re.search(
|
||||
r"(.+)live log finish(.+)\n(.+)WARNING(.+)\n(.+)WARNING(.+)",
|
||||
result.stdout.str(),
|
||||
re.MULTILINE,
|
||||
) is not None
|
||||
assert (
|
||||
re.search(
|
||||
r"(.+)live log teardown(.+)\n(.+)WARNING(.+)\n(.+)WARNING(.+)",
|
||||
result.stdout.str(),
|
||||
re.MULTILINE,
|
||||
)
|
||||
is not None
|
||||
)
|
||||
assert (
|
||||
re.search(
|
||||
r"(.+)live log finish(.+)\n(.+)WARNING(.+)\n(.+)WARNING(.+)",
|
||||
result.stdout.str(),
|
||||
re.MULTILINE,
|
||||
)
|
||||
is not None
|
||||
)
|
||||
|
||||
|
||||
def test_log_cli_level(testdir):
|
||||
@@ -821,6 +828,43 @@ def test_log_file_ini_level(testdir):
|
||||
assert "This log message won't be shown" not in contents
|
||||
|
||||
|
||||
def test_log_file_unicode(testdir):
|
||||
log_file = testdir.tmpdir.join("pytest.log").strpath
|
||||
|
||||
testdir.makeini(
|
||||
"""
|
||||
[pytest]
|
||||
log_file={}
|
||||
log_file_level = INFO
|
||||
""".format(
|
||||
log_file
|
||||
)
|
||||
)
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
import logging
|
||||
|
||||
def test_log_file():
|
||||
logging.getLogger('catchlog').info("Normal message")
|
||||
logging.getLogger('catchlog').info("├")
|
||||
logging.getLogger('catchlog').info("Another normal message")
|
||||
"""
|
||||
)
|
||||
|
||||
result = testdir.runpytest()
|
||||
|
||||
# make sure that that we get a '0' exit code for the testsuite
|
||||
assert result.ret == 0
|
||||
assert os.path.isfile(log_file)
|
||||
with open(log_file, encoding="utf-8") as rfh:
|
||||
contents = rfh.read()
|
||||
assert "Normal message" in contents
|
||||
assert u"├" in contents
|
||||
assert "Another normal message" in contents
|
||||
|
||||
|
||||
@pytest.mark.parametrize("has_capture_manager", [True, False])
|
||||
def test_live_logging_suspends_capture(has_capture_manager, request):
|
||||
"""Test that capture manager is suspended when we emitting messages for live logging.
|
||||
@@ -850,7 +894,6 @@ def test_live_logging_suspends_capture(has_capture_manager, request):
|
||||
assert CaptureManager.resume_global_capture
|
||||
|
||||
class DummyTerminal(six.StringIO):
|
||||
|
||||
def section(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
@@ -865,10 +908,10 @@ def test_live_logging_suspends_capture(has_capture_manager, request):
|
||||
|
||||
logger.critical("some message")
|
||||
if has_capture_manager:
|
||||
assert (
|
||||
MockCaptureManager.calls
|
||||
== ["suspend_global_capture", "resume_global_capture"]
|
||||
)
|
||||
assert MockCaptureManager.calls == [
|
||||
"suspend_global_capture",
|
||||
"resume_global_capture",
|
||||
]
|
||||
else:
|
||||
assert MockCaptureManager.calls == []
|
||||
assert out_file.getvalue() == "\nsome message\n"
|
||||
|
||||
@@ -13,7 +13,6 @@ inf, nan = float("inf"), float("nan")
|
||||
|
||||
|
||||
class MyDocTestRunner(doctest.DocTestRunner):
|
||||
|
||||
def __init__(self):
|
||||
doctest.DocTestRunner.__init__(self)
|
||||
|
||||
@@ -26,28 +25,27 @@ class MyDocTestRunner(doctest.DocTestRunner):
|
||||
|
||||
|
||||
class TestApprox(object):
|
||||
@pytest.fixture
|
||||
def plus_minus(self):
|
||||
return u"\u00b1" if sys.version_info[0] > 2 else u"+-"
|
||||
|
||||
def test_repr_string(self):
|
||||
plus_minus = u"\u00b1" if sys.version_info[0] > 2 else u"+-"
|
||||
def test_repr_string(self, plus_minus):
|
||||
tol1, tol2, infr = "1.0e-06", "2.0e-06", "inf"
|
||||
assert repr(approx(1.0)) == "1.0 {pm} {tol1}".format(pm=plus_minus, tol1=tol1)
|
||||
assert (
|
||||
repr(approx([1.0, 2.0]))
|
||||
== "approx([1.0 {pm} {tol1}, 2.0 {pm} {tol2}])".format(
|
||||
pm=plus_minus, tol1=tol1, tol2=tol2
|
||||
)
|
||||
assert repr(
|
||||
approx([1.0, 2.0])
|
||||
) == "approx([1.0 {pm} {tol1}, 2.0 {pm} {tol2}])".format(
|
||||
pm=plus_minus, tol1=tol1, tol2=tol2
|
||||
)
|
||||
assert (
|
||||
repr(approx((1.0, 2.0)))
|
||||
== "approx((1.0 {pm} {tol1}, 2.0 {pm} {tol2}))".format(
|
||||
pm=plus_minus, tol1=tol1, tol2=tol2
|
||||
)
|
||||
assert repr(
|
||||
approx((1.0, 2.0))
|
||||
) == "approx((1.0 {pm} {tol1}, 2.0 {pm} {tol2}))".format(
|
||||
pm=plus_minus, tol1=tol1, tol2=tol2
|
||||
)
|
||||
assert repr(approx(inf)) == "inf"
|
||||
assert repr(approx(1.0, rel=nan)) == "1.0 {pm} ???".format(pm=plus_minus)
|
||||
assert (
|
||||
repr(approx(1.0, rel=inf))
|
||||
== "1.0 {pm} {infr}".format(pm=plus_minus, infr=infr)
|
||||
assert repr(approx(1.0, rel=inf)) == "1.0 {pm} {infr}".format(
|
||||
pm=plus_minus, infr=infr
|
||||
)
|
||||
assert repr(approx(1.0j, rel=inf)) == "1j"
|
||||
|
||||
@@ -61,6 +59,18 @@ class TestApprox(object):
|
||||
),
|
||||
)
|
||||
|
||||
def test_repr_0d_array(self, plus_minus):
|
||||
np = pytest.importorskip("numpy")
|
||||
np_array = np.array(5.)
|
||||
assert approx(np_array) == 5.0
|
||||
string_expected = "approx([5.0 {} 5.0e-06])".format(plus_minus)
|
||||
|
||||
assert repr(approx(np_array)) == string_expected
|
||||
|
||||
np_array = np.array([5.])
|
||||
assert approx(np_array) == 5.0
|
||||
assert repr(approx(np_array)) == string_expected
|
||||
|
||||
def test_operator_overloading(self):
|
||||
assert 1 == approx(1, rel=1e-6, abs=1e-12)
|
||||
assert not (1 != approx(1, rel=1e-6, abs=1e-12))
|
||||
|
||||
@@ -14,7 +14,6 @@ ignore_parametrized_marks = pytest.mark.filterwarnings(
|
||||
|
||||
|
||||
class TestModule(object):
|
||||
|
||||
def test_failing_import(self, testdir):
|
||||
modcol = testdir.getmodulecol("import alksdjalskdjalkjals")
|
||||
pytest.raises(Collector.CollectError, modcol.collect)
|
||||
@@ -141,7 +140,6 @@ class TestModule(object):
|
||||
|
||||
|
||||
class TestClass(object):
|
||||
|
||||
def test_class_with_init_warning(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -246,7 +244,6 @@ class TestClass(object):
|
||||
|
||||
|
||||
class TestGenerator(object):
|
||||
|
||||
def test_generative_functions(self, testdir):
|
||||
modcol = testdir.getmodulecol(
|
||||
"""
|
||||
@@ -458,7 +455,6 @@ class TestGenerator(object):
|
||||
|
||||
|
||||
class TestFunction(object):
|
||||
|
||||
def test_getmodulecollector(self, testdir):
|
||||
item = testdir.getitem("def test_func(): pass")
|
||||
modcol = item.getparent(pytest.Module)
|
||||
@@ -673,12 +669,10 @@ class TestFunction(object):
|
||||
config = item.config
|
||||
|
||||
class MyPlugin1(object):
|
||||
|
||||
def pytest_pyfunc_call(self, pyfuncitem):
|
||||
raise ValueError
|
||||
|
||||
class MyPlugin2(object):
|
||||
|
||||
def pytest_pyfunc_call(self, pyfuncitem):
|
||||
return True
|
||||
|
||||
@@ -831,7 +825,6 @@ class TestFunction(object):
|
||||
|
||||
|
||||
class TestSorting(object):
|
||||
|
||||
def test_check_equality(self, testdir):
|
||||
modcol = testdir.getmodulecol(
|
||||
"""
|
||||
@@ -886,7 +879,6 @@ class TestSorting(object):
|
||||
|
||||
|
||||
class TestConftestCustomization(object):
|
||||
|
||||
def test_pytest_pycollect_module(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -1062,7 +1054,6 @@ def test_modulecol_roundtrip(testdir):
|
||||
|
||||
|
||||
class TestTracebackCutting(object):
|
||||
|
||||
def test_skip_simple(self):
|
||||
excinfo = pytest.raises(pytest.skip.Exception, 'pytest.skip("xxx")')
|
||||
assert excinfo.traceback[-1].frame.code.name == "skip"
|
||||
@@ -1191,7 +1182,6 @@ class TestTracebackCutting(object):
|
||||
|
||||
|
||||
class TestReportInfo(object):
|
||||
|
||||
def test_itemreport_reportinfo(self, testdir, linecomp):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -1497,7 +1487,10 @@ def test_class_injection_does_not_break_collection(testdir):
|
||||
'''
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
assert "RuntimeError: dictionary changed size during iteration" not in result.stdout.str()
|
||||
assert (
|
||||
"RuntimeError: dictionary changed size during iteration"
|
||||
not in result.stdout.str()
|
||||
)
|
||||
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ from _pytest import fixtures
|
||||
|
||||
|
||||
def test_getfuncargnames():
|
||||
|
||||
def f():
|
||||
pass
|
||||
|
||||
@@ -30,7 +29,6 @@ def test_getfuncargnames():
|
||||
assert fixtures.getfuncargnames(h) == ("arg1", "arg2")
|
||||
|
||||
class A(object):
|
||||
|
||||
def f(self, arg1, arg2="hello"):
|
||||
pass
|
||||
|
||||
@@ -43,7 +41,6 @@ def test_getfuncargnames():
|
||||
|
||||
|
||||
class TestFillFixtures(object):
|
||||
|
||||
def test_fillfuncargs_exposed(self):
|
||||
# used by oejskit, kept for compatibility
|
||||
assert pytest._fillfuncargs == fixtures.fillfixtures
|
||||
@@ -570,7 +567,6 @@ class TestFillFixtures(object):
|
||||
|
||||
|
||||
class TestRequestBasic(object):
|
||||
|
||||
def test_request_attributes(self, testdir):
|
||||
item = testdir.getitem(
|
||||
"""
|
||||
@@ -1003,7 +999,6 @@ class TestRequestBasic(object):
|
||||
|
||||
|
||||
class TestRequestMarking(object):
|
||||
|
||||
def test_applymarker(self, testdir):
|
||||
item1, item2 = testdir.getitems(
|
||||
"""
|
||||
@@ -1073,7 +1068,6 @@ class TestRequestMarking(object):
|
||||
|
||||
|
||||
class TestRequestCachedSetup(object):
|
||||
|
||||
def test_request_cachedsetup_defaultmodule(self, testdir):
|
||||
reprec = testdir.inline_runsource(
|
||||
"""
|
||||
@@ -1245,7 +1239,6 @@ class TestRequestCachedSetup(object):
|
||||
|
||||
|
||||
class TestFixtureUsages(object):
|
||||
|
||||
def test_noargfixturedec(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -1540,7 +1533,6 @@ class TestFixtureUsages(object):
|
||||
|
||||
|
||||
class TestFixtureManagerParseFactories(object):
|
||||
|
||||
@pytest.fixture
|
||||
def testdir(self, request):
|
||||
testdir = request.getfixturevalue("testdir")
|
||||
@@ -1668,7 +1660,6 @@ class TestFixtureManagerParseFactories(object):
|
||||
|
||||
|
||||
class TestAutouseDiscovery(object):
|
||||
|
||||
@pytest.fixture
|
||||
def testdir(self, testdir):
|
||||
testdir.makeconftest(
|
||||
@@ -1845,7 +1836,6 @@ class TestAutouseDiscovery(object):
|
||||
|
||||
|
||||
class TestAutouseManagement(object):
|
||||
|
||||
def test_autouse_conftest_mid_directory(self, testdir):
|
||||
pkgdir = testdir.mkpydir("xyz123")
|
||||
pkgdir.join("conftest.py").write(
|
||||
@@ -2112,7 +2102,6 @@ class TestAutouseManagement(object):
|
||||
|
||||
|
||||
class TestFixtureMarker(object):
|
||||
|
||||
def test_parametrize(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -2938,21 +2927,18 @@ class TestFixtureMarker(object):
|
||||
reprec = testdir.inline_run()
|
||||
reprec.assertoutcome(passed=6)
|
||||
values = reprec.getcalls("pytest_runtest_call")[0].item.module.values
|
||||
assert (
|
||||
values
|
||||
== [
|
||||
"test_hello",
|
||||
"fin John",
|
||||
"test_hello",
|
||||
"fin Doe",
|
||||
"test_name",
|
||||
"test_population",
|
||||
"fin John",
|
||||
"test_name",
|
||||
"test_population",
|
||||
"fin Doe",
|
||||
]
|
||||
)
|
||||
assert values == [
|
||||
"test_hello",
|
||||
"fin John",
|
||||
"test_hello",
|
||||
"fin Doe",
|
||||
"test_name",
|
||||
"test_population",
|
||||
"fin John",
|
||||
"test_name",
|
||||
"test_population",
|
||||
"fin Doe",
|
||||
]
|
||||
|
||||
def test_parametrize_setup_function(self, testdir):
|
||||
testdir.makepyfile(
|
||||
@@ -3135,7 +3121,6 @@ class TestRequestScopeAccess(object):
|
||||
|
||||
|
||||
class TestErrors(object):
|
||||
|
||||
def test_subfactory_missing_funcarg(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -3203,7 +3188,6 @@ class TestErrors(object):
|
||||
|
||||
|
||||
class TestShowFixtures(object):
|
||||
|
||||
def test_funcarg_compat(self, testdir):
|
||||
config = testdir.parseconfigure("--funcargs")
|
||||
assert config.option.showfixtures
|
||||
@@ -3480,7 +3464,6 @@ class TestShowFixtures(object):
|
||||
|
||||
@pytest.mark.parametrize("flavor", ["fixture", "yield_fixture"])
|
||||
class TestContextManagerFixtureFuncs(object):
|
||||
|
||||
def test_simple(self, testdir, flavor):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -3622,7 +3605,6 @@ class TestContextManagerFixtureFuncs(object):
|
||||
|
||||
|
||||
class TestParameterizedSubRequest(object):
|
||||
|
||||
def test_call_from_fixture(self, testdir):
|
||||
testfile = testdir.makepyfile(
|
||||
"""
|
||||
|
||||
@@ -4,7 +4,6 @@ from _pytest import runner
|
||||
|
||||
|
||||
class TestOEJSKITSpecials(object):
|
||||
|
||||
def test_funcarg_non_pycollectobj(self, testdir): # rough jstests usage
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -70,7 +69,6 @@ class TestOEJSKITSpecials(object):
|
||||
|
||||
|
||||
def test_wrapped_getfslineno():
|
||||
|
||||
def func():
|
||||
pass
|
||||
|
||||
@@ -89,12 +87,10 @@ def test_wrapped_getfslineno():
|
||||
|
||||
|
||||
class TestMockDecoration(object):
|
||||
|
||||
def test_wrapped_getfuncargnames(self):
|
||||
from _pytest.compat import getfuncargnames
|
||||
|
||||
def wrap(f):
|
||||
|
||||
def func():
|
||||
pass
|
||||
|
||||
@@ -115,7 +111,6 @@ class TestMockDecoration(object):
|
||||
from _pytest.compat import getfuncargnames
|
||||
|
||||
def wrap(f):
|
||||
|
||||
def func():
|
||||
pass
|
||||
|
||||
@@ -269,7 +264,6 @@ class TestMockDecoration(object):
|
||||
|
||||
|
||||
class TestReRunTests(object):
|
||||
|
||||
def test_rerun(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -316,7 +310,6 @@ def test_pytestconfig_is_session_scoped():
|
||||
|
||||
|
||||
class TestNoselikeTestAttribute(object):
|
||||
|
||||
def test_module_with_global_test(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -402,7 +395,6 @@ class TestNoselikeTestAttribute(object):
|
||||
|
||||
@pytest.mark.issue351
|
||||
class TestParameterize(object):
|
||||
|
||||
def test_idfn_marker(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
|
||||
@@ -14,7 +14,6 @@ PY3 = sys.version_info >= (3, 0)
|
||||
|
||||
|
||||
class TestMetafunc(object):
|
||||
|
||||
def Metafunc(self, func, config=None):
|
||||
# the unit tests of this class check if things work correctly
|
||||
# on the funcarg level, so we don't need a full blown
|
||||
@@ -35,7 +34,6 @@ class TestMetafunc(object):
|
||||
return python.Metafunc(definition, fixtureinfo, config)
|
||||
|
||||
def test_no_funcargs(self, testdir):
|
||||
|
||||
def function():
|
||||
pass
|
||||
|
||||
@@ -44,7 +42,6 @@ class TestMetafunc(object):
|
||||
repr(metafunc._calls)
|
||||
|
||||
def test_function_basic(self):
|
||||
|
||||
def func(arg1, arg2="qwe"):
|
||||
pass
|
||||
|
||||
@@ -55,7 +52,6 @@ class TestMetafunc(object):
|
||||
assert metafunc.cls is None
|
||||
|
||||
def test_addcall_no_args(self):
|
||||
|
||||
def func(arg1):
|
||||
pass
|
||||
|
||||
@@ -67,7 +63,6 @@ class TestMetafunc(object):
|
||||
assert not hasattr(call, "param")
|
||||
|
||||
def test_addcall_id(self):
|
||||
|
||||
def func(arg1):
|
||||
pass
|
||||
|
||||
@@ -83,7 +78,6 @@ class TestMetafunc(object):
|
||||
assert metafunc._calls[1].id == "2"
|
||||
|
||||
def test_addcall_param(self):
|
||||
|
||||
def func(arg1):
|
||||
pass
|
||||
|
||||
@@ -101,7 +95,6 @@ class TestMetafunc(object):
|
||||
assert metafunc._calls[2].getparam("arg1") == 1
|
||||
|
||||
def test_addcall_funcargs(self):
|
||||
|
||||
def func(x):
|
||||
pass
|
||||
|
||||
@@ -119,7 +112,6 @@ class TestMetafunc(object):
|
||||
assert not hasattr(metafunc._calls[1], "param")
|
||||
|
||||
def test_parametrize_error(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -132,7 +124,6 @@ class TestMetafunc(object):
|
||||
pytest.raises(ValueError, lambda: metafunc.parametrize("y", [5, 6]))
|
||||
|
||||
def test_parametrize_bad_scope(self, testdir):
|
||||
|
||||
def func(x):
|
||||
pass
|
||||
|
||||
@@ -143,7 +134,6 @@ class TestMetafunc(object):
|
||||
assert "has an unsupported scope value 'doggy'" in str(ve)
|
||||
|
||||
def test_parametrize_and_id(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -166,7 +156,6 @@ class TestMetafunc(object):
|
||||
assert ids == [u"basic", u"advanced"]
|
||||
|
||||
def test_parametrize_with_wrong_number_of_ids(self, testdir):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -185,12 +174,10 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue510
|
||||
def test_parametrize_empty_list(self):
|
||||
|
||||
def func(y):
|
||||
pass
|
||||
|
||||
class MockConfig(object):
|
||||
|
||||
def getini(self, name):
|
||||
return ""
|
||||
|
||||
@@ -206,7 +193,6 @@ class TestMetafunc(object):
|
||||
assert "skip" == metafunc._calls[0].marks[0].name
|
||||
|
||||
def test_parametrize_with_userobjects(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -338,23 +324,20 @@ class TestMetafunc(object):
|
||||
pytest.param(b"\xc3\xb4", totext("other")),
|
||||
],
|
||||
)
|
||||
assert (
|
||||
result
|
||||
== [
|
||||
"1.0--1.1",
|
||||
"2--202",
|
||||
"three-three hundred",
|
||||
"True-False",
|
||||
"None-None",
|
||||
"foo-bar",
|
||||
"str-int",
|
||||
"a7-b7",
|
||||
"a8-b8",
|
||||
"a9-b9",
|
||||
"\\xc3\\xb4-name",
|
||||
"\\xc3\\xb4-other",
|
||||
]
|
||||
)
|
||||
assert result == [
|
||||
"1.0--1.1",
|
||||
"2--202",
|
||||
"three-three hundred",
|
||||
"True-False",
|
||||
"None-None",
|
||||
"foo-bar",
|
||||
"str-int",
|
||||
"a7-b7",
|
||||
"a8-b8",
|
||||
"a9-b9",
|
||||
"\\xc3\\xb4-name",
|
||||
"\\xc3\\xb4-other",
|
||||
]
|
||||
|
||||
def test_idmaker_enum(self):
|
||||
from _pytest.python import idmaker
|
||||
@@ -424,23 +407,20 @@ class TestMetafunc(object):
|
||||
idfn=ids,
|
||||
)
|
||||
|
||||
assert (
|
||||
[str(i.message) for i in rec.list]
|
||||
== [
|
||||
"Raised while trying to determine id of parameter a at position 0."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 0."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter a at position 1."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 1."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter a at position 2."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 2."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
]
|
||||
)
|
||||
assert [str(i.message) for i in rec.list] == [
|
||||
"Raised while trying to determine id of parameter a at position 0."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 0."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter a at position 1."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 1."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter a at position 2."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
"Raised while trying to determine id of parameter b at position 2."
|
||||
"\nUpdate your code as this will raise an error in pytest-4.0.",
|
||||
]
|
||||
|
||||
def test_parametrize_ids_exception(self, testdir):
|
||||
"""
|
||||
@@ -496,7 +476,6 @@ class TestMetafunc(object):
|
||||
assert result == ["a0", "a1", "b0", "c", "b1"]
|
||||
|
||||
def test_addcall_and_parametrize(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -511,7 +490,6 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue714
|
||||
def test_parametrize_indirect(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -526,7 +504,6 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue714
|
||||
def test_parametrize_indirect_list(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -537,7 +514,6 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue714
|
||||
def test_parametrize_indirect_list_all(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -548,7 +524,6 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue714
|
||||
def test_parametrize_indirect_list_empty(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -588,7 +563,6 @@ class TestMetafunc(object):
|
||||
|
||||
@pytest.mark.issue714
|
||||
def test_parametrize_indirect_list_error(self, testdir):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -704,7 +678,6 @@ class TestMetafunc(object):
|
||||
)
|
||||
|
||||
def test_addcalls_and_parametrize_indirect(self):
|
||||
|
||||
def func(x, y):
|
||||
pass
|
||||
|
||||
@@ -837,7 +810,6 @@ class TestMetafunc(object):
|
||||
)
|
||||
|
||||
def test_format_args(self):
|
||||
|
||||
def function1():
|
||||
pass
|
||||
|
||||
@@ -860,7 +832,6 @@ class TestMetafunc(object):
|
||||
|
||||
|
||||
class TestMetafuncFunctional(object):
|
||||
|
||||
def test_attributes(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -1494,7 +1465,6 @@ class TestMetafuncFunctionalAuto(object):
|
||||
@pytest.mark.filterwarnings("ignore:Applying marks directly to parameters")
|
||||
@pytest.mark.issue308
|
||||
class TestMarkersWithParametrization(object):
|
||||
|
||||
def test_simple_mark(self, testdir):
|
||||
s = """
|
||||
import pytest
|
||||
|
||||
@@ -4,7 +4,6 @@ import sys
|
||||
|
||||
|
||||
class TestRaises(object):
|
||||
|
||||
def test_raises(self):
|
||||
source = "int('qwe')"
|
||||
excinfo = pytest.raises(ValueError, source)
|
||||
@@ -22,9 +21,7 @@ class TestRaises(object):
|
||||
pytest.raises(ValueError, int, "hello")
|
||||
|
||||
def test_raises_callable_no_exception(self):
|
||||
|
||||
class A(object):
|
||||
|
||||
def __call__(self):
|
||||
pass
|
||||
|
||||
@@ -109,7 +106,6 @@ class TestRaises(object):
|
||||
import gc
|
||||
|
||||
class T(object):
|
||||
|
||||
def __call__(self):
|
||||
raise ValueError
|
||||
|
||||
@@ -160,7 +156,6 @@ class TestRaises(object):
|
||||
from six import add_metaclass
|
||||
|
||||
class Meta(type(object)):
|
||||
|
||||
def __getitem__(self, item):
|
||||
return 1 / 0
|
||||
|
||||
|
||||
@@ -86,7 +86,6 @@ class FilesCompleter(object):
|
||||
|
||||
|
||||
class TestArgComplete(object):
|
||||
|
||||
@pytest.mark.skipif("sys.platform in ('win32', 'darwin')")
|
||||
def test_compare_with_compgen(self):
|
||||
from _pytest._argcomplete import FastFilesCompleter
|
||||
|
||||
@@ -14,7 +14,6 @@ PY3 = sys.version_info >= (3, 0)
|
||||
|
||||
@pytest.fixture
|
||||
def mock_config():
|
||||
|
||||
class Config(object):
|
||||
verbose = False
|
||||
|
||||
@@ -27,7 +26,6 @@ def mock_config():
|
||||
|
||||
|
||||
class TestImportHookInstallation(object):
|
||||
|
||||
@pytest.mark.parametrize("initial_conftest", [True, False])
|
||||
@pytest.mark.parametrize("mode", ["plain", "rewrite"])
|
||||
def test_conftest_assertion_rewrite(self, testdir, initial_conftest, mode):
|
||||
@@ -288,7 +286,6 @@ class TestImportHookInstallation(object):
|
||||
|
||||
|
||||
class TestBinReprIntegration(object):
|
||||
|
||||
def test_pytest_assertrepr_compare_called(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -321,7 +318,6 @@ def callequal(left, right, verbose=False):
|
||||
|
||||
|
||||
class TestAssert_reprcompare(object):
|
||||
|
||||
def test_different_types(self):
|
||||
assert callequal([0, 1], "foo") is None
|
||||
|
||||
@@ -459,7 +455,6 @@ class TestAssert_reprcompare(object):
|
||||
MutableSequence = col.MutableSequence
|
||||
|
||||
class TestSequence(MutableSequence): # works with a Sequence subclass
|
||||
|
||||
def __init__(self, iterable):
|
||||
self.elements = list(iterable)
|
||||
|
||||
@@ -488,9 +483,7 @@ class TestAssert_reprcompare(object):
|
||||
assert len(expl) > 1
|
||||
|
||||
def test_list_bad_repr(self):
|
||||
|
||||
class A(object):
|
||||
|
||||
def __repr__(self):
|
||||
raise ValueError(42)
|
||||
|
||||
@@ -506,7 +499,6 @@ class TestAssert_reprcompare(object):
|
||||
"""
|
||||
|
||||
class A(str):
|
||||
|
||||
def __repr__(self):
|
||||
return ""
|
||||
|
||||
@@ -532,7 +524,6 @@ class TestAssert_reprcompare(object):
|
||||
"""
|
||||
|
||||
class A(str):
|
||||
|
||||
def __repr__(self):
|
||||
return "\xff"
|
||||
|
||||
@@ -557,7 +548,6 @@ class TestAssert_reprcompare(object):
|
||||
|
||||
|
||||
class TestFormatExplanation(object):
|
||||
|
||||
def test_special_chars_full(self, testdir):
|
||||
# Issue 453, for the bug this would raise IndexError
|
||||
testdir.makepyfile(
|
||||
@@ -781,24 +771,19 @@ def test_rewritten(testdir):
|
||||
def test_reprcompare_notin(mock_config):
|
||||
detail = plugin.pytest_assertrepr_compare(
|
||||
mock_config, "not in", "foo", "aaafoobbb"
|
||||
)[
|
||||
1:
|
||||
]
|
||||
)[1:]
|
||||
assert detail == ["'foo' is contained here:", " aaafoobbb", "? +++"]
|
||||
|
||||
|
||||
def test_reprcompare_whitespaces(mock_config):
|
||||
detail = plugin.pytest_assertrepr_compare(mock_config, "==", "\r\n", "\n")
|
||||
assert (
|
||||
detail
|
||||
== [
|
||||
r"'\r\n' == '\n'",
|
||||
r"Strings contain only whitespace, escaping them using repr()",
|
||||
r"- '\r\n'",
|
||||
r"? --",
|
||||
r"+ '\n'",
|
||||
]
|
||||
)
|
||||
assert detail == [
|
||||
r"'\r\n' == '\n'",
|
||||
r"Strings contain only whitespace, escaping them using repr()",
|
||||
r"- '\r\n'",
|
||||
r"? --",
|
||||
r"+ '\n'",
|
||||
]
|
||||
|
||||
|
||||
def test_pytest_assertrepr_compare_integration(testdir):
|
||||
@@ -1036,7 +1021,6 @@ def test_AssertionError_message(testdir):
|
||||
def test_set_with_unsortable_elements():
|
||||
# issue #718
|
||||
class UnsortableKey(object):
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
|
||||
@@ -1169,4 +1153,7 @@ def test_issue_1944(testdir):
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result.stdout.fnmatch_lines(["*1 error*"])
|
||||
assert "AttributeError: 'Module' object has no attribute '_obj'" not in result.stdout.str()
|
||||
assert (
|
||||
"AttributeError: 'Module' object has no attribute '_obj'"
|
||||
not in result.stdout.str()
|
||||
)
|
||||
|
||||
@@ -78,9 +78,8 @@ def adjust_body_for_new_docstring_in_module_node(m):
|
||||
various Python 3.7 versions, but we should remove the 3.7 check after
|
||||
3.7 is released as stable to make this check more straightforward.
|
||||
"""
|
||||
if (
|
||||
sys.version_info < (3, 8)
|
||||
and not ((3, 7) <= sys.version_info <= (3, 7, 0, "beta", 4))
|
||||
if sys.version_info < (3, 8) and not (
|
||||
(3, 7) <= sys.version_info <= (3, 7, 0, "beta", 4)
|
||||
):
|
||||
assert len(m.body) > 1
|
||||
assert isinstance(m.body[0], ast.Expr)
|
||||
@@ -89,7 +88,6 @@ def adjust_body_for_new_docstring_in_module_node(m):
|
||||
|
||||
|
||||
class TestAssertionRewrite(object):
|
||||
|
||||
def test_place_initial_imports(self):
|
||||
s = """'Doc string'\nother = stuff"""
|
||||
m = rewrite(s)
|
||||
@@ -150,7 +148,6 @@ class TestAssertionRewrite(object):
|
||||
assert "warnings" not in "".join(result.outlines)
|
||||
|
||||
def test_name(self):
|
||||
|
||||
def f():
|
||||
assert False
|
||||
|
||||
@@ -181,7 +178,6 @@ class TestAssertionRewrite(object):
|
||||
assert getmsg(f, {"cls": X}) == "assert cls == 42"
|
||||
|
||||
def test_assert_already_has_message(self):
|
||||
|
||||
def f():
|
||||
assert False, "something bad!"
|
||||
|
||||
@@ -251,7 +247,6 @@ class TestAssertionRewrite(object):
|
||||
)
|
||||
|
||||
def test_boolop(self):
|
||||
|
||||
def f():
|
||||
f = g = False
|
||||
assert f and g
|
||||
@@ -331,7 +326,6 @@ class TestAssertionRewrite(object):
|
||||
getmsg(f, must_pass=True)
|
||||
|
||||
def test_short_circuit_evaluation(self):
|
||||
|
||||
def f():
|
||||
assert True or explode # noqa
|
||||
|
||||
@@ -344,7 +338,6 @@ class TestAssertionRewrite(object):
|
||||
getmsg(f, must_pass=True)
|
||||
|
||||
def test_unary_op(self):
|
||||
|
||||
def f():
|
||||
x = True
|
||||
assert not x
|
||||
@@ -370,7 +363,6 @@ class TestAssertionRewrite(object):
|
||||
assert getmsg(f) == "assert (+0 + 0)"
|
||||
|
||||
def test_binary_op(self):
|
||||
|
||||
def f():
|
||||
x = 1
|
||||
y = -1
|
||||
@@ -384,7 +376,6 @@ class TestAssertionRewrite(object):
|
||||
assert getmsg(f) == "assert not (5 % 4)"
|
||||
|
||||
def test_boolop_percent(self):
|
||||
|
||||
def f():
|
||||
assert 3 % 2 and False
|
||||
|
||||
@@ -411,7 +402,6 @@ class TestAssertionRewrite(object):
|
||||
testdir.runpytest().assert_outcomes(passed=1)
|
||||
|
||||
def test_call(self):
|
||||
|
||||
def g(a=42, *args, **kwargs):
|
||||
return False
|
||||
|
||||
@@ -483,7 +473,6 @@ class TestAssertionRewrite(object):
|
||||
)
|
||||
|
||||
def test_attribute(self):
|
||||
|
||||
class X(object):
|
||||
g = 3
|
||||
|
||||
@@ -509,7 +498,6 @@ class TestAssertionRewrite(object):
|
||||
)
|
||||
|
||||
def test_comparisons(self):
|
||||
|
||||
def f():
|
||||
a, b = range(2)
|
||||
assert b < a
|
||||
@@ -542,7 +530,6 @@ class TestAssertionRewrite(object):
|
||||
getmsg(f, must_pass=True)
|
||||
|
||||
def test_len(self):
|
||||
|
||||
def f():
|
||||
values = list(range(10))
|
||||
assert len(values) == 11
|
||||
@@ -553,7 +540,6 @@ class TestAssertionRewrite(object):
|
||||
)
|
||||
|
||||
def test_custom_reprcompare(self, monkeypatch):
|
||||
|
||||
def my_reprcompare(op, left, right):
|
||||
return "42"
|
||||
|
||||
@@ -575,11 +561,8 @@ class TestAssertionRewrite(object):
|
||||
assert getmsg(f) == "assert 5 <= 4"
|
||||
|
||||
def test_assert_raising_nonzero_in_comparison(self):
|
||||
|
||||
def f():
|
||||
|
||||
class A(object):
|
||||
|
||||
def __nonzero__(self):
|
||||
raise ValueError(42)
|
||||
|
||||
@@ -597,16 +580,13 @@ class TestAssertionRewrite(object):
|
||||
assert "<MY42 object> < 0" in getmsg(f)
|
||||
|
||||
def test_formatchar(self):
|
||||
|
||||
def f():
|
||||
assert "%test" == "test"
|
||||
|
||||
assert getmsg(f).startswith("assert '%test' == 'test'")
|
||||
|
||||
def test_custom_repr(self):
|
||||
|
||||
def f():
|
||||
|
||||
class Foo(object):
|
||||
a = 1
|
||||
|
||||
@@ -620,7 +600,6 @@ class TestAssertionRewrite(object):
|
||||
|
||||
|
||||
class TestRewriteOnImport(object):
|
||||
|
||||
def test_pycache_is_a_file(self, testdir):
|
||||
testdir.tmpdir.join("__pycache__").write("Hello")
|
||||
testdir.makepyfile(
|
||||
@@ -671,9 +650,7 @@ class TestRewriteOnImport(object):
|
||||
def test_rewritten():
|
||||
assert "@py_builtins" in globals()
|
||||
"""
|
||||
).encode(
|
||||
"utf-8"
|
||||
),
|
||||
).encode("utf-8"),
|
||||
"wb",
|
||||
)
|
||||
old_mode = sub.stat().mode
|
||||
@@ -870,7 +847,6 @@ def test_rewritten():
|
||||
|
||||
|
||||
class TestAssertionRewriteHookDetails(object):
|
||||
|
||||
def test_loader_is_package_false_for_module(self, testdir):
|
||||
testdir.makepyfile(
|
||||
test_fun="""
|
||||
@@ -1090,7 +1066,6 @@ def test_issue731(testdir):
|
||||
|
||||
|
||||
class TestIssue925(object):
|
||||
|
||||
def test_simple_case(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -1122,8 +1097,7 @@ class TestIssue925(object):
|
||||
result.stdout.fnmatch_lines("*E*assert True == ((False == True) == True)")
|
||||
|
||||
|
||||
class TestIssue2121():
|
||||
|
||||
class TestIssue2121:
|
||||
def test_simple(self, testdir):
|
||||
testdir.tmpdir.join("tests/file.py").ensure().write(
|
||||
"""
|
||||
|
||||
@@ -6,11 +6,10 @@ import pytest
|
||||
import os
|
||||
import shutil
|
||||
|
||||
pytest_plugins = "pytester",
|
||||
pytest_plugins = ("pytester",)
|
||||
|
||||
|
||||
class TestNewAPI(object):
|
||||
|
||||
def test_config_cache_makedir(self, testdir):
|
||||
testdir.makeini("[pytest]")
|
||||
config = testdir.parseconfigure()
|
||||
@@ -182,7 +181,6 @@ def test_cache_show(testdir):
|
||||
|
||||
|
||||
class TestLastFailed(object):
|
||||
|
||||
def test_lastfailed_usecase(self, testdir, monkeypatch):
|
||||
monkeypatch.setenv("PYTHONDONTWRITEBYTECODE", 1)
|
||||
p = testdir.makepyfile(
|
||||
@@ -557,10 +555,9 @@ class TestLastFailed(object):
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
result.stdout.fnmatch_lines("*1 failed*")
|
||||
assert (
|
||||
self.get_cached_last_failed(testdir)
|
||||
== ["test_xfail_strict_considered_failure.py::test"]
|
||||
)
|
||||
assert self.get_cached_last_failed(testdir) == [
|
||||
"test_xfail_strict_considered_failure.py::test"
|
||||
]
|
||||
|
||||
@pytest.mark.parametrize("mark", ["mark.xfail", "mark.skip"])
|
||||
def test_failed_changed_to_xfail_or_skip(self, testdir, mark):
|
||||
@@ -572,10 +569,9 @@ class TestLastFailed(object):
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest()
|
||||
assert (
|
||||
self.get_cached_last_failed(testdir)
|
||||
== ["test_failed_changed_to_xfail_or_skip.py::test"]
|
||||
)
|
||||
assert self.get_cached_last_failed(testdir) == [
|
||||
"test_failed_changed_to_xfail_or_skip.py::test"
|
||||
]
|
||||
assert result.ret == 1
|
||||
|
||||
testdir.makepyfile(
|
||||
@@ -619,10 +615,10 @@ class TestLastFailed(object):
|
||||
"""
|
||||
)
|
||||
testdir.runpytest()
|
||||
assert (
|
||||
self.get_cached_last_failed(testdir)
|
||||
== ["test_bar.py::test_bar_2", "test_foo.py::test_foo_4"]
|
||||
)
|
||||
assert self.get_cached_last_failed(testdir) == [
|
||||
"test_bar.py::test_bar_2",
|
||||
"test_foo.py::test_foo_4",
|
||||
]
|
||||
|
||||
# 2. fix test_bar_2, run only test_bar.py
|
||||
testdir.makepyfile(
|
||||
@@ -695,7 +691,6 @@ class TestLastFailed(object):
|
||||
|
||||
|
||||
class TestNewFirst(object):
|
||||
|
||||
def test_newfirst_usecase(self, testdir):
|
||||
testdir.makepyfile(
|
||||
**{
|
||||
|
||||
@@ -48,7 +48,6 @@ def StdCapture(out=True, err=True, in_=True):
|
||||
|
||||
|
||||
class TestCaptureManager(object):
|
||||
|
||||
def test_getmethod_default_no_fd(self, monkeypatch):
|
||||
from _pytest.capture import pytest_addoption
|
||||
from _pytest.config.argparsing import Parser
|
||||
@@ -150,7 +149,6 @@ def test_collect_capturing(testdir):
|
||||
|
||||
|
||||
class TestPerTestCapturing(object):
|
||||
|
||||
def test_capture_and_fixtures(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -294,7 +292,6 @@ class TestPerTestCapturing(object):
|
||||
|
||||
|
||||
class TestLoggingInteraction(object):
|
||||
|
||||
def test_logging_stream_ownership(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -399,7 +396,6 @@ class TestLoggingInteraction(object):
|
||||
|
||||
|
||||
class TestCaptureFixture(object):
|
||||
|
||||
@pytest.mark.parametrize("opt", [[], ["-s"]])
|
||||
def test_std_functional(self, testdir, opt):
|
||||
reprec = testdir.inline_runsource(
|
||||
@@ -771,7 +767,6 @@ def test_error_during_readouterr(testdir):
|
||||
|
||||
|
||||
class TestCaptureIO(object):
|
||||
|
||||
def test_text(self):
|
||||
f = capture.CaptureIO()
|
||||
f.write("hello")
|
||||
@@ -1337,7 +1332,6 @@ def test_py36_windowsconsoleio_workaround_non_standard_streams():
|
||||
from _pytest.capture import _py36_windowsconsoleio_workaround
|
||||
|
||||
class DummyStream(object):
|
||||
|
||||
def write(self, s):
|
||||
pass
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ from _pytest.main import Session, EXIT_NOTESTSCOLLECTED, _in_venv
|
||||
|
||||
|
||||
class TestCollector(object):
|
||||
|
||||
def test_collect_versus_item(self):
|
||||
from pytest import Collector, Item
|
||||
|
||||
@@ -115,7 +114,6 @@ class TestCollector(object):
|
||||
|
||||
|
||||
class TestCollectFS(object):
|
||||
|
||||
def test_ignored_certain_directories(self, testdir):
|
||||
tmpdir = testdir.tmpdir
|
||||
tmpdir.ensure("build", "test_notfound.py")
|
||||
@@ -253,12 +251,10 @@ class TestCollectFS(object):
|
||||
|
||||
|
||||
class TestCollectPluginHookRelay(object):
|
||||
|
||||
def test_pytest_collect_file(self, testdir):
|
||||
wascalled = []
|
||||
|
||||
class Plugin(object):
|
||||
|
||||
def pytest_collect_file(self, path, parent):
|
||||
if not path.basename.startswith("."):
|
||||
# Ignore hidden files, e.g. .testmondata.
|
||||
@@ -273,7 +269,6 @@ class TestCollectPluginHookRelay(object):
|
||||
wascalled = []
|
||||
|
||||
class Plugin(object):
|
||||
|
||||
def pytest_collect_directory(self, path, parent):
|
||||
wascalled.append(path.basename)
|
||||
|
||||
@@ -285,7 +280,6 @@ class TestCollectPluginHookRelay(object):
|
||||
|
||||
|
||||
class TestPrunetraceback(object):
|
||||
|
||||
def test_custom_repr_failure(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -335,7 +329,6 @@ class TestPrunetraceback(object):
|
||||
|
||||
|
||||
class TestCustomConftests(object):
|
||||
|
||||
def test_ignore_collect_path(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -437,7 +430,6 @@ class TestCustomConftests(object):
|
||||
|
||||
|
||||
class TestSession(object):
|
||||
|
||||
def test_parsearg(self, testdir):
|
||||
p = testdir.makepyfile("def test_func(): pass")
|
||||
subdir = testdir.mkdir("sub")
|
||||
@@ -634,7 +626,6 @@ class TestSession(object):
|
||||
|
||||
|
||||
class Test_getinitialnodes(object):
|
||||
|
||||
def test_global_file(self, testdir, tmpdir):
|
||||
x = tmpdir.ensure("x.py")
|
||||
with tmpdir.as_cwd():
|
||||
@@ -662,7 +653,6 @@ class Test_getinitialnodes(object):
|
||||
|
||||
|
||||
class Test_genitems(object):
|
||||
|
||||
def test_check_collect_hashes(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -776,7 +766,6 @@ def test_matchnodes_two_collections_same_file(testdir):
|
||||
|
||||
|
||||
class TestNodekeywords(object):
|
||||
|
||||
def test_no_under(self, testdir):
|
||||
modcol = testdir.getmodulecol(
|
||||
"""
|
||||
|
||||
@@ -7,7 +7,6 @@ from _pytest.outcomes import OutcomeException
|
||||
|
||||
|
||||
def test_is_generator():
|
||||
|
||||
def zap():
|
||||
yield
|
||||
|
||||
@@ -19,9 +18,7 @@ def test_is_generator():
|
||||
|
||||
|
||||
def test_real_func_loop_limit():
|
||||
|
||||
class Evil(object):
|
||||
|
||||
def __init__(self):
|
||||
self.left = 1000
|
||||
|
||||
@@ -86,7 +83,6 @@ def test_is_generator_async_syntax(testdir):
|
||||
|
||||
|
||||
class ErrorsHelper(object):
|
||||
|
||||
@property
|
||||
def raise_exception(self):
|
||||
raise Exception("exception should be catched")
|
||||
|
||||
@@ -10,7 +10,6 @@ from _pytest.main import EXIT_NOTESTSCOLLECTED
|
||||
|
||||
|
||||
class TestParseIni(object):
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"section, filename", [("pytest", "pytest.ini"), ("tool:pytest", "setup.cfg")]
|
||||
)
|
||||
@@ -118,7 +117,6 @@ class TestParseIni(object):
|
||||
|
||||
|
||||
class TestConfigCmdlineParsing(object):
|
||||
|
||||
def test_parsing_again_fails(self, testdir):
|
||||
config = testdir.parseconfig()
|
||||
pytest.raises(AssertionError, lambda: config.parse([]))
|
||||
@@ -172,7 +170,6 @@ class TestConfigCmdlineParsing(object):
|
||||
|
||||
|
||||
class TestConfigAPI(object):
|
||||
|
||||
def test_config_trace(self, testdir):
|
||||
config = testdir.parseconfig()
|
||||
values = []
|
||||
@@ -412,7 +409,6 @@ class TestConfigAPI(object):
|
||||
|
||||
|
||||
class TestConfigFromdictargs(object):
|
||||
|
||||
def test_basic_behavior(self):
|
||||
from _pytest.config import Config
|
||||
|
||||
@@ -479,7 +475,6 @@ class TestConfigFromdictargs(object):
|
||||
|
||||
|
||||
def test_options_on_small_file_do_not_blow_up(testdir):
|
||||
|
||||
def runfiletest(opts):
|
||||
reprec = testdir.inline_run(*opts)
|
||||
passed, skipped, failed = reprec.countoutcomes()
|
||||
@@ -526,7 +521,6 @@ def test_preparse_ordering_with_setuptools(testdir, monkeypatch):
|
||||
dist = Dist()
|
||||
|
||||
def load(self):
|
||||
|
||||
class PseudoPlugin(object):
|
||||
x = 42
|
||||
|
||||
@@ -606,9 +600,9 @@ def test_plugin_preparse_prevents_setuptools_loading(testdir, monkeypatch, block
|
||||
assert "mytestplugin" not in sys.modules
|
||||
assert config.pluginmanager.get_plugin("mytestplugin") is None
|
||||
else:
|
||||
assert config.pluginmanager.get_plugin(
|
||||
"mytestplugin"
|
||||
) is plugin_module_placeholder
|
||||
assert (
|
||||
config.pluginmanager.get_plugin("mytestplugin") is plugin_module_placeholder
|
||||
)
|
||||
|
||||
|
||||
def test_cmdline_processargs_simple(testdir):
|
||||
@@ -709,7 +703,6 @@ def test_notify_exception(testdir, capfd):
|
||||
assert "ValueError" in err
|
||||
|
||||
class A(object):
|
||||
|
||||
def pytest_internalerror(self, excrepr):
|
||||
return True
|
||||
|
||||
@@ -725,7 +718,6 @@ def test_load_initial_conftest_last_ordering(testdir):
|
||||
pm = get_config().pluginmanager
|
||||
|
||||
class My(object):
|
||||
|
||||
def pytest_load_initial_conftests(self):
|
||||
pass
|
||||
|
||||
@@ -754,7 +746,6 @@ def test_get_plugin_specs_as_list():
|
||||
|
||||
|
||||
class TestWarning(object):
|
||||
|
||||
def test_warn_config(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -804,7 +795,6 @@ class TestWarning(object):
|
||||
|
||||
|
||||
class TestRootdir(object):
|
||||
|
||||
def test_simple_noini(self, tmpdir):
|
||||
assert get_common_ancestor([tmpdir]) == tmpdir
|
||||
a = tmpdir.mkdir("a")
|
||||
@@ -863,7 +853,6 @@ class TestRootdir(object):
|
||||
|
||||
|
||||
class TestOverrideIniArgs(object):
|
||||
|
||||
@pytest.mark.parametrize("name", "setup.cfg tox.ini pytest.ini".split())
|
||||
def test_override_ini_names(self, testdir, name):
|
||||
testdir.tmpdir.join(name).write(
|
||||
|
||||
@@ -28,9 +28,7 @@ def ConftestWithSetinitial(path):
|
||||
|
||||
|
||||
def conftest_setinitial(conftest, args, confcutdir=None):
|
||||
|
||||
class Namespace(object):
|
||||
|
||||
def __init__(self):
|
||||
self.file_or_dir = args
|
||||
self.confcutdir = str(confcutdir)
|
||||
@@ -40,7 +38,6 @@ def conftest_setinitial(conftest, args, confcutdir=None):
|
||||
|
||||
|
||||
class TestConftestValueAccessGlobal(object):
|
||||
|
||||
def test_basic_init(self, basedir):
|
||||
conftest = PytestPluginManager()
|
||||
p = basedir.join("adir")
|
||||
@@ -311,7 +308,6 @@ def test_conftest_found_with_double_dash(testdir):
|
||||
|
||||
|
||||
class TestConftestVisibility(object):
|
||||
|
||||
def _setup_tree(self, testdir): # for issue616
|
||||
# example mostly taken from:
|
||||
# https://mail.python.org/pipermail/pytest-dev/2014-September/002617.html
|
||||
|
||||
@@ -8,7 +8,6 @@ import pytest
|
||||
|
||||
|
||||
class TestDoctests(object):
|
||||
|
||||
def test_collect_testtextfile(self, testdir):
|
||||
w = testdir.maketxtfile(whatever="")
|
||||
checkfile = testdir.maketxtfile(
|
||||
@@ -723,7 +722,6 @@ class TestDoctests(object):
|
||||
|
||||
|
||||
class TestLiterals(object):
|
||||
|
||||
@pytest.mark.parametrize("config_mode", ["ini", "comment"])
|
||||
def test_allow_unicode(self, testdir, config_mode):
|
||||
"""Test that doctests which output unicode work in all python versions
|
||||
@@ -841,7 +839,6 @@ class TestDoctestSkips(object):
|
||||
|
||||
@pytest.fixture(params=["text", "module"])
|
||||
def makedoctest(self, testdir, request):
|
||||
|
||||
def makeit(doctest):
|
||||
mode = request.param
|
||||
if mode == "text":
|
||||
@@ -1122,7 +1119,6 @@ class TestDoctestNamespaceFixture(object):
|
||||
|
||||
|
||||
class TestDoctestReportingOption(object):
|
||||
|
||||
def _run_doctest_report(self, testdir, format):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
|
||||
@@ -29,7 +29,6 @@ def assert_attr(node, **kwargs):
|
||||
|
||||
|
||||
class DomNode(object):
|
||||
|
||||
def __init__(self, dom):
|
||||
self.__node = dom
|
||||
|
||||
@@ -81,7 +80,6 @@ class DomNode(object):
|
||||
|
||||
|
||||
class TestPython(object):
|
||||
|
||||
def test_summing_simple(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -713,7 +711,6 @@ def test_dont_configure_on_slaves(tmpdir):
|
||||
gotten = []
|
||||
|
||||
class FakeConfig(object):
|
||||
|
||||
def __init__(self):
|
||||
self.pluginmanager = self
|
||||
self.option = self
|
||||
@@ -737,7 +734,6 @@ def test_dont_configure_on_slaves(tmpdir):
|
||||
|
||||
|
||||
class TestNonPython(object):
|
||||
|
||||
def test_summing_simple(self, testdir):
|
||||
testdir.makeconftest(
|
||||
"""
|
||||
@@ -1127,18 +1123,15 @@ def test_fancy_items_regression(testdir):
|
||||
import pprint
|
||||
|
||||
pprint.pprint(items)
|
||||
assert (
|
||||
items
|
||||
== [
|
||||
u"conftest a conftest.py",
|
||||
u"conftest a conftest.py",
|
||||
u"conftest b conftest.py",
|
||||
u"test_fancy_items_regression a test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression a test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression b test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression test_pass" u" test_fancy_items_regression.py",
|
||||
]
|
||||
)
|
||||
assert items == [
|
||||
u"conftest a conftest.py",
|
||||
u"conftest a conftest.py",
|
||||
u"conftest b conftest.py",
|
||||
u"test_fancy_items_regression a test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression a test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression b test_fancy_items_regression.py",
|
||||
u"test_fancy_items_regression test_pass" u" test_fancy_items_regression.py",
|
||||
]
|
||||
|
||||
|
||||
def test_global_properties(testdir):
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
import os
|
||||
import sys
|
||||
import mock
|
||||
|
||||
try:
|
||||
import mock
|
||||
except ImportError:
|
||||
import unittest.mock as mock
|
||||
import pytest
|
||||
from _pytest.mark import (
|
||||
MarkGenerator as Mark,
|
||||
@@ -17,7 +21,6 @@ ignore_markinfo = pytest.mark.filterwarnings(
|
||||
|
||||
|
||||
class TestMark(object):
|
||||
|
||||
def test_markinfo_repr(self):
|
||||
from _pytest.mark import MarkInfo, Mark
|
||||
|
||||
@@ -35,7 +38,6 @@ class TestMark(object):
|
||||
pytest.raises((AttributeError, TypeError), mark)
|
||||
|
||||
def test_mark_with_param(self):
|
||||
|
||||
def some_function(abc):
|
||||
pass
|
||||
|
||||
@@ -61,6 +63,19 @@ class TestMark(object):
|
||||
mark.hello(f)
|
||||
assert f.hello
|
||||
|
||||
def test_mark_legacy_ignore_fail(self):
|
||||
def add_attribute(func):
|
||||
func.foo = 1
|
||||
return func
|
||||
|
||||
@pytest.mark.foo
|
||||
@add_attribute
|
||||
def test_fun():
|
||||
pass
|
||||
|
||||
assert test_fun.foo == 1
|
||||
assert test_fun.pytestmark
|
||||
|
||||
@ignore_markinfo
|
||||
def test_pytest_mark_keywords(self):
|
||||
mark = Mark()
|
||||
@@ -483,7 +498,6 @@ def test_parametrized_with_kwargs(testdir):
|
||||
|
||||
|
||||
class TestFunctional(object):
|
||||
|
||||
def test_mark_per_function(self, testdir):
|
||||
p = testdir.makepyfile(
|
||||
"""
|
||||
@@ -880,7 +894,6 @@ class TestFunctional(object):
|
||||
|
||||
|
||||
class TestKeywordSelection(object):
|
||||
|
||||
def test_select_simple(self, testdir):
|
||||
file_test = testdir.makepyfile(
|
||||
"""
|
||||
@@ -1033,7 +1046,6 @@ def test_parameterset_extractfrom(argval, expected):
|
||||
|
||||
|
||||
def test_legacy_transfer():
|
||||
|
||||
class FakeModule(object):
|
||||
pytestmark = []
|
||||
|
||||
@@ -1054,7 +1066,6 @@ def test_legacy_transfer():
|
||||
|
||||
|
||||
class TestMarkDecorator(object):
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"lhs, rhs, expected",
|
||||
[
|
||||
@@ -1132,3 +1143,42 @@ def test_addmarker_getmarker():
|
||||
node.add_marker("b")
|
||||
node.get_marker("a").combined
|
||||
node.get_marker("b").combined
|
||||
|
||||
|
||||
@pytest.mark.issue("https://github.com/pytest-dev/pytest/issues/3605")
|
||||
@pytest.mark.filterwarnings("ignore")
|
||||
def test_markers_from_parametrize(testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
from __future__ import print_function
|
||||
import pytest
|
||||
|
||||
first_custom_mark = pytest.mark.custom_marker
|
||||
custom_mark = pytest.mark.custom_mark
|
||||
@pytest.fixture(autouse=True)
|
||||
def trigger(request):
|
||||
custom_mark =request.node.get_marker('custom_mark')
|
||||
print("Custom mark %s" % custom_mark)
|
||||
|
||||
@custom_mark("custom mark non parametrized")
|
||||
def test_custom_mark_non_parametrized():
|
||||
print("Hey from test")
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"obj_type",
|
||||
[
|
||||
first_custom_mark("first custom mark")("template"),
|
||||
pytest.param( # Think this should be recommended way?
|
||||
"disk",
|
||||
marks=custom_mark('custom mark1')
|
||||
),
|
||||
custom_mark("custom mark2")("vm"), # Tried also this
|
||||
]
|
||||
)
|
||||
def test_custom_mark_parametrized(obj_type):
|
||||
print("obj_type is:", obj_type)
|
||||
"""
|
||||
)
|
||||
|
||||
result = testdir.runpytest()
|
||||
result.assert_outcomes(passed=4)
|
||||
|
||||
@@ -17,7 +17,6 @@ def mp():
|
||||
|
||||
|
||||
def test_setattr():
|
||||
|
||||
class A(object):
|
||||
x = 1
|
||||
|
||||
@@ -42,7 +41,6 @@ def test_setattr():
|
||||
|
||||
|
||||
class TestSetattrWithImportPath(object):
|
||||
|
||||
def test_string_expression(self, monkeypatch):
|
||||
monkeypatch.setattr("os.path.abspath", lambda x: "hello2")
|
||||
assert os.path.abspath("123") == "hello2"
|
||||
@@ -84,7 +82,6 @@ class TestSetattrWithImportPath(object):
|
||||
|
||||
|
||||
def test_delattr():
|
||||
|
||||
class A(object):
|
||||
x = 1
|
||||
|
||||
@@ -311,7 +308,6 @@ def test_importerror(testdir):
|
||||
|
||||
|
||||
class SampleNew(object):
|
||||
|
||||
@staticmethod
|
||||
def hello():
|
||||
return True
|
||||
|
||||
@@ -33,7 +33,6 @@ def test_setup_func_with_setup_decorator():
|
||||
values = []
|
||||
|
||||
class A(object):
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def f(self):
|
||||
values.append(1)
|
||||
|
||||
@@ -13,7 +13,6 @@ def parser():
|
||||
|
||||
|
||||
class TestParser(object):
|
||||
|
||||
def test_no_help_by_default(self, capsys):
|
||||
parser = parseopt.Parser(usage="xyz")
|
||||
pytest.raises(SystemExit, lambda: parser.parse(["-h"]))
|
||||
@@ -34,9 +33,8 @@ class TestParser(object):
|
||||
assert argument.dest == "test"
|
||||
argument = parseopt.Argument("-t", "--test", dest="abc")
|
||||
assert argument.dest == "abc"
|
||||
assert (
|
||||
str(argument)
|
||||
== ("Argument(_short_opts: ['-t'], _long_opts: ['--test'], dest: 'abc')")
|
||||
assert str(argument) == (
|
||||
"Argument(_short_opts: ['-t'], _long_opts: ['--test'], dest: 'abc')"
|
||||
)
|
||||
|
||||
def test_argument_type(self):
|
||||
@@ -180,7 +178,6 @@ class TestParser(object):
|
||||
assert args.S is False
|
||||
|
||||
def test_parse_defaultgetter(self):
|
||||
|
||||
def defaultget(option):
|
||||
if not hasattr(option, "type"):
|
||||
return
|
||||
@@ -204,15 +201,11 @@ class TestParser(object):
|
||||
)
|
||||
parser.add_argument(
|
||||
"-t", "--twoword", "--duo", "--two-word", "--two", help="foo"
|
||||
).map_long_option = {
|
||||
"two": "two-word"
|
||||
}
|
||||
).map_long_option = {"two": "two-word"}
|
||||
# throws error on --deux only!
|
||||
parser.add_argument(
|
||||
"-d", "--deuxmots", "--deux-mots", action="store_true", help="foo"
|
||||
).map_long_option = {
|
||||
"deux": "deux-mots"
|
||||
}
|
||||
).map_long_option = {"deux": "deux-mots"}
|
||||
parser.add_argument("-s", action="store_true", help="single short")
|
||||
parser.add_argument("--abc", "-a", action="store_true", help="bar")
|
||||
parser.add_argument("--klm", "-k", "--kl-m", action="store_true", help="bar")
|
||||
@@ -224,9 +217,7 @@ class TestParser(object):
|
||||
)
|
||||
parser.add_argument(
|
||||
"-x", "--exit-on-first", "--exitfirst", action="store_true", help="spam"
|
||||
).map_long_option = {
|
||||
"exitfirst": "exit-on-first"
|
||||
}
|
||||
).map_long_option = {"exitfirst": "exit-on-first"}
|
||||
parser.add_argument("files_and_dirs", nargs="*")
|
||||
args = parser.parse_args(["-k", "--duo", "hallo", "--exitfirst"])
|
||||
assert args.twoword == "hallo"
|
||||
|
||||
@@ -5,7 +5,6 @@ import pytest
|
||||
|
||||
|
||||
class TestPasteCapture(object):
|
||||
|
||||
@pytest.fixture
|
||||
def pastebinlist(self, monkeypatch, request):
|
||||
pastebinlist = []
|
||||
@@ -85,7 +84,6 @@ class TestPasteCapture(object):
|
||||
|
||||
|
||||
class TestPaste(object):
|
||||
|
||||
@pytest.fixture
|
||||
def pastebin(self, request):
|
||||
return request.config.pluginmanager.getplugin("pastebin")
|
||||
@@ -102,7 +100,6 @@ class TestPaste(object):
|
||||
calls.append((url, data))
|
||||
|
||||
class DummyFile(object):
|
||||
|
||||
def read(self):
|
||||
# part of html of a normal response
|
||||
return b'View <a href="/raw/3c0c6750bd">raw</a>.'
|
||||
|
||||
@@ -25,7 +25,6 @@ def custom_pdb_calls():
|
||||
|
||||
# install dummy debugger class and track which methods were called on it
|
||||
class _CustomPdb(object):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
called.append("init")
|
||||
|
||||
@@ -45,7 +44,6 @@ def custom_debugger_hook():
|
||||
|
||||
# install dummy debugger class and track which methods were called on it
|
||||
class _CustomDebugger(object):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
called.append("init")
|
||||
|
||||
@@ -65,7 +63,6 @@ def custom_debugger_hook():
|
||||
|
||||
|
||||
class TestPDB(object):
|
||||
|
||||
@pytest.fixture
|
||||
def pdblist(self, request):
|
||||
monkeypatch = request.getfixturevalue("monkeypatch")
|
||||
@@ -563,7 +560,6 @@ class TestPDB(object):
|
||||
|
||||
|
||||
class TestDebuggingBreakpoints(object):
|
||||
|
||||
def test_supports_breakpoint_module_global(self):
|
||||
"""
|
||||
Test that supports breakpoint global marks on Python 3.7+ and not on
|
||||
|
||||
@@ -16,7 +16,6 @@ def pytestpm():
|
||||
|
||||
|
||||
class TestPytestPluginInteractions(object):
|
||||
|
||||
def test_addhooks_conftestplugin(self, testdir):
|
||||
testdir.makepyfile(
|
||||
newhooks="""
|
||||
@@ -104,7 +103,6 @@ class TestPytestPluginInteractions(object):
|
||||
values = []
|
||||
|
||||
class A(object):
|
||||
|
||||
def pytest_configure(self, config):
|
||||
values.append(self)
|
||||
|
||||
@@ -125,12 +123,10 @@ class TestPytestPluginInteractions(object):
|
||||
saveindent = []
|
||||
|
||||
class api1(object):
|
||||
|
||||
def pytest_plugin_registered(self):
|
||||
saveindent.append(pytestpm.trace.root.indent)
|
||||
|
||||
class api2(object):
|
||||
|
||||
def pytest_plugin_registered(self):
|
||||
saveindent.append(pytestpm.trace.root.indent)
|
||||
raise ValueError()
|
||||
@@ -175,12 +171,10 @@ class TestPytestPluginInteractions(object):
|
||||
warnings = []
|
||||
|
||||
class get_warnings(object):
|
||||
|
||||
def pytest_logwarning(self, code, fslocation, message, nodeid):
|
||||
warnings.append(message)
|
||||
|
||||
class Plugin(object):
|
||||
|
||||
def pytest_testhook():
|
||||
pass
|
||||
|
||||
@@ -232,7 +226,6 @@ def test_importplugin_error_message(testdir, pytestpm):
|
||||
|
||||
|
||||
class TestPytestPluginManager(object):
|
||||
|
||||
def test_register_imported_modules(self):
|
||||
pm = PytestPluginManager()
|
||||
mod = types.ModuleType("x.y.pytest_hello")
|
||||
@@ -363,7 +356,6 @@ class TestPytestPluginManager(object):
|
||||
|
||||
|
||||
class TestPytestPluginManagerBootstrapming(object):
|
||||
|
||||
def test_preparse_args(self, pytestpm):
|
||||
pytest.raises(
|
||||
ImportError, lambda: pytestpm.consider_preparse(["xyz", "-p", "hello123"])
|
||||
|
||||
@@ -84,9 +84,7 @@ def test_testdir_runs_with_plugin(testdir):
|
||||
|
||||
|
||||
def make_holder():
|
||||
|
||||
class apiclass(object):
|
||||
|
||||
def pytest_xyz(self, arg):
|
||||
"x"
|
||||
|
||||
@@ -143,7 +141,6 @@ def test_makepyfile_utf8(testdir):
|
||||
|
||||
|
||||
class TestInlineRunModulesCleanup(object):
|
||||
|
||||
def test_inline_run_test_module_not_cleaned_up(self, testdir):
|
||||
test_mod = testdir.makepyfile("def test_foo(): assert True")
|
||||
result = testdir.inline_run(str(test_mod))
|
||||
@@ -154,7 +151,6 @@ class TestInlineRunModulesCleanup(object):
|
||||
assert result2.ret == EXIT_TESTSFAILED
|
||||
|
||||
def spy_factory(self):
|
||||
|
||||
class SysModulesSnapshotSpy(object):
|
||||
instances = []
|
||||
|
||||
@@ -220,7 +216,6 @@ class TestInlineRunModulesCleanup(object):
|
||||
|
||||
|
||||
def test_inline_run_clean_sys_paths(testdir):
|
||||
|
||||
def test_sys_path_change_cleanup(self, testdir):
|
||||
test_path1 = testdir.tmpdir.join("boink1").strpath
|
||||
test_path2 = testdir.tmpdir.join("boink2").strpath
|
||||
@@ -245,7 +240,6 @@ def test_inline_run_clean_sys_paths(testdir):
|
||||
assert sys.meta_path == original_meta_path
|
||||
|
||||
def spy_factory(self):
|
||||
|
||||
class SysPathsSnapshotSpy(object):
|
||||
instances = []
|
||||
|
||||
@@ -371,7 +365,8 @@ class TestSysPathsSnapshot(object):
|
||||
original_other = list(getattr(sys, other_path_type))
|
||||
snapshot = SysPathsSnapshot()
|
||||
transformation = {
|
||||
"source": (0, 1, 2, 3, 4, 5), "target": (6, 2, 9, 7, 5, 8)
|
||||
"source": (0, 1, 2, 3, 4, 5),
|
||||
"target": (6, 2, 9, 7, 5, 8),
|
||||
} # noqa: E201
|
||||
assert sys_path == [self.path(x) for x in transformation["source"]]
|
||||
sys_path[1] = self.path(6)
|
||||
|
||||
@@ -21,7 +21,6 @@ def test_recwarn_functional(testdir):
|
||||
|
||||
|
||||
class TestWarningsRecorderChecker(object):
|
||||
|
||||
def test_recording(self):
|
||||
rec = WarningsRecorder()
|
||||
with rec:
|
||||
@@ -188,7 +187,6 @@ class TestDeprecatedCall(object):
|
||||
|
||||
|
||||
class TestWarns(object):
|
||||
|
||||
def test_strings(self):
|
||||
# different messages, b/c Python suppresses multiple identical warnings
|
||||
source1 = "warnings.warn('w1', RuntimeWarning)"
|
||||
|
||||
@@ -12,7 +12,6 @@ from _pytest import runner, main, outcomes
|
||||
|
||||
|
||||
class TestSetupState(object):
|
||||
|
||||
def test_setup(self, testdir):
|
||||
ss = runner.SetupState()
|
||||
item = testdir.getitem("def test_func(): pass")
|
||||
@@ -101,7 +100,6 @@ class TestSetupState(object):
|
||||
|
||||
|
||||
class BaseFunctionalTests(object):
|
||||
|
||||
def test_passfunction(self, testdir):
|
||||
reports = testdir.runitem(
|
||||
"""
|
||||
@@ -253,10 +251,10 @@ class BaseFunctionalTests(object):
|
||||
"""
|
||||
)
|
||||
reps = rec.getcalls("pytest_runtest_logstart pytest_runtest_logfinish")
|
||||
assert (
|
||||
[x._name for x in reps]
|
||||
== ["pytest_runtest_logstart", "pytest_runtest_logfinish"]
|
||||
)
|
||||
assert [x._name for x in reps] == [
|
||||
"pytest_runtest_logstart",
|
||||
"pytest_runtest_logfinish",
|
||||
]
|
||||
for rep in reps:
|
||||
assert rep.nodeid == "test_logstart_logfinish_hooks.py::test_func"
|
||||
assert rep.location == ("test_logstart_logfinish_hooks.py", 1, "test_func")
|
||||
@@ -395,9 +393,7 @@ class BaseFunctionalTests(object):
|
||||
|
||||
|
||||
class TestExecutionNonForked(BaseFunctionalTests):
|
||||
|
||||
def getrunner(self):
|
||||
|
||||
def f(item):
|
||||
return runner.runtestprotocol(item, log=False)
|
||||
|
||||
@@ -439,7 +435,6 @@ class TestExecutionForked(BaseFunctionalTests):
|
||||
|
||||
|
||||
class TestSessionReports(object):
|
||||
|
||||
def test_collect_result(self, testdir):
|
||||
col = testdir.getmodulecol(
|
||||
"""
|
||||
@@ -869,14 +864,11 @@ def test_current_test_env_var(testdir, monkeypatch):
|
||||
result = testdir.runpytest_inprocess()
|
||||
assert result.ret == 0
|
||||
test_id = "test_current_test_env_var.py::test"
|
||||
assert (
|
||||
pytest_current_test_vars
|
||||
== [
|
||||
("setup", test_id + " (setup)"),
|
||||
("call", test_id + " (call)"),
|
||||
("teardown", test_id + " (teardown)"),
|
||||
]
|
||||
)
|
||||
assert pytest_current_test_vars == [
|
||||
("setup", test_id + " (setup)"),
|
||||
("call", test_id + " (call)"),
|
||||
("teardown", test_id + " (teardown)"),
|
||||
]
|
||||
assert "PYTEST_CURRENT_TEST" not in os.environ
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ from _pytest.main import EXIT_NOTESTSCOLLECTED
|
||||
|
||||
|
||||
class SessionTests(object):
|
||||
|
||||
def test_basic_testitem_events(self, testdir):
|
||||
tfile = testdir.makepyfile(
|
||||
"""
|
||||
@@ -168,7 +167,6 @@ class SessionTests(object):
|
||||
|
||||
|
||||
class TestNewSession(SessionTests):
|
||||
|
||||
def test_order_of_execution(self, testdir):
|
||||
reprec = testdir.inline_runsource(
|
||||
"""
|
||||
|
||||
@@ -7,7 +7,6 @@ from _pytest.runner import runtestprotocol
|
||||
|
||||
|
||||
class TestEvaluator(object):
|
||||
|
||||
def test_no_marker(self, testdir):
|
||||
item = testdir.getitem("def test_func(): pass")
|
||||
evalskipif = MarkEvaluator(item, "skipif")
|
||||
@@ -126,7 +125,10 @@ class TestEvaluator(object):
|
||||
)
|
||||
ev = MarkEvaluator(item, "skipif")
|
||||
exc = pytest.raises(pytest.fail.Exception, ev.istrue)
|
||||
assert """Failed: you need to specify reason=STRING when using booleans as conditions.""" in exc.value.msg
|
||||
assert (
|
||||
"""Failed: you need to specify reason=STRING when using booleans as conditions."""
|
||||
in exc.value.msg
|
||||
)
|
||||
|
||||
def test_skipif_class(self, testdir):
|
||||
item, = testdir.getitems(
|
||||
@@ -146,7 +148,6 @@ class TestEvaluator(object):
|
||||
|
||||
|
||||
class TestXFail(object):
|
||||
|
||||
@pytest.mark.parametrize("strict", [True, False])
|
||||
def test_xfail_simple(self, testdir, strict):
|
||||
item = testdir.getitem(
|
||||
@@ -514,7 +515,6 @@ class TestXFail(object):
|
||||
|
||||
|
||||
class TestXFailwithSetupTeardown(object):
|
||||
|
||||
def test_failing_setup_issue9(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -547,7 +547,6 @@ class TestXFailwithSetupTeardown(object):
|
||||
|
||||
|
||||
class TestSkip(object):
|
||||
|
||||
def test_skip_class(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -645,7 +644,6 @@ class TestSkip(object):
|
||||
|
||||
|
||||
class TestSkipif(object):
|
||||
|
||||
def test_skipif_conditional(self, testdir):
|
||||
item = testdir.getitem(
|
||||
"""
|
||||
@@ -1023,7 +1021,6 @@ def test_imperativeskip_on_xfail_test(testdir):
|
||||
|
||||
|
||||
class TestBooleanCondition(object):
|
||||
|
||||
def test_skipif(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
|
||||
@@ -18,7 +18,6 @@ DistInfo = collections.namedtuple("DistInfo", ["project_name", "version"])
|
||||
|
||||
|
||||
class Option(object):
|
||||
|
||||
def __init__(self, verbose=False, fulltrace=False):
|
||||
self.verbose = verbose
|
||||
self.fulltrace = fulltrace
|
||||
@@ -68,7 +67,6 @@ def test_plugin_nameversion(input, expected):
|
||||
|
||||
|
||||
class TestTerminal(object):
|
||||
|
||||
def test_pass_skip_fail(self, testdir, option):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -248,7 +246,6 @@ class TestTerminal(object):
|
||||
|
||||
|
||||
class TestCollectonly(object):
|
||||
|
||||
def test_collectonly_basic(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -356,7 +353,6 @@ def test_repr_python_version(monkeypatch):
|
||||
|
||||
|
||||
class TestFixtureReporting(object):
|
||||
|
||||
def test_setup_fixture_error(self, testdir):
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
@@ -457,7 +453,6 @@ class TestFixtureReporting(object):
|
||||
|
||||
|
||||
class TestTerminalFunctional(object):
|
||||
|
||||
def test_deselected(self, testdir):
|
||||
testpath = testdir.makepyfile(
|
||||
"""
|
||||
@@ -735,9 +730,7 @@ def test_color_yes_collection_on_non_atty(testdir, verbose):
|
||||
|
||||
|
||||
def test_getreportopt():
|
||||
|
||||
class Config(object):
|
||||
|
||||
class Option(object):
|
||||
reportchars = ""
|
||||
disable_warnings = True
|
||||
@@ -1102,7 +1095,6 @@ def test_no_trailing_whitespace_after_inifile_word(testdir):
|
||||
|
||||
|
||||
class TestProgress(object):
|
||||
|
||||
@pytest.fixture
|
||||
def many_tests_files(self, testdir):
|
||||
testdir.makepyfile(
|
||||
|
||||
@@ -42,7 +42,6 @@ def test_ensuretemp(recwarn):
|
||||
|
||||
|
||||
class TestTempdirHandler(object):
|
||||
|
||||
def test_mktemp(self, testdir):
|
||||
from _pytest.tmpdir import TempdirFactory
|
||||
|
||||
@@ -59,7 +58,6 @@ class TestTempdirHandler(object):
|
||||
|
||||
|
||||
class TestConfigTmpdir(object):
|
||||
|
||||
def test_getbasetemp_custom_removes_old(self, testdir):
|
||||
mytemp = testdir.tmpdir.join("xyz")
|
||||
p = testdir.makepyfile(
|
||||
|
||||
@@ -389,7 +389,6 @@ def test_module_level_pytestmark(testdir):
|
||||
|
||||
|
||||
class TestTrialUnittest(object):
|
||||
|
||||
def setup_class(cls):
|
||||
cls.ut = pytest.importorskip("twisted.trial.unittest")
|
||||
# on windows trial uses a socket for a reactor and apparently doesn't close it properly
|
||||
|
||||
@@ -160,9 +160,8 @@ def test_unicode(testdir, pyfile_with_warnings):
|
||||
reason="warnings message is broken as it is not str instance",
|
||||
)
|
||||
def test_py2_unicode(testdir, pyfile_with_warnings):
|
||||
if (
|
||||
getattr(sys, "pypy_version_info", ())[:2] == (5, 9)
|
||||
and sys.platform.startswith("win")
|
||||
if getattr(sys, "pypy_version_info", ())[:2] == (5, 9) and sys.platform.startswith(
|
||||
"win"
|
||||
):
|
||||
pytest.xfail("fails with unicode error on PyPy2 5.9 and Windows (#2905)")
|
||||
testdir.makepyfile(
|
||||
|
||||
4
tox.ini
4
tox.ini
@@ -204,9 +204,7 @@ filterwarnings =
|
||||
ignore:.*type argument to addoption.*:DeprecationWarning
|
||||
# produced by python >=3.5 on execnet (pytest-xdist)
|
||||
ignore:.*inspect.getargspec.*deprecated, use inspect.signature.*:DeprecationWarning
|
||||
# ignore warning about package resolution using __spec__ or __package__
|
||||
# should be a temporary solution, see #3061 for discussion
|
||||
ignore:.*can't resolve package from __spec__ or __package__.*:ImportWarning
|
||||
|
||||
[flake8]
|
||||
max-line-length = 120
|
||||
ignore = E203,W503
|
||||
|
||||
Reference in New Issue
Block a user