Compare commits

...

36 Commits
3.2.1 ... 3.2.2

Author SHA1 Message Date
Bruno Oliveira
c52f87ede3 Preparing release version 3.2.2 2017-09-06 21:37:57 +00:00
Bruno Oliveira
549f5c1a47 Merge pull request #2736 from xuanluong/issue-2604-documents-mark.with_args
[DOC] Add examples for mark.with_args
2017-09-06 16:33:01 -03:00
Xuan Luong
3f8ff7f090 [DOC] Add examples for mark.with_args 2017-09-06 14:26:28 -04:00
Ronny Pfannschmidt
ad36407747 Merge pull request #2700 from nicoddemus/staticmethods-fixtures
Allow tests declared as @staticmethod to use fixtures
2017-09-06 08:24:00 +02:00
Bruno Oliveira
1fc185b640 Add comment about possible future refactoring in the fixture mechanism 2017-09-05 19:28:39 -03:00
Ronny Pfannschmidt
181bd60bf9 Merge pull request #2742 from nicoddemus/resultlog-deprecation
Improve user guidance regarding ``--resultlog`` deprecation
2017-09-01 08:29:41 +02:00
Bruno Oliveira
3288c9a110 Improve user guidance regarding `--resultlog` deprecation
Fix #2739
2017-08-31 19:11:41 -03:00
Ronny Pfannschmidt
5e00549ecc Merge pull request #2735 from fgmacedo/fgm-fix-reprfuncargs-toterminal
2731.bug Fix ReprFuncArgs with mixed unicode and utf-8 args.
2017-08-31 09:36:56 +02:00
Ronny Pfannschmidt
b770a32dc8 Merge pull request #2707 from cybergrind/fix_baseexception
Catch BaseException in safe_getattr
2017-08-31 09:35:07 +02:00
Bruno Oliveira
f9157b1b6b Improve CHANGELOG entry to be more user-friendly 2017-08-30 21:21:44 -03:00
Bruno Oliveira
f4e811afc0 Merge remote-tracking branch 'upstream/master' into cybergrind/fix_baseexception 2017-08-30 21:11:22 -03:00
Fernando Macedo
59cdef92be fixes #2731 ReprFuncArgs with mixed unicode and utf-8 args 2017-08-30 16:06:12 -03:00
Bruno Oliveira
709b8b65a4 Merge pull request #2721 from josepht/patch-1
Fix typo in goodpractices.rst
2017-08-29 22:08:20 -03:00
Bruno Oliveira
0824076e11 Merge pull request #2710 from massich/raises_match_doc
[DOC] update raises documentation regarding regex match
2017-08-29 21:01:27 -03:00
Joe Talbott
67161ee9f8 Add changelog item for PR #2721. 2017-08-25 10:06:45 -04:00
Joe Talbott
1c891d7d97 Fix typo in goodpractices.rst 2017-08-25 10:01:24 -04:00
Kirill Pinchuk
12b1bff6c5 compat.safe_getattr now catches OutcomeExceptions too 2017-08-23 17:17:03 +03:00
Joan Massich
657976e98a update raises documentation regarding regex match 2017-08-22 12:12:48 +02:00
Bruno Oliveira
a993add783 Allow tests declared as @staticmethod to use fixtures
Fix #2699
2017-08-17 20:44:19 -03:00
Ronny Pfannschmidt
539523cfee Merge pull request #2697 from nicoddemus/match-kw-version
Update docs: ``match`` keyword was introduced in 3.1
2017-08-17 14:41:55 +02:00
Bruno Oliveira
f18780ed8a Update docs: `match` keyword was introduced in 3.1
Also update the text to recommend using the context-manager
over the callable/string forms.
2017-08-16 14:28:34 -03:00
Ronny Pfannschmidt
806d47b4d4 Merge pull request #2691 from anhiga/trivial_error
Fixed error in 'Good Practices' code snippet
2017-08-16 09:50:32 +02:00
Bruno Oliveira
bfc9f61482 Update the number of plugins in index.rst 2017-08-15 23:05:23 -03:00
Antonio Hidalgo
2a99d82c3b Fixed error in 'Good Practices' code snippet 2017-08-16 00:26:14 +02:00
Ronny Pfannschmidt
9b2753b302 Merge pull request #2687 from nicoddemus/use-py36-ci
Use 3.6 as preferred Python 3 interpreter for CI
2017-08-15 10:49:39 +02:00
Bruno Oliveira
e9bfccdf2d Merge pull request #2678 from jespino/fix/2676
Add default values documentation for python_files, python_classes and python_functions
2017-08-14 20:29:39 -03:00
Bruno Oliveira
7b5d26c1a8 Use py36 as preferred Python 3 interpreter for CI testing 2017-08-14 20:27:28 -03:00
Bruno Oliveira
362b1b3c4f Use tox release candidates in CI
Fix #2683
2017-08-14 19:19:20 -03:00
Ronny Pfannschmidt
5c0c1977e3 Merge pull request #2682 from pelme/getfuncargvalue-fix
Use the correct stacklevel for getfuncargvalue() deprecation warning.
2017-08-13 18:24:39 +02:00
Andreas Pelme
39331856ed Use the correct stacklevel for getfuncargvalue() deprecation warning.
Fixed #2681.
2017-08-13 14:59:33 +02:00
Jesús Espino
dc9154e8ff Add default values documentation for python_files, python_classes and python_functions 2017-08-12 12:29:13 +02:00
Bruno Oliveira
021fba4e84 Update number of plugins on README and poiint to plugincompat link 2017-08-10 21:15:22 -03:00
Bruno Oliveira
fd84c886ee Merge pull request #2671 from nicoddemus/release-3.2.1
Release 3.2.1
2017-08-09 17:15:21 -03:00
Bruno Oliveira
e6020781f6 Merge pull request #2653 from felipedau/slow-sharing-note
Add note on sharing the `slow` marker in the basic examples
2017-08-09 08:18:26 -03:00
Felipe Dau
acd3c4fbc4 Update changelog for #2653 2017-08-09 02:57:36 +00:00
Felipe Dau
c847b83d56 Use pytest_collection_modifyitems() in the run/skip option example 2017-08-09 02:51:07 +00:00
27 changed files with 283 additions and 62 deletions

