Accepting request 688847 from home:jayvdb:branches:devel:languages:python:pytest
- Downgrade Faker dependency to Recommends - Add Suggests for numpy - Add tests-restore-python2.7.patch to re-add support for Python 2.7 - Use PYTHONDONTWRITEBYTECODE=true to fix file-contains-buildroot on Leap 42.3 - Update to v2.1.1 * Fix including tests in sdist after re-arrangement in 2.1.0 - from v2.1.0 * Add the option --randomly-seed=last to reuse the last used value for the seed - from v2.0.0 * Drop Python 2 support, only Python 3.4+ is supported now - Make sure we execute tests - Initial version for v1.2.3 OBS-URL: https://build.opensuse.org/request/show/688847 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:pytest/python-pytest-randomly?expand=0&rev=5
This commit is contained in:
parent
30d3fe70d5
commit
af3225e5d7
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:92ec6745d3ebdd690ecb598648748c9601f16f5afacf83ccef2b50d23e6edb7f
|
|
||||||
size 8297
|
|
3
pytest-randomly-2.1.1.tar.gz
Normal file
3
pytest-randomly-2.1.1.tar.gz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:0ff564fabb638ab52d535d8ce1da71353c7ecd54edcc5dc117f6f21f8269cfef
|
||||||
|
size 9064
|
@ -1,3 +1,19 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Mar 26 10:08:08 UTC 2019 - John Vandenberg <jayvdb@gmail.com>
|
||||||
|
|
||||||
|
- Downgrade Faker dependency to Recommends
|
||||||
|
- Add Suggests for numpy
|
||||||
|
- Add tests-restore-python2.7.patch to re-add support for Python 2.7
|
||||||
|
- Use PYTHONDONTWRITEBYTECODE=true to fix file-contains-buildroot
|
||||||
|
on Leap 42.3
|
||||||
|
- Update to v2.1.1
|
||||||
|
* Fix including tests in sdist after re-arrangement in 2.1.0
|
||||||
|
- from v2.1.0
|
||||||
|
* Add the option --randomly-seed=last to reuse the last used value
|
||||||
|
for the seed
|
||||||
|
- from v2.0.0
|
||||||
|
* Drop Python 2 support, only Python 3.4+ is supported now
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Feb 14 15:24:04 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>
|
Thu Feb 14 15:24:04 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>
|
||||||
|
|
||||||
@ -6,4 +22,4 @@ Thu Feb 14 15:24:04 UTC 2019 - Tomáš Chvátal <tchvatal@suse.com>
|
|||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Jan 21 03:52:33 UTC 2019 - Todd R <toddrme2178@gmail.com>
|
Mon Jan 21 03:52:33 UTC 2019 - Todd R <toddrme2178@gmail.com>
|
||||||
|
|
||||||
- Initial version
|
- Initial version for v1.2.3
|
||||||
|
@ -18,24 +18,28 @@
|
|||||||
|
|
||||||
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
|
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
|
||||||
Name: python-pytest-randomly
|
Name: python-pytest-randomly
|
||||||
Version: 1.2.3
|
Version: 2.1.1
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Pytest plugin to randomly order tests and control random.seed
|
Summary: Pytest plugin to randomly order tests and control random.seed
|
||||||
License: BSD-3-Clause
|
License: BSD-3-Clause
|
||||||
Group: Development/Languages/Python
|
Group: Development/Languages/Python
|
||||||
URL: https://github.com/adamchainz/pytest-randomly
|
URL: https://github.com/adamchainz/pytest-randomly
|
||||||
Source: https://files.pythonhosted.org/packages/source/p/pytest-randomly/pytest-randomly-%{version}.tar.gz
|
Source: https://files.pythonhosted.org/packages/source/p/pytest-randomly/pytest-randomly-%{version}.tar.gz
|
||||||
|
# Reverse of https://github.com/pytest-dev/pytest-randomly/commit/7ca48ad.patch
|
||||||
|
Patch0: tests-restore-python2.7.patch
|
||||||
BuildRequires: %{python_module setuptools}
|
BuildRequires: %{python_module setuptools}
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
BuildRequires: python-rpm-macros
|
BuildRequires: python-rpm-macros
|
||||||
Requires: python-Faker
|
|
||||||
Requires: python-pytest
|
Requires: python-pytest
|
||||||
|
Recommends: python-Faker
|
||||||
|
Suggests: python-numpy
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
# SECTION test requirements
|
# SECTION test requirements
|
||||||
BuildRequires: %{python_module Faker}
|
BuildRequires: %{python_module Faker}
|
||||||
BuildRequires: %{python_module factory_boy}
|
BuildRequires: %{python_module factory_boy}
|
||||||
BuildRequires: %{python_module numpy}
|
BuildRequires: %{python_module numpy}
|
||||||
BuildRequires: %{python_module pytest}
|
BuildRequires: %{python_module pytest}
|
||||||
|
BuildRequires: %{python_module six}
|
||||||
# /SECTION
|
# /SECTION
|
||||||
%python_subpackages
|
%python_subpackages
|
||||||
|
|
||||||
@ -61,6 +65,9 @@ Features:
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n pytest-randomly-%{version}
|
%setup -q -n pytest-randomly-%{version}
|
||||||
|
%patch0 -p1
|
||||||
|
# Disregard Python 3.4+ restriction
|
||||||
|
sed -i '/python_requires/d' setup.py
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%python_build
|
%python_build
|
||||||
@ -70,6 +77,7 @@ Features:
|
|||||||
%python_expand %fdupes %{buildroot}%{$python_sitelib}
|
%python_expand %fdupes %{buildroot}%{$python_sitelib}
|
||||||
|
|
||||||
%check
|
%check
|
||||||
|
export PYTHONDONTWRITEBYTECODE=true
|
||||||
%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} py.test-%{$python_bin_suffix} -v
|
%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} py.test-%{$python_bin_suffix} -v
|
||||||
|
|
||||||
%files %{python_files}
|
%files %{python_files}
|
||||||
|
604
test_pytest_randomly.py
Normal file
604
test_pytest_randomly.py
Normal file
@ -0,0 +1,604 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
pytest_plugins = ['pytester']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def ourtestdir(testdir):
|
||||||
|
testdir.tmpdir.join('pytest.ini').write(
|
||||||
|
'[pytest]\n'
|
||||||
|
'console_output_style = classic'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Change from default running pytest in-process to running in a subprocess
|
||||||
|
# because numpy imports break with weird:
|
||||||
|
# File ".../site-packages/numpy/core/overrides.py", line 204, in decorator
|
||||||
|
# add_docstring(implementation, dispatcher.__doc__)
|
||||||
|
# RuntimeError: empty_like method already has a docstring
|
||||||
|
testdir._runpytest_method = testdir.runpytest_subprocess
|
||||||
|
|
||||||
|
yield testdir
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def simpletestdir(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def test_a():
|
||||||
|
assert True
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
yield ourtestdir
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_reports_a_header_when_not_set(simpletestdir):
|
||||||
|
out = simpletestdir.runpytest()
|
||||||
|
assert len([
|
||||||
|
x for x in out.outlines if x.startswith('Using --randomly-seed=')
|
||||||
|
]) == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_reports_a_header_when_set(simpletestdir):
|
||||||
|
out = simpletestdir.runpytest('--randomly-seed=10')
|
||||||
|
lines = [x for x in out.outlines if x.startswith('Using --randomly-seed=')]
|
||||||
|
assert lines == [
|
||||||
|
'Using --randomly-seed=10'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_reuses_the_same_random_seed_per_test(ourtestdir):
|
||||||
|
"""
|
||||||
|
Run a pair of tests that generate the a number and then assert they got
|
||||||
|
what the other did.
|
||||||
|
"""
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
|
||||||
|
def test_a():
|
||||||
|
test_a.num = random.random()
|
||||||
|
if hasattr(test_b, 'num'):
|
||||||
|
assert test_a.num == test_b.num
|
||||||
|
|
||||||
|
def test_b():
|
||||||
|
test_b.num = random.random()
|
||||||
|
if hasattr(test_a, 'num'):
|
||||||
|
assert test_b.num == test_a.num
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest('--randomly-dont-reorganize')
|
||||||
|
out.assert_outcomes(passed=2, failed=0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_using_last_seed(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def test_a():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest()
|
||||||
|
out.assert_outcomes(passed=1, failed=0)
|
||||||
|
seed_line = [x for x in out.stdout.lines if x.startswith('Using --randomly-seed=')][0]
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=last')
|
||||||
|
out.assert_outcomes(passed=1, failed=0)
|
||||||
|
out.stdout.fnmatch_lines([seed_line])
|
||||||
|
|
||||||
|
|
||||||
|
def test_using_last_explicit_seed(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def test_a():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=33')
|
||||||
|
out.assert_outcomes(passed=1, failed=0)
|
||||||
|
out.stdout.fnmatch_lines(['Using --randomly-seed=33'])
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=last')
|
||||||
|
out.assert_outcomes(passed=1, failed=0)
|
||||||
|
out.stdout.fnmatch_lines(['Using --randomly-seed=33'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_passing_nonsense_for_randomly_seed(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def test_a():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=invalidvalue')
|
||||||
|
assert out.ret != 0
|
||||||
|
out.stderr.fnmatch_lines([
|
||||||
|
"pytest.py: error: argument --randomly-seed: 'invalidvalue' is not an integer or the string 'last'"
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_resets_the_random_seed_at_the_start_of_test_classes(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
class A(TestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(A, cls).setUpClass()
|
||||||
|
cls.suc_num = random.random()
|
||||||
|
assert cls.suc_num == getattr(B, 'suc_num', cls.suc_num)
|
||||||
|
|
||||||
|
def test_fake(self):
|
||||||
|
assert True
|
||||||
|
|
||||||
|
|
||||||
|
class B(TestCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(B, cls).setUpClass()
|
||||||
|
cls.suc_num = random.random()
|
||||||
|
assert cls.suc_num == getattr(A, 'suc_num', cls.suc_num)
|
||||||
|
|
||||||
|
def test_fake(self):
|
||||||
|
assert True
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest()
|
||||||
|
out.assert_outcomes(passed=2, failed=0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_resets_the_random_seed_at_the_end_of_test_classes(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
class A(TestCase):
|
||||||
|
|
||||||
|
def test_fake(self):
|
||||||
|
assert True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
super(A, cls).tearDownClass()
|
||||||
|
cls.suc_num = random.random()
|
||||||
|
assert cls.suc_num == getattr(B, 'suc_num', cls.suc_num)
|
||||||
|
|
||||||
|
|
||||||
|
class B(TestCase):
|
||||||
|
|
||||||
|
def test_fake(self):
|
||||||
|
assert True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
super(B, cls).tearDownClass()
|
||||||
|
cls.suc_num = random.random()
|
||||||
|
assert cls.suc_num == getattr(A, 'suc_num', cls.suc_num)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest()
|
||||||
|
out.assert_outcomes(passed=2, failed=0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_the_same_random_seed_per_test_can_be_turned_off(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
|
||||||
|
def test_a():
|
||||||
|
test_a.state1 = random.getstate()
|
||||||
|
assert test_a.state1 == random.getstate() # sanity check
|
||||||
|
assert random.random() >= 0 # mutate state
|
||||||
|
test_a.state2 = random.getstate()
|
||||||
|
|
||||||
|
def test_b():
|
||||||
|
test_b.state = random.getstate()
|
||||||
|
assert test_b.state == random.getstate() # sanity check
|
||||||
|
assert test_a.state1 != test_b.state
|
||||||
|
assert test_a.state2 == test_b.state
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest(
|
||||||
|
'--randomly-dont-reset-seed', '--randomly-dont-reorganize',
|
||||||
|
)
|
||||||
|
out.assert_outcomes(passed=2, failed=0)
|
||||||
|
|
||||||
|
|
||||||
|
def test_files_reordered(ourtestdir):
|
||||||
|
code = """
|
||||||
|
def test_it():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_a=code,
|
||||||
|
test_b=code,
|
||||||
|
test_c=code,
|
||||||
|
test_d=code,
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_d.py::test_it PASSED',
|
||||||
|
'test_c.py::test_it PASSED',
|
||||||
|
'test_a.py::test_it PASSED',
|
||||||
|
'test_b.py::test_it PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_files_reordered_when_seed_not_reset(ourtestdir):
|
||||||
|
code = """
|
||||||
|
def test_it():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_a=code,
|
||||||
|
test_b=code,
|
||||||
|
test_c=code,
|
||||||
|
test_d=code,
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
args.append('--randomly-dont-reset-seed')
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_d.py::test_it PASSED',
|
||||||
|
'test_c.py::test_it PASSED',
|
||||||
|
'test_a.py::test_it PASSED',
|
||||||
|
'test_b.py::test_it PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_classes_reordered(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
|
||||||
|
class A(TestCase):
|
||||||
|
def test_a(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class B(TestCase):
|
||||||
|
def test_b(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class C(TestCase):
|
||||||
|
def test_c(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class D(TestCase):
|
||||||
|
def test_d(self):
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_one.py::D::test_d PASSED',
|
||||||
|
'test_one.py::C::test_c PASSED',
|
||||||
|
'test_one.py::A::test_a PASSED',
|
||||||
|
'test_one.py::B::test_b PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_class_test_methods_reordered(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
from unittest import TestCase
|
||||||
|
|
||||||
|
class T(TestCase):
|
||||||
|
def test_a(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_b(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_c(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_d(self):
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_one.py::T::test_d PASSED',
|
||||||
|
'test_one.py::T::test_c PASSED',
|
||||||
|
'test_one.py::T::test_a PASSED',
|
||||||
|
'test_one.py::T::test_b PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_functions_reordered(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def test_a():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_b():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_c():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_d():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_one.py::test_d PASSED',
|
||||||
|
'test_one.py::test_c PASSED',
|
||||||
|
'test_one.py::test_a PASSED',
|
||||||
|
'test_one.py::test_b PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_test_functions_reordered_when_randomness_in_module(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
|
||||||
|
random.seed(time.time() * 100)
|
||||||
|
|
||||||
|
def test_a():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_b():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_c():
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_d():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v', '--randomly-seed=15']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
out.assert_outcomes(passed=4, failed=0)
|
||||||
|
assert out.outlines[8:12] == [
|
||||||
|
'test_one.py::test_d PASSED',
|
||||||
|
'test_one.py::test_c PASSED',
|
||||||
|
'test_one.py::test_a PASSED',
|
||||||
|
'test_one.py::test_b PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_doctests_reordered(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
def foo():
|
||||||
|
'''
|
||||||
|
>>> foo()
|
||||||
|
9001
|
||||||
|
'''
|
||||||
|
return 9001
|
||||||
|
|
||||||
|
def bar():
|
||||||
|
'''
|
||||||
|
>>> bar()
|
||||||
|
9002
|
||||||
|
'''
|
||||||
|
return 9002
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v', '--doctest-modules', '--randomly-seed=5']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
assert out.outlines[8:10] == [
|
||||||
|
'test_one.py::test_one.bar PASSED',
|
||||||
|
'test_one.py::test_one.foo PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_it_works_with_the_simplest_test_items(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
conftest="""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
class MyCollector(pytest.Collector):
|
||||||
|
def __init__(self, fspath, items, **kwargs):
|
||||||
|
super(MyCollector, self).__init__(fspath, **kwargs)
|
||||||
|
self.items = items
|
||||||
|
|
||||||
|
def collect(self):
|
||||||
|
return self.items
|
||||||
|
|
||||||
|
|
||||||
|
class NoOpItem(pytest.Item):
|
||||||
|
def __init__(self, path, parent, module=None):
|
||||||
|
super(NoOpItem, self).__init__(path, parent)
|
||||||
|
if module is not None:
|
||||||
|
self.module = module
|
||||||
|
|
||||||
|
def runtest(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_collect_file(path, parent):
|
||||||
|
if not str(path).endswith('.py'):
|
||||||
|
return
|
||||||
|
return MyCollector(
|
||||||
|
fspath=str(path),
|
||||||
|
items=[
|
||||||
|
NoOpItem(str(path), parent, 'foo'),
|
||||||
|
NoOpItem(str(path), parent),
|
||||||
|
],
|
||||||
|
parent=parent,
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['-v']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
|
||||||
|
|
||||||
|
def test_doctests_in_txt_files_reordered(ourtestdir):
|
||||||
|
ourtestdir.tmpdir.join('test.txt').write('''\
|
||||||
|
>>> 2 + 2
|
||||||
|
4
|
||||||
|
''')
|
||||||
|
ourtestdir.tmpdir.join('test2.txt').write('''\
|
||||||
|
>>> 2 - 2
|
||||||
|
0
|
||||||
|
''')
|
||||||
|
args = ['-v', '--randomly-seed=1']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
assert out.outlines[8:10] == [
|
||||||
|
'test2.txt::test2.txt PASSED',
|
||||||
|
'test.txt::test.txt PASSED',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_fixtures_get_different_random_state_to_tests(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def myfixture():
|
||||||
|
return random.getstate()
|
||||||
|
|
||||||
|
|
||||||
|
def test_one(myfixture):
|
||||||
|
assert myfixture != random.getstate()
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
out = ourtestdir.runpytest()
|
||||||
|
out.assert_outcomes(passed=1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_fixtures_dont_interfere_with_tests_getting_same_random_state(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import random
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
random.seed(2)
|
||||||
|
state_at_seed_two = random.getstate()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='module')
|
||||||
|
def myfixture():
|
||||||
|
return random.random()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.one()
|
||||||
|
def test_one(myfixture):
|
||||||
|
assert random.getstate() == state_at_seed_two
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.two()
|
||||||
|
def test_two(myfixture):
|
||||||
|
assert random.getstate() == state_at_seed_two
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
args = ['--randomly-seed=2']
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('-m', 'one', *args)
|
||||||
|
out.assert_outcomes(passed=1)
|
||||||
|
out = ourtestdir.runpytest('-m', 'two', *args)
|
||||||
|
out.assert_outcomes(passed=1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_factory_boy(ourtestdir):
|
||||||
|
"""
|
||||||
|
Rather than set up factories etc., just check the random generator it uses
|
||||||
|
is set between two tests to output the same number.
|
||||||
|
"""
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
from factory.random import randgen
|
||||||
|
|
||||||
|
def test_a():
|
||||||
|
test_a.num = randgen.random()
|
||||||
|
if hasattr(test_b, 'num'):
|
||||||
|
assert test_a.num == test_b.num
|
||||||
|
|
||||||
|
def test_b():
|
||||||
|
test_b.num = randgen.random()
|
||||||
|
if hasattr(test_a, 'num'):
|
||||||
|
assert test_b.num == test_a.num
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=1')
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
|
||||||
|
|
||||||
|
def test_faker(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
from faker import Faker
|
||||||
|
|
||||||
|
fake = Faker()
|
||||||
|
|
||||||
|
def test_one():
|
||||||
|
assert fake.name() == 'Ryan Gallagher'
|
||||||
|
|
||||||
|
def test_two():
|
||||||
|
assert fake.name() == 'Ryan Gallagher'
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=1')
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
|
||||||
|
|
||||||
|
def test_numpy(ourtestdir):
|
||||||
|
ourtestdir.makepyfile(
|
||||||
|
test_one="""
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def test_one():
|
||||||
|
assert np.random.rand() == 0.417022004702574
|
||||||
|
|
||||||
|
def test_two():
|
||||||
|
assert np.random.rand() == 0.417022004702574
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest('--randomly-seed=1')
|
||||||
|
out.assert_outcomes(passed=2)
|
121
tests-restore-python2.7.patch
Normal file
121
tests-restore-python2.7.patch
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
--- a/test_pytest_randomly.py
|
||||||
|
+++ b/test_pytest_randomly.py
|
||||||
|
@@ -1,6 +1,13 @@
|
||||||
|
+# -*- encoding:utf-8 -*-
|
||||||
|
+from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
|
+
|
||||||
|
import pytest
|
||||||
|
+import six
|
||||||
|
|
||||||
|
-pytest_plugins = ['pytester']
|
||||||
|
+if six.PY3:
|
||||||
|
+ pytest_plugins = ['pytester']
|
||||||
|
+else:
|
||||||
|
+ pytest_plugins = [b'pytester']
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
@@ -221,7 +228,11 @@
|
||||||
|
test_c=code,
|
||||||
|
test_d=code,
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
@@ -245,7 +256,11 @@
|
||||||
|
test_c=code,
|
||||||
|
test_d=code,
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
args.append('--randomly-dont-reset-seed')
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
@@ -285,7 +300,11 @@
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
@@ -317,7 +336,11 @@
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
@@ -346,7 +369,11 @@
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
@@ -380,7 +407,11 @@
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
- args = ['-v', '--randomly-seed=15']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=15')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=41')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
|
||||||
|
@@ -411,7 +442,11 @@
|
||||||
|
return 9002
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
- args = ['-v', '--doctest-modules', '--randomly-seed=5']
|
||||||
|
+ args = ['-v', '--doctest-modules']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=5')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=2')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
||||||
|
@@ -474,7 +509,11 @@
|
||||||
|
>>> 2 - 2
|
||||||
|
0
|
||||||
|
''')
|
||||||
|
- args = ['-v', '--randomly-seed=1']
|
||||||
|
+ args = ['-v']
|
||||||
|
+ if six.PY3: # Python 3 random changes
|
||||||
|
+ args.append('--randomly-seed=1')
|
||||||
|
+ else:
|
||||||
|
+ args.append('--randomly-seed=4')
|
||||||
|
|
||||||
|
out = ourtestdir.runpytest(*args)
|
||||||
|
out.assert_outcomes(passed=2)
|
Loading…
x
Reference in New Issue
Block a user