Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@ env:
- TOXENV=coveralls
# note: please use "tox --listenvs" to populate the build matrix below
- TOXENV=linting
- TOXENV=py26
- TOXENV=py27
- TOXENV=py33
- TOXENV=py34
- TOXENV=py35
- TOXENV=pypy
- TOXENV=py27-pexpect
- TOXENV=py27-xdist
- TOXENV=py27-trial
Expand All @@ -32,6 +29,12 @@ env:

matrix:
include:
- env: TOXENV=py26
Copy link
Member Author

@nicoddemus nicoddemus Jul 23, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These changes are required with the migration of Travis images default from Precise to Trusty.

python: '2.6'
- env: TOXENV=py33
python: '3.3'
- env: TOXENV=pypy
python: 'pypy-5.4'
- env: TOXENV=py36
python: '3.6'
- env: TOXENV=py37
Expand Down
1 change: 1 addition & 0 deletions changelog/2588.trivial
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Turn warnings into errors in pytest's own test suite in order to catch regressions due to deprecations more promptly.
12 changes: 11 additions & 1 deletion testing/python/collect.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
)


ignore_parametrized_marks = pytest.mark.filterwarnings('ignore:Applying marks directly to parameters')


class TestModule(object):
def test_failing_import(self, testdir):
modcol = testdir.getmodulecol("import alksdjalskdjalkjals")
Expand Down Expand Up @@ -567,7 +570,8 @@ def test_overridden_via_param(value):
rec = testdir.inline_run()
rec.assertoutcome(passed=1)

def test_parametrize_with_mark(selfself, testdir):
@ignore_parametrized_marks
def test_parametrize_with_mark(self, testdir):
items = testdir.getitems("""
import pytest
@pytest.mark.foo
Expand Down Expand Up @@ -640,6 +644,7 @@ def test2(self, x, y):
assert colitems[2].name == 'test2[a-c]'
assert colitems[3].name == 'test2[b-c]'

@ignore_parametrized_marks
def test_parametrize_skipif(self, testdir):
testdir.makepyfile("""
import pytest
Expand All @@ -653,6 +658,7 @@ def test_skip_if(x):
result = testdir.runpytest()
result.stdout.fnmatch_lines('* 2 passed, 1 skipped in *')

@ignore_parametrized_marks
def test_parametrize_skip(self, testdir):
testdir.makepyfile("""
import pytest
Expand All @@ -666,6 +672,7 @@ def test_skip(x):
result = testdir.runpytest()
result.stdout.fnmatch_lines('* 2 passed, 1 skipped in *')

@ignore_parametrized_marks
def test_parametrize_skipif_no_skip(self, testdir):
testdir.makepyfile("""
import pytest
Expand All @@ -679,6 +686,7 @@ def test_skipif_no_skip(x):
result = testdir.runpytest()
result.stdout.fnmatch_lines('* 1 failed, 2 passed in *')

@ignore_parametrized_marks
def test_parametrize_xfail(self, testdir):
testdir.makepyfile("""
import pytest
Expand All @@ -692,6 +700,7 @@ def test_xfail(x):
result = testdir.runpytest()
result.stdout.fnmatch_lines('* 2 passed, 1 xfailed in *')

@ignore_parametrized_marks
def test_parametrize_passed(self, testdir):
testdir.makepyfile("""
import pytest
Expand All @@ -705,6 +714,7 @@ def test_xfail(x):
result = testdir.runpytest()
result.stdout.fnmatch_lines('* 2 passed, 1 xpassed in *')

@ignore_parametrized_marks
def test_parametrize_xfail_passed(self, testdir):
testdir.makepyfile("""
import pytest
Expand Down
3 changes: 2 additions & 1 deletion testing/python/metafunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1289,8 +1289,9 @@ def pytest_generate_tests(metafunc):
assert output.count('preparing foo-3') == 1


@pytest.mark.filterwarnings('ignore:Applying marks directly to parameters')
@pytest.mark.issue308
class TestMarkersWithParametrization(object):
pytestmark = pytest.mark.issue308

def test_simple_mark(self, testdir):
s = """
Expand Down
2 changes: 1 addition & 1 deletion testing/python/setup_only.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ def dynamically_requested_fixture():
pass
@pytest.fixture()
def dependent_fixture(request):
request.getfuncargvalue('dynamically_requested_fixture')
request.getfixturevalue('dynamically_requested_fixture')
def test_dyn(dependent_fixture):
pass
''')
Expand Down
1 change: 1 addition & 0 deletions testing/test_mark.py
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ def assert_test_is_not_selected(keyword):
marks=[pytest.mark.xfail, pytest.mark.skip], id=None)),

])
@pytest.mark.filterwarnings('ignore')
def test_parameterset_extractfrom(argval, expected):
extracted = ParameterSet.extract_from(argval)
assert extracted == expected
Expand Down
28 changes: 1 addition & 27 deletions testing/test_recwarn.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import warnings
import re
import py
import sys

import pytest
from _pytest.recwarn import WarningsRecorder
Expand Down Expand Up @@ -125,6 +124,7 @@ def f():
@pytest.mark.parametrize('warning_type', [PendingDeprecationWarning, DeprecationWarning])
@pytest.mark.parametrize('mode', ['context_manager', 'call'])
@pytest.mark.parametrize('call_f_first', [True, False])
@pytest.mark.filterwarnings('ignore')
def test_deprecated_call_modes(self, warning_type, mode, call_f_first):
"""Ensure deprecated_call() captures a deprecation warning as expected inside its
block/function.
Expand Down Expand Up @@ -170,32 +170,6 @@ def f():
with pytest.deprecated_call():
f()

def test_deprecated_function_already_called(self, testdir):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Realized that this test is already covered by test_deprecated_call_modes so it was redundant.

"""deprecated_call should be able to catch a call to a deprecated
function even if that function has already been called in the same
module. See #1190.
"""
testdir.makepyfile("""
import warnings
import pytest

def deprecated_function():
warnings.warn("deprecated", DeprecationWarning)

def test_one():
deprecated_function()

def test_two():
pytest.deprecated_call(deprecated_function)
""")
result = testdir.runpytest()
# for some reason in py26 catch_warnings manages to catch the deprecation warning
# from deprecated_function(), even with default filters active (which ignore deprecation
# warnings)
py26 = sys.version_info[:2] == (2, 6)
expected = '*=== 2 passed in *===' if not py26 else '*=== 2 passed, 1 warnings in *==='
result.stdout.fnmatch_lines(expected)


class TestWarns(object):
def test_strings(self):
Expand Down
119 changes: 57 additions & 62 deletions testing/test_unittest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ def test_simple_unittest(testdir):
import unittest
class MyTestCase(unittest.TestCase):
def testpassing(self):
self.assertEquals('foo', 'foo')
self.assertEqual('foo', 'foo')
def test_failing(self):
self.assertEquals('foo', 'bar')
self.assertEqual('foo', 'bar')
""")
reprec = testdir.inline_run(testpath)
assert reprec.matchreport("testpassing").passed
Expand All @@ -23,10 +23,10 @@ def test_runTest_method(testdir):
import unittest
class MyTestCaseWithRunTest(unittest.TestCase):
def runTest(self):
self.assertEquals('foo', 'foo')
self.assertEqual('foo', 'foo')
class MyTestCaseWithoutRunTest(unittest.TestCase):
def runTest(self):
self.assertEquals('foo', 'foo')
self.assertEqual('foo', 'foo')
def test_something(self):
pass
""")
Expand Down Expand Up @@ -59,7 +59,7 @@ def setUp(self):
def setup_method(self, method):
self.foo2 = 1
def test_both(self):
self.assertEquals(1, self.foo)
self.assertEqual(1, self.foo)
assert self.foo2 == 1
def teardown_method(self, method):
assert 0, "42"
Expand Down Expand Up @@ -136,7 +136,7 @@ def tearDown(self):
self.l.append(None)
class Second(unittest.TestCase):
def test_check(self):
self.assertEquals(MyTestCase.l, [None])
self.assertEqual(MyTestCase.l, [None])
""")
reprec = testdir.inline_run(testpath)
passed, skipped, failed = reprec.countoutcomes()
Expand Down Expand Up @@ -351,61 +351,12 @@ def test_func1(self):
reprec.assertoutcome(skipped=1)


def test_trial_testcase_skip_property(testdir):
pytest.importorskip('twisted.trial.unittest')
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
skip = 'dont run'
def test_func(self):
pass
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)


def test_trial_testfunction_skip_property(testdir):
pytest.importorskip('twisted.trial.unittest')
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
def test_func(self):
pass
test_func.skip = 'dont run'
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)


def test_trial_testcase_todo_property(testdir):
pytest.importorskip('twisted.trial.unittest')
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
todo = 'dont run'
def test_func(self):
assert 0
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)


def test_trial_testfunction_todo_property(testdir):
pytest.importorskip('twisted.trial.unittest')
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
def test_func(self):
assert 0
test_func.todo = 'dont run'
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)


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
# https://twistedmatrix.com/trac/ticket/9227
cls.ignore_unclosed_socket_warning = ('-W', 'always')

def test_trial_testcase_runtest_not_collected(self, testdir):
testdir.makepyfile("""
Expand All @@ -415,7 +366,7 @@ class TC(TestCase):
def test_hello(self):
pass
""")
reprec = testdir.inline_run()
reprec = testdir.inline_run(*self.ignore_unclosed_socket_warning)
reprec.assertoutcome(passed=1)
testdir.makepyfile("""
from twisted.trial.unittest import TestCase
Expand All @@ -424,7 +375,7 @@ class TC(TestCase):
def runTest(self):
pass
""")
reprec = testdir.inline_run()
reprec = testdir.inline_run(*self.ignore_unclosed_socket_warning)
reprec.assertoutcome(passed=1)

def test_trial_exceptions_with_skips(self, testdir):
Expand Down Expand Up @@ -462,7 +413,7 @@ def test_method(self):
""")
from _pytest.compat import _is_unittest_unexpected_success_a_failure
should_fail = _is_unittest_unexpected_success_a_failure()
result = testdir.runpytest("-rxs")
result = testdir.runpytest("-rxs", *self.ignore_unclosed_socket_warning)
result.stdout.fnmatch_lines_random([
"*XFAIL*test_trial_todo*",
"*trialselfskip*",
Expand Down Expand Up @@ -537,6 +488,50 @@ def test_hello(self):
child.expect("hellopdb")
child.sendeof()

def test_trial_testcase_skip_property(self, testdir):
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
skip = 'dont run'
def test_func(self):
pass
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)

def test_trial_testfunction_skip_property(self, testdir):
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
def test_func(self):
pass
test_func.skip = 'dont run'
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)

def test_trial_testcase_todo_property(self, testdir):
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
todo = 'dont run'
def test_func(self):
assert 0
""")
reprec = testdir.inline_run(testpath, "-s")
reprec.assertoutcome(skipped=1)

def test_trial_testfunction_todo_property(self, testdir):
testpath = testdir.makepyfile("""
from twisted.trial import unittest
class MyTestCase(unittest.TestCase):
def test_func(self):
assert 0
test_func.todo = 'dont run'
""")
reprec = testdir.inline_run(testpath, "-s", *self.ignore_unclosed_socket_warning)
reprec.assertoutcome(skipped=1)


def test_djangolike_testcase(testdir):
# contributed from Morten Breekevold
Expand Down Expand Up @@ -598,7 +593,7 @@ def test_unittest_not_shown_in_traceback(testdir):
class t(unittest.TestCase):
def test_hello(self):
x = 3
self.assertEquals(x, 4)
self.assertEqual(x, 4)
""")
res = testdir.runpytest()
assert "failUnlessEqual" not in res.stdout.str()
Expand Down
4 changes: 4 additions & 0 deletions testing/test_warnings.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def test_func():
})


@pytest.mark.filterwarnings('always')
def test_normal_flow(testdir, pyfile_with_warnings):
"""
Check that the warnings section is displayed, containing test node ids followed by
Expand All @@ -54,6 +55,7 @@ def test_normal_flow(testdir, pyfile_with_warnings):
assert result.stdout.str().count('test_normal_flow.py::test_func') == 1


@pytest.mark.filterwarnings('always')
def test_setup_teardown_warnings(testdir, pyfile_with_warnings):
testdir.makepyfile('''
import warnings
Expand Down Expand Up @@ -115,6 +117,7 @@ def test_ignore(testdir, pyfile_with_warnings, method):

@pytest.mark.skipif(sys.version_info < (3, 0),
reason='warnings message is unicode is ok in python3')
@pytest.mark.filterwarnings('always')
def test_unicode(testdir, pyfile_with_warnings):
testdir.makepyfile('''
# -*- coding: utf8 -*-
Expand Down Expand Up @@ -152,6 +155,7 @@ def fix():
warnings.warn(u"测试")
yield

@pytest.mark.filterwarnings('always')
def test_func(fix):
pass
''')
Expand Down
Loading