View File

@@ -1,9 +1,10 @@
sudo: false
language: python
python:
- '3.5'
- '3.6'
# command to install dependencies
install: "pip install -U tox"
install:
- pip install --upgrade --pre tox
# # command to run tests
env:
matrix:
@@ -13,18 +14,17 @@ env:
- TOXENV=linting
- TOXENV=py27
- TOXENV=py34
- TOXENV=py35
- TOXENV=py36
- TOXENV=py27-pexpect
- TOXENV=py27-xdist
- TOXENV=py27-trial
- TOXENV=py27-numpy
- TOXENV=py35-pexpect
- TOXENV=py35-xdist
- TOXENV=py35-trial
- TOXENV=py35-numpy
- TOXENV=py36-pexpect
- TOXENV=py36-xdist
- TOXENV=py36-trial
- TOXENV=py36-numpy
- TOXENV=py27-nobyte
- TOXENV=doctesting
- TOXENV=freeze
- TOXENV=docs
matrix:
@@ -35,8 +35,10 @@ matrix:
python: '3.3'
- env: TOXENV=pypy
python: 'pypy-5.4'
- env: TOXENV=py36
python: '3.6'
- env: TOXENV=py35
python: '3.5'
- env: TOXENV=py35-freeze
python: '3.5'
- env: TOXENV=py37
python: 'nightly'
allow_failures:

View File

@@ -173,5 +173,6 @@ Vidar T. Fauske
Vitaly Lashmanov
Vlad Dragos
Wouter van Ackooy
Xuan Luong
Xuecong Liao
Zoltán Máté

View File

@@ -8,6 +8,53 @@
.. towncrier release notes start
Pytest 3.2.2 (2017-09-06)
=========================
Bug Fixes
---------
- Calling the deprecated `request.getfuncargvalue()` now shows the source of
the call. (`#2681 <https://github.com/pytest-dev/pytest/issues/2681>`_)
- Allow tests declared as ``@staticmethod`` to use fixtures. (`#2699
<https://github.com/pytest-dev/pytest/issues/2699>`_)
- Fixed edge-case during collection: attributes which raised ``pytest.fail``
when accessed would abort the entire collection. (`#2707
<https://github.com/pytest-dev/pytest/issues/2707>`_)
- Fix ``ReprFuncArgs`` with mixed unicode and UTF-8 args. (`#2731
<https://github.com/pytest-dev/pytest/issues/2731>`_)
Improved Documentation
----------------------
- In examples on working with custom markers, add examples demonstrating the
usage of ``pytest.mark.MARKER_NAME.with_args`` in comparison with
``pytest.mark.MARKER_NAME.__call__`` (`#2604
<https://github.com/pytest-dev/pytest/issues/2604>`_)
- In one of the simple examples, use `pytest_collection_modifyitems()` to skip
tests based on a command-line option, allowing its sharing while preventing a
user error when acessing `pytest.config` before the argument parsing. (`#2653
<https://github.com/pytest-dev/pytest/issues/2653>`_)
Trivial/Internal Changes
------------------------
- Fixed minor error in 'Good Practices/Manual Integration' code snippet.
(`#2691 <https://github.com/pytest-dev/pytest/issues/2691>`_)
- Fixed typo in goodpractices.rst. (`#2721
<https://github.com/pytest-dev/pytest/issues/2721>`_)
- Improve user guidance regarding ``--resultlog`` deprecation. (`#2739
<https://github.com/pytest-dev/pytest/issues/2739>`_)
Pytest 3.2.1 (2017-08-08)
=========================

View File

@@ -78,7 +78,7 @@ Features
- Python2.6+, Python3.3+, PyPy-2.3, Jython-2.5 (untested);
- Rich plugin architecture, with over 150+ `external plugins <http://docs.pytest.org/en/latest/plugins.html#installing-external-plugins-searching>`_ and thriving community;
- Rich plugin architecture, with over 315+ `external plugins <http://plugincompat.herokuapp.com>`_ and thriving community;
Documentation

View File

@@ -863,7 +863,7 @@ class ReprFuncArgs(TerminalRepr):
if self.args:
linesofar = ""
for name, value in self.args:
ns = "%s = %s" % (name, value)
ns = "%s = %s" % (safe_str(name), safe_str(value))
if len(ns) + len(linesofar) + 2 > tw.fullwidth:
if linesofar:
tw.line(linesofar)

View File

@@ -11,6 +11,7 @@ import functools
import py
import _pytest
from _pytest.outcomes import TEST_OUTCOME
try:
@@ -82,7 +83,15 @@ def num_mock_patch_args(function):
return len(patchings)
def getfuncargnames(function, startindex=None):
def getfuncargnames(function, startindex=None, cls=None):
"""
@RonnyPfannschmidt: This function should be refactored when we revisit fixtures. The
fixture mechanism should ask the node for the fixture names, and not try to obtain
directly from the function object well after collection has occurred.
"""
if startindex is None and cls is not None:
is_staticmethod = isinstance(cls.__dict__.get(function.__name__, None), staticmethod)
startindex = 0 if is_staticmethod else 1
# XXX merge with main.py's varnames
# assert not isclass(function)
realfunction = function
@@ -221,14 +230,16 @@ def getimfunc(func):
def safe_getattr(object, name, default):
""" Like getattr but return default upon any Exception.
""" Like getattr but return default upon any Exception or any OutcomeException.
Attribute access can potentially fail for 'evil' Python objects.
See issue #214.
It catches OutcomeException because of #2490 (issue #580), new outcomes are derived from BaseException
instead of Exception (for more details check #2707)
"""
try:
return getattr(object, name, default)
except Exception:
except TEST_OUTCOME:
return default

View File

@@ -26,7 +26,10 @@ SETUP_CFG_PYTEST = '[pytest] section in setup.cfg files is deprecated, use [tool
GETFUNCARGVALUE = "use of getfuncargvalue is deprecated, use getfixturevalue"
RESULT_LOG = '--result-log is deprecated and scheduled for removal in pytest 4.0'
RESULT_LOG = (
'--result-log is deprecated and scheduled for removal in pytest 4.0.\n'
'See https://docs.pytest.org/en/latest/usage.html#creating-resultlog-format-files for more information.'
)
MARK_INFO_ATTRIBUTE = RemovedInPytest4Warning(
"MarkInfo objects are deprecated as they contain the merged marks"

View File

@@ -432,7 +432,8 @@ class FixtureRequest(FuncargnamesCompatAttr):
from _pytest import deprecated
warnings.warn(
deprecated.GETFUNCARGVALUE,
DeprecationWarning)
DeprecationWarning,
stacklevel=2)
return self.getfixturevalue(argname)
def _get_active_fixturedef(self, argname):
@@ -956,11 +957,7 @@ class FixtureManager:
def getfixtureinfo(self, node, func, cls, funcargs=True):
if funcargs and not hasattr(node, "nofuncargs"):
if cls is not None:
startindex = 1
else:
startindex = None
argnames = getfuncargnames(func, startindex)
argnames = getfuncargnames(func, cls=cls)
else:
argnames = ()
usefixtures = getattr(func, "usefixtures", None)

View File

@@ -493,7 +493,8 @@ def raises(expected_exception, *args, **kwargs):
...
>>> assert exc_info.type == ValueError
Or you can use the keyword argument ``match`` to assert that the
Since version ``3.1`` you can use the keyword argument ``match`` to assert that the
exception matches a text or regex::
>>> with raises(ValueError, match='must be 0 or None'):
@@ -502,7 +503,12 @@ def raises(expected_exception, *args, **kwargs):
>>> with raises(ValueError, match=r'must be \d+$'):
... raise ValueError("value must be 42")
Or you can specify a callable by passing a to-be-called lambda::
**Legacy forms**
The forms below are fully supported but are discouraged for new code because the
context manager form is regarded as more readable and less error-prone.
It is possible to specify a callable by passing a to-be-called lambda::
>>> raises(ZeroDivisionError, lambda: 1/0)
<ExceptionInfo ...>
@@ -516,11 +522,14 @@ def raises(expected_exception, *args, **kwargs):
>>> raises(ZeroDivisionError, f, x=0)
<ExceptionInfo ...>
A third possibility is to use a string to be executed::
It is also possible to pass a string to be evaluated at runtime::
>>> raises(ZeroDivisionError, "f(0)")
<ExceptionInfo ...>
The string will be evaluated using the same ``locals()`` and ``globals()``
at the moment of the ``raises`` call.
.. autoclass:: _pytest._code.ExceptionInfo
:members:

View File

@@ -21,13 +21,13 @@ environment:
- TOXENV: "py27-xdist"
- TOXENV: "py27-trial"
- TOXENV: "py27-numpy"
- TOXENV: "py35-pexpect"
- TOXENV: "py35-xdist"
- TOXENV: "py35-trial"
- TOXENV: "py35-numpy"
- TOXENV: "py36-pexpect"
- TOXENV: "py36-xdist"
- TOXENV: "py36-trial"
- TOXENV: "py36-numpy"
- TOXENV: "py27-nobyte"
- TOXENV: "doctesting"
- TOXENV: "freeze"
- TOXENV: "py35-freeze"
- TOXENV: "docs"
install:
@@ -36,7 +36,7 @@ install:
- if "%TOXENV%" == "pypy" call scripts\install-pypy.bat
- C:\Python35\python -m pip install tox
- C:\Python36\python -m pip install --upgrade --pre tox
build: false # Not a C# project, build stuff at the test step instead.

View File

@@ -6,6 +6,7 @@ Release announcements
:maxdepth: 2
release-3.2.2
release-3.2.1
release-3.2.0
release-3.1.3

View File

@@ -0,0 +1,28 @@
pytest-3.2.2
=======================================
pytest 3.2.2 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:
* Andreas Pelme
* Antonio Hidalgo
* Bruno Oliveira
* Felipe Dau
* Fernando Macedo
* Jesús Espino
* Joan Massich
* Joe Talbott
* Kirill Pinchuk
* Ronny Pfannschmidt
* Xuan Luong
Happy testing,
The pytest Development Team

View File

@@ -119,9 +119,9 @@ exceptions your own code is deliberately raising, whereas using
like documenting unfixed bugs (where the test describes what "should" happen)
or bugs in dependencies.
If you want to test that a regular expression matches on the string
representation of an exception (like the ``TestCase.assertRaisesRegexp`` method
from ``unittest``) you can use the ``ExceptionInfo.match`` method::
Also, the context manager form accepts a ``match`` keyword parameter to test
that a regular expression matches on the string representation of an exception
(like the ``TestCase.assertRaisesRegexp`` method from ``unittest``)::
import pytest
@@ -129,12 +129,11 @@ from ``unittest``) you can use the ``ExceptionInfo.match`` method::
raise ValueError("Exception 123 raised")
def test_match():
with pytest.raises(ValueError) as excinfo:
with pytest.raises(ValueError, match=r'.* 123 .*'):
myfunc()
excinfo.match(r'.* 123 .*')
The regexp parameter of the ``match`` method is matched with the ``re.search``
function. So in the above example ``excinfo.match('123')`` would have worked as
function. So in the above example ``match='123'`` would have worked as
well.

View File

@@ -230,13 +230,16 @@ Builtin configuration file options
.. confval:: python_files
One or more Glob-style file patterns determining which python files
are considered as test modules.
are considered as test modules. By default, pytest will consider
any file matching with ``test_*.py`` and ``*_test.py`` globs as a test
module.
.. confval:: python_classes
One or more name prefixes or glob-style patterns determining which classes
are considered for test collection. Here is an example of how to collect
tests from classes that end in ``Suite``:
are considered for test collection. By default, pytest will consider any
class prefixed with ``Test`` as a test collection. Here is an example of how
to collect tests from classes that end in ``Suite``:
.. code-block:: ini
@@ -251,7 +254,8 @@ Builtin configuration file options
.. confval:: python_functions
One or more name prefixes or glob-patterns determining which test functions
and methods are considered tests. Here is an example of how
and methods are considered tests. By default, pytest will consider any
function prefixed with ``test`` as a test. Here is an example of how
to collect test functions and methods that end in ``_test``:
.. code-block:: ini

View File

@@ -395,6 +395,49 @@ The ``--markers`` option always gives you a list of available markers::
@pytest.mark.trylast: mark a hook implementation function such that the plugin machinery will try to call it last/as late as possible.
.. _`passing callables to custom markers`:
Passing a callable to custom markers
--------------------------------------------
.. regendoc:wipe
Below is the config file that will be used in the next examples::
# content of conftest.py
import sys
def pytest_runtest_setup(item):
marker = item.get_marker('my_marker')
if marker is not None:
for info in marker:
print('Marker info name={} args={} kwars={}'.format(info.name, info.args, info.kwargs))
sys.stdout.flush()
A custom marker can have its argument set, i.e. ``args`` and ``kwargs`` properties, defined by either invoking it as a callable or using ``pytest.mark.MARKER_NAME.with_args``. These two methods achieve the same effect most of the time.
However, if there is a callable as the single positional argument with no keyword arguments, using the ``pytest.mark.MARKER_NAME(c)`` will not pass ``c`` as a positional argument but decorate ``c`` with the custom marker (see :ref:`MarkDecorator <mark>`). Fortunately, ``pytest.mark.MARKER_NAME.with_args`` comes to the rescue::
# content of test_custom_marker.py
import pytest
def hello_world(*args, **kwargs):
return 'Hello World'
@pytest.mark.my_marker.with_args(hello_world)
def test_with_args():
pass
The output is as follows::
$ pytest -q -s
Marker info name=my_marker args=(<function hello_world at 0xdeadbeef>,) kwars={}
.
1 passed in 0.12 seconds
We can see that the custom marker has its argument set extended with the function ``hello_world``. This is the key different between creating a custom marker as a callable, which invokes ``__call__`` behind the scenes, and using ``with_args``.
Reading markers which were set from multiple places
----------------------------------------------------

View File

@@ -358,7 +358,7 @@ get on the terminal - we are working on that)::
> 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:570>:1: ValueError
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python_api.py:579>:1: ValueError
_______ TestRaises.test_raises_doesnt ________
self = <failure_demo.TestRaises object at 0xdeadbeef>

View File

@@ -127,7 +127,7 @@ Control skipping of tests according to command line option
.. regendoc:wipe
Here is a ``conftest.py`` file adding a ``--runslow`` command
line option to control skipping of ``slow`` marked tests:
line option to control skipping of ``pytest.mark.slow`` marked tests:
.. code-block:: python
@@ -136,7 +136,16 @@ line option to control skipping of ``slow`` marked tests:
import pytest
def pytest_addoption(parser):
parser.addoption("--runslow", action="store_true",
help="run slow tests")
default=False, help="run slow tests")
def pytest_collection_modifyitems(config, items):
if config.getoption("--runslow"):
# --runslow given in cli: do not skip slow tests
return
skip_slow = pytest.mark.skip(reason="need --runslow option to run")
for item in items:
if "slow" in item.keywords:
item.add_marker(skip_slow)
We can now write a test module like this:
@@ -146,17 +155,11 @@ We can now write a test module like this:
import pytest
slow = pytest.mark.skipif(
not pytest.config.getoption("--runslow"),
reason="need --runslow option to run"
)
def test_func_fast():
pass
@slow
@pytest.mark.slow
def test_func_slow():
pass
@@ -170,7 +173,7 @@ and when running it will see a skipped "slow" test::
test_module.py .s
======= short test summary info ========
SKIP [1] test_module.py:14: need --runslow option to run
SKIP [1] test_module.py:8: need --runslow option to run
======= 1 passed, 1 skipped in 0.12 seconds ========

View File

@@ -122,7 +122,7 @@ want to distribute them along with your application::
test_view.py
...
In this scheme, it is easy to your run tests using the ``--pyargs`` option::
In this scheme, it is easy to run your tests using the ``--pyargs`` option::
pytest --pyargs mypkg
@@ -267,7 +267,7 @@ your own setuptools Test command for invoking pytest.
def initialize_options(self):
TestCommand.initialize_options(self)
self.pytest_args = []
self.pytest_args = ''
def run_tests(self):
import shlex

View File

@@ -59,7 +59,7 @@ Features
- Python2.6+, Python3.3+, PyPy-2.3, Jython-2.5 (untested);
- Rich plugin architecture, with over 150+ :ref:`external plugins <extplugins>` and thriving community;
- Rich plugin architecture, with over 315+ `external plugins <http://plugincompat.herokuapp.com>`_ and thriving community;
Documentation

View File

@@ -311,6 +311,13 @@ Creating resultlog format files
This option is rarely used and is scheduled for removal in 4.0.
An alternative for users which still need similar functionality is to use the
`pytest-tap <https://pypi.python.org/pypi/pytest-tap>`_ plugin which provides
a stream of test data.
If you have any concerns, please don't hesitate to
`open an issue <https://github.com/pytest-dev/pytest/issues>`_.
To create plain-text machine-readable result files you can issue::
pytest --resultlog=path

View File

@@ -5,4 +5,4 @@ if "%TOXENV%" == "coveralls" (
exit /b 0
)
)
C:\Python35\python -m tox
C:\Python36\python -m tox

View File

@@ -1,9 +1,11 @@
# coding: utf-8
from __future__ import absolute_import, division, print_function
import sys
import _pytest._code
import py
import pytest
from test_excinfo import TWMock
def test_ne():
@@ -172,3 +174,23 @@ class TestTracebackEntry(object):
source = entry.getsource()
assert len(source) == 6
assert 'assert False' in source[5]
class TestReprFuncArgs(object):
def test_not_raise_exception_with_mixed_encoding(self):
from _pytest._code.code import ReprFuncArgs
tw = TWMock()
args = [
('unicode_string', u"São Paulo"),
('utf8_string', 'S\xc3\xa3o Paulo'),
]
r = ReprFuncArgs(args)
r.toterminal(tw)
if sys.version_info[0] >= 3:
assert tw.lines[0] == 'unicode_string = São Paulo, utf8_string = São Paulo'
else:
assert tw.lines[0] == 'unicode_string = São Paulo, utf8_string = São Paulo'

View File

@@ -78,4 +78,7 @@ def test_resultlog_is_deprecated(testdir):
pass
''')
result = testdir.runpytest('--result-log=%s' % testdir.tmpdir.join('result.log'))
result.stdout.fnmatch_lines(['*--result-log is deprecated and scheduled for removal in pytest 4.0*'])
result.stdout.fnmatch_lines([
'*--result-log is deprecated and scheduled for removal in pytest 4.0*',
'*See https://docs.pytest.org/*/usage.html#creating-resultlog-format-files for more information*',
])

View File

@@ -147,11 +147,21 @@ class TestClass(object):
])
def test_static_method(self, testdir):
"""Support for collecting staticmethod tests (#2528, #2699)"""
testdir.getmodulecol("""
import pytest
class Test(object):
@staticmethod
def test_something():
pass
@pytest.fixture
def fix(self):
return 1
@staticmethod
def test_fix(fix):
assert fix == 1
""")
result = testdir.runpytest()
if sys.version_info < (2, 7):
@@ -162,8 +172,8 @@ class TestClass(object):
])
else:
result.stdout.fnmatch_lines([
"*collected 1 item*",
"*1 passed in*",
"*collected 2 items*",
"*2 passed in*",
])
def test_setup_teardown_class_as_classmethod(self, testdir):

View File

@@ -29,10 +29,16 @@ def test_getfuncargnames():
def f(self, arg1, arg2="hello"):
pass
@staticmethod
def static(arg1, arg2):
pass
assert fixtures.getfuncargnames(A().f) == ('arg1',)
if sys.version_info < (3, 0):
assert fixtures.getfuncargnames(A.f) == ('arg1',)
assert fixtures.getfuncargnames(A.static, cls=A) == ('arg1', 'arg2')
class TestFillFixtures(object):
def test_fillfuncargs_exposed(self):

View File

@@ -2,7 +2,8 @@ from __future__ import absolute_import, division, print_function
import sys
import pytest
from _pytest.compat import is_generator, get_real_func
from _pytest.compat import is_generator, get_real_func, safe_getattr
from _pytest.outcomes import OutcomeException
def test_is_generator():
@@ -74,3 +75,27 @@ def test_is_generator_async_syntax(testdir):
""")
result = testdir.runpytest()
result.stdout.fnmatch_lines(['*1 passed*'])
class ErrorsHelper(object):
@property
def raise_exception(self):
raise Exception('exception should be catched')
@property
def raise_fail(self):
pytest.fail('fail should be catched')
def test_helper_failures():
helper = ErrorsHelper()
with pytest.raises(Exception):
helper.raise_exception
with pytest.raises(OutcomeException):
helper.raise_fail
def test_safe_getattr():
helper = ErrorsHelper()
assert safe_getattr(helper, 'raise_exception', 'default') == 'default'
assert safe_getattr(helper, 'raise_fail', 'default') == 'default'

View File

@@ -15,7 +15,7 @@ envlist =
{py27,py35}-{pexpect,xdist,trial,numpy}
py27-nobyte
doctesting
freeze
py35-freeze
docs
[testenv]
@@ -169,7 +169,7 @@ changedir = testing
commands =
{envpython} {envbindir}/py.test-jython -rfsxX {posargs}
[testenv:freeze]
[testenv:py35-freeze]
changedir = testing/freeze
deps = pyinstaller
commands =