From 858d5adb281936179f8f0d85d3d12aaaeaf15978 Mon Sep 17 00:00:00 2001 From: starlet-dx <15929766099@163.com> Date: Fri, 29 Apr 2022 15:50:57 +0800 Subject: [PATCH] Update to 0.8.1 and remove python-nose --- parameterized-0.7.4.tar.gz | Bin 23389 -> 0 bytes parameterized-0.8.1.tar.gz | Bin 0 -> 23936 bytes parameterized-pr116-pytest4.patch | 537 ++++++++++++++++++++++++++++++ python-parameterized.spec | 13 +- remove_nose.patch | 123 +++++++ 5 files changed, 667 insertions(+), 6 deletions(-) delete mode 100644 parameterized-0.7.4.tar.gz create mode 100644 parameterized-0.8.1.tar.gz create mode 100644 parameterized-pr116-pytest4.patch create mode 100644 remove_nose.patch diff --git a/parameterized-0.7.4.tar.gz b/parameterized-0.7.4.tar.gz deleted file mode 100644 index 0c3a43987ed3444e8140ca60be4b20ea42a72585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23389 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 Y{i#3or~cHR`jh|s|Dr3hwg4~!0NYDT{Qv*} diff --git a/parameterized-0.8.1.tar.gz b/parameterized-0.8.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..05f6972df6a39d909fbaf995d3f66cc198b6987a GIT binary patch literal 23936 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 J6!QQu0stYycXa>& literal 0 HcmV?d00001 diff --git a/parameterized-pr116-pytest4.patch b/parameterized-pr116-pytest4.patch new file mode 100644 index 0000000..750b150 --- /dev/null +++ b/parameterized-pr116-pytest4.patch @@ -0,0 +1,537 @@ +From 674f23824328709562303941e9546097b360b4fc Mon Sep 17 00:00:00 2001 +From: David Wolever +Date: Sat, 9 Jan 2021 16:00:47 -0500 +Subject: [PATCH 1/6] Enable pytest4 (tests will fail) + +--- + tox.ini | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: parameterized-0.8.1/tox.ini +=================================================================== +--- parameterized-0.8.1.orig/tox.ini ++++ parameterized-0.8.1/tox.ini +@@ -1,5 +1,5 @@ + [tox] +-envlist=py{27,35,36,py}-{nose,nose2,pytest2,pytest3,unit,unit2},py{37,38,39}-{nose,nose2,pytest3,unit,unit2} ++envlist=py{27,35,36,py}-{nose,nose2,pytest2,pytest3,pytest4,unit,unit2},py{37,38,39}-{nose,nose2,pytest3,pytest4,unit,unit2} + [testenv] + deps= + nose +@@ -7,13 +7,13 @@ deps= + nose2: nose2 + pytest2: pytest>=2,<3 + pytest3: pytest>=3,<4 +- #pytest4: pytest>=4,<5 ++ pytest4: pytest>=4,<5 + unit2: unittest2 + commands= + nose: nosetests + nose2: nose2 + pytest2: py.test parameterized/test.py + pytest3: py.test parameterized/test.py +- #pytest4: py.test parameterized/test.py ++ pytest4: py.test parameterized/test.py + unit: python -m unittest parameterized.test + unit2: unit2 parameterized.test +Index: parameterized-0.8.1/parameterized/parameterized.py +=================================================================== +--- parameterized-0.8.1.orig/parameterized/parameterized.py ++++ parameterized-0.8.1/parameterized/parameterized.py +@@ -19,9 +19,14 @@ except ImportError: + class SkipTest(Exception): + pass + ++try: ++ import pytest ++except ImportError: ++ pytest = None ++ + PY3 = sys.version_info[0] == 3 + PY2 = sys.version_info[0] == 2 +- ++PYTEST4 = pytest and pytest.__version__ >= '4.0.0' + + if PY3: + # Python 3 doesn't have an InstanceType, so just use a dummy type. +@@ -352,6 +357,120 @@ class parameterized(object): + def __call__(self, test_func): + self.assert_not_in_testcase_subclass() + ++ input = self.get_input() ++ wrapper = self._wrap_test_func(test_func, input) ++ wrapper.parameterized_input = input ++ wrapper.parameterized_func = test_func ++ test_func.__name__ = "_parameterized_original_%s" %(test_func.__name__, ) ++ ++ return wrapper ++ ++ def _wrap_test_func(self, test_func, input): ++ """ Wraps a test function so that it will appropriately handle ++ parameterization. ++ ++ In the general case, the wrapper will enumerate the input, yielding ++ test cases. ++ ++ In the case of pytest4, the wrapper will use ++ ``@pytest.mark.parametrize`` to parameterize the test function. """ ++ ++ if not input: ++ if not self.skip_on_empty: ++ raise ValueError( ++ "Parameters iterable is empty (hint: use " ++ "`parameterized([], skip_on_empty=True)` to skip " ++ "this test when the input is empty)" ++ ) ++ return wraps(test_func)(skip_on_empty_helper) ++ ++ if PYTEST4 and detect_runner() == "pytest": ++ # pytest >= 4 compatibility is... a bit of work. Basically, the ++ # only way (I can find) of implementing parameterized testing with ++ # pytest >= 4 is through the ``@pytest.mark.parameterized`` ++ # decorator. This decorator has some strange requirements around ++ # the name and number of arguments to the test function, so this ++ # wrapper works around that by: ++ # 1. Introspecting the original test function to determine the ++ # names and default values of all arguments. ++ # 2. Creating a new function with the same arguments, but none ++ # of them are optional:: ++ # ++ # def foo(a, b=42): ... ++ # ++ # Becomes: ++ # ++ # def parameterized_pytest_wrapper_foo(a, b): ... ++ # ++ # 3. Merging the ``@parameterized`` parameters with the argument ++ # default values. ++ # 4. Generating a list of ``pytest.param(...)`` values, and passing ++ # that into ``@pytest.mark.parameterized``. ++ # Some work also needs to be done to support the documented usage ++ # of ``mock.patch``, which also adds complexity. ++ Undefined = object() ++ test_func_wrapped = test_func ++ test_func_real, mock_patchings = unwrap_mock_patch_func(test_func_wrapped) ++ func_argspec = getargspec(test_func_real) ++ ++ func_args = func_argspec.args ++ if mock_patchings: ++ func_args = func_args[:-len(mock_patchings)] ++ ++ func_args_no_self = func_args ++ if func_args_no_self[:1] == ["self"]: ++ func_args_no_self = func_args_no_self[1:] ++ ++ args_with_default = dict( ++ (arg, Undefined) ++ for arg in func_args_no_self ++ ) ++ for (arg, default) in zip(reversed(func_args_no_self), reversed(func_argspec.defaults or [])): ++ args_with_default[arg] = default ++ ++ pytest_params = [] ++ for i in input: ++ p = dict(args_with_default) ++ for (arg, val) in zip(func_args_no_self, i.args): ++ p[arg] = val ++ p.update(i.kwargs) ++ ++ # Sanity check: all arguments should now be defined ++ if any(v is Undefined for v in p.values()): ++ raise ValueError( ++ "When parameterizing function %r: no value for " ++ "arguments: %s with parameters %r " ++ "(see: 'no value for arguments' in " ++ "https://github.com/wolever/parameterized#faq)" %( ++ test_func, ++ ", ".join( ++ repr(arg) ++ for (arg, val) in p.items() ++ if val is Undefined ++ ), ++ i, ++ ) ++ ) ++ ++ pytest_params.append(pytest.param(*[ ++ p.get(arg) for arg in func_args_no_self ++ ])) ++ ++ namespace = { ++ "__parameterized_original_test_func": test_func_wrapped, ++ } ++ wrapper_name = "parameterized_pytest_wrapper_%s" %(test_func.__name__, ) ++ exec( ++ "def %s(%s, *__args): return __parameterized_original_test_func(%s, *__args)" %( ++ wrapper_name, ++ ",".join(func_args), ++ ",".join(func_args), ++ ), ++ namespace, ++ namespace, ++ ) ++ return pytest.mark.parametrize(",".join(func_args_no_self), pytest_params)(namespace[wrapper_name]) ++ + @wraps(test_func) + def wrapper(test_self=None): + test_cls = test_self and type(test_self) +@@ -366,7 +485,7 @@ class parameterized(object): + ) %(test_self, )) + + original_doc = wrapper.__doc__ +- for num, args in enumerate(wrapper.parameterized_input): ++ for num, args in enumerate(input): + p = param.from_decorator(args) + unbound_func, nose_tuple = self.param_as_nose_tuple(test_self, test_func, num, p) + try: +@@ -383,21 +502,6 @@ class parameterized(object): + if test_self is not None: + delattr(test_cls, test_func.__name__) + wrapper.__doc__ = original_doc +- +- input = self.get_input() +- if not input: +- if not self.skip_on_empty: +- raise ValueError( +- "Parameters iterable is empty (hint: use " +- "`parameterized([], skip_on_empty=True)` to skip " +- "this test when the input is empty)" +- ) +- wrapper = wraps(test_func)(skip_on_empty_helper) +- +- wrapper.parameterized_input = input +- wrapper.parameterized_func = test_func +- test_func.__name__ = "_parameterized_original_%s" %(test_func.__name__, ) +- + return wrapper + + def param_as_nose_tuple(self, test_self, func, num, p): +@@ -618,6 +722,11 @@ def parameterized_class(attrs, input_val + + return decorator + ++def unwrap_mock_patch_func(f): ++ if not hasattr(f, "patchings"): ++ return (f, []) ++ real_func, patchings = unwrap_mock_patch_func(f.__wrapped__) ++ return (real_func, patchings + f.patchings) + + def get_class_name_suffix(params_dict): + if "name" in params_dict: +Index: parameterized-0.8.1/parameterized/test.py +=================================================================== +--- parameterized-0.8.1.orig/parameterized/test.py ++++ parameterized-0.8.1/parameterized/test.py +@@ -6,8 +6,9 @@ from unittest import TestCase + from nose.tools import assert_equal, assert_raises + + from .parameterized import ( +- PY3, PY2, parameterized, param, parameterized_argument_value_pairs, +- short_repr, detect_runner, parameterized_class, SkipTest, ++ PY3, PY2, PYTEST4, parameterized, param, ++ parameterized_argument_value_pairs, short_repr, detect_runner, ++ parameterized_class, SkipTest, + ) + + def assert_contains(haystack, needle): +@@ -40,6 +41,7 @@ def expect(skip, tests=None): + + test_params = [ + (42, ), ++ (42, "bar_val"), + "foo0", + param("foo1"), + param("foo2", bar=42), +@@ -50,6 +52,7 @@ expect("standalone", [ + "test_naked_function('foo1', bar=None)", + "test_naked_function('foo2', bar=42)", + "test_naked_function(42, bar=None)", ++ "test_naked_function(42, bar='bar_val')", + ]) + + @parameterized(test_params) +@@ -63,6 +66,7 @@ class TestParameterized(object): + "test_instance_method('foo1', bar=None)", + "test_instance_method('foo2', bar=42)", + "test_instance_method(42, bar=None)", ++ "test_instance_method(42, bar='bar_val')", + ]) + + @parameterized(test_params) +@@ -95,10 +99,16 @@ if not PYTEST: + missing_tests.remove("test_setup(%s)" %(self.actual_order, )) + + +-def custom_naming_func(custom_tag): ++def custom_naming_func(custom_tag, kw_name): + def custom_naming_func(testcase_func, param_num, param): +- return testcase_func.__name__ + ('_%s_name_' % custom_tag) + str(param.args[0]) +- ++ return ( ++ testcase_func.__name__ + ++ '_%s_name_' %(custom_tag, ) + ++ str(param.args[0]) + ++ # This ... is a bit messy, to properly handle the values in ++ # `test_params`, but ... it should work. ++ '_%s' %(param.args[1] if len(param.args) > 1 else param.kwargs.get(kw_name), ) ++ ) + return custom_naming_func + + +@@ -137,19 +147,20 @@ class TestParameterizedExpandWithMockPat + mock_fdopen._mock_name, mock_getpid._mock_name)) + + +-@mock.patch("os.getpid") +-class TestParameterizedExpandWithNoExpand(object): +- expect("generator", [ +- "test_patch_class_no_expand(42, 51, 'umask', 'getpid')", +- ]) ++if not (PYTEST4 and detect_runner() == 'pytest'): ++ @mock.patch("os.getpid") ++ class TestParameterizedExpandWithNoExpand(object): ++ expect("generator", [ ++ "test_patch_class_no_expand(42, 51, 'umask', 'getpid')", ++ ]) + +- @parameterized([(42, 51)]) +- @mock.patch("os.umask") +- def test_patch_class_no_expand(self, foo, bar, mock_umask, mock_getpid): +- missing_tests.remove("test_patch_class_no_expand" +- "(%r, %r, %r, %r)" % +- (foo, bar, mock_umask._mock_name, +- mock_getpid._mock_name)) ++ @parameterized([(42, 51)]) ++ @mock.patch("os.umask") ++ def test_patch_class_no_expand(self, foo, bar, mock_umask, mock_getpid): ++ missing_tests.remove("test_patch_class_no_expand" ++ "(%r, %r, %r, %r)" % ++ (foo, bar, mock_umask._mock_name, ++ mock_getpid._mock_name)) + + + class TestParameterizedExpandWithNoMockPatchForClass(TestCase): +@@ -214,6 +225,7 @@ class TestParamerizedOnTestCase(TestCase + "test_on_TestCase('foo1', bar=None)", + "test_on_TestCase('foo2', bar=42)", + "test_on_TestCase(42, bar=None)", ++ "test_on_TestCase(42, bar='bar_val')", + ]) + + @parameterized.expand(test_params) +@@ -221,20 +233,21 @@ class TestParamerizedOnTestCase(TestCase + missing_tests.remove("test_on_TestCase(%r, bar=%r)" %(foo, bar)) + + expect([ +- "test_on_TestCase2_custom_name_42(42, bar=None)", +- "test_on_TestCase2_custom_name_foo0('foo0', bar=None)", +- "test_on_TestCase2_custom_name_foo1('foo1', bar=None)", +- "test_on_TestCase2_custom_name_foo2('foo2', bar=42)", ++ "test_on_TestCase2_custom_name_42_None(42, bar=None)", ++ "test_on_TestCase2_custom_name_42_bar_val(42, bar='bar_val')", ++ "test_on_TestCase2_custom_name_foo0_None('foo0', bar=None)", ++ "test_on_TestCase2_custom_name_foo1_None('foo1', bar=None)", ++ "test_on_TestCase2_custom_name_foo2_42('foo2', bar=42)", + ]) + + @parameterized.expand(test_params, +- name_func=custom_naming_func("custom")) ++ name_func=custom_naming_func("custom", "bar")) + def test_on_TestCase2(self, foo, bar=None): + stack = inspect.stack() + frame = stack[1] + frame_locals = frame[0].f_locals + nose_test_method_name = frame_locals['a'][0]._testMethodName +- expected_name = "test_on_TestCase2_custom_name_" + str(foo) ++ expected_name = "test_on_TestCase2_custom_name_" + str(foo) + "_" + str(bar) + assert_equal(nose_test_method_name, expected_name, + "Test Method name '%s' did not get customized to expected: '%s'" % + (nose_test_method_name, expected_name)) +@@ -373,6 +386,8 @@ def tearDownModule(): + def test_old_style_classes(): + if PY3: + raise SkipTest("Py3 doesn't have old-style classes") ++ if PYTEST4 and detect_runner() == 'pytest': ++ raise SkipTest("We're not going to worry about old style classes with pytest 4") + class OldStyleClass: + @parameterized(["foo"]) + def parameterized_method(self, param): +@@ -552,3 +567,16 @@ class TestUnicodeDocstring(object): + def test_with_docstring(self, param): + """ Это док-стринг, содержащий не-ascii символы """ + pass ++ ++if PYTEST4 and detect_runner() == 'pytest': ++ def test_missing_argument_error(): ++ try: ++ @parameterized([ ++ (1, ), ++ ]) ++ def foo(a, b): ++ pass ++ except ValueError as e: ++ assert_contains(repr(e), "no value for arguments: 'b'") ++ else: ++ raise AssertionError("Expected exception not raised") +Index: parameterized-0.8.1/README.rst +=================================================================== +--- parameterized-0.8.1.orig/README.rst ++++ parameterized-0.8.1/README.rst +@@ -9,11 +9,9 @@ Parameterized testing with any Python te + :alt: Circle CI + :target: https://circleci.com/gh/wolever/parameterized + +- +-Parameterized testing in Python sucks. +- +-``parameterized`` fixes that. For everything. Parameterized testing for nose, +-parameterized testing for py.test, parameterized testing for unittest. ++``parameterized`` provides universal parameterized testing for Python: ++parameterized testing for nose, parameterized testing for py.test, ++parameterized testing for unittest, parameterized testing for Django. + + .. code:: python + +@@ -131,7 +129,7 @@ With unittest (and unittest2):: + (note: because unittest does not support test decorators, only tests created + with ``@parameterized.expand`` will be executed) + +-With green:: ++With `green`__ :: + + $ green test_math.py -vvv + test_math +@@ -161,6 +159,7 @@ With green:: + + OK (passes=9) + ++__ https://github.com/CleanCut/green + + Installation + ------------ +@@ -237,16 +236,16 @@ __ https://travis-ci.org/wolever/paramet + - yes + - yes + * - py.test 4 +- - no** +- - no** +- - no** +- - no** +- - no** +- - no** +- - no** +- - no** +- - no** +- - no** ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes ++ - yes + * - py.test fixtures + - no† + - no† +@@ -285,8 +284,6 @@ __ https://travis-ci.org/wolever/paramet + + \*: py.test 2 does `does not appear to work (#71)`__ under Python 3. Please comment on the related issues if you are affected. + +-\*\*: py.test 4 is not yet supported (but coming!) in `issue #34`__ +- + †: py.test fixture support is documented in `issue #81`__ + + __ https://github.com/wolever/parameterized/issues/71 +@@ -575,7 +572,6 @@ which controls the name of the parameter + test_concat (test_concat.TestConcatenation_0_say_cheese__) ... ok + + +- + Using with Single Parameters + ............................ + +@@ -616,15 +612,42 @@ can be confusing. The ``@mock.patch(...) + + .. code:: python + +- @mock.patch("os.getpid") + class TestOS(object): + @parameterized(...) + @mock.patch("os.fdopen") + @mock.patch("os.umask") +- def test_method(self, param1, param2, ..., mock_umask, mock_fdopen, mock_getpid): ++ def test_method(self, param1, param2, ..., mock_umask, mock_fdopen): + ... + +-Note: the same holds true when using ``@parameterized.expand``. ++Note 1: the same holds true when using ``@parameterized.expand``. ++ ++Note 2: ``@mock.patch`` is supported with all runners, including ``pytest``, ++*except* when used as a *class decorator* with ``pytest>=4``. ++ ++Parameterized testing with Django ++................................. ++ ++``parameterized`` enables parameterized testing with Django with ++``@parameterized.expand``:: ++ ++ from django.test import TestCase ++ ++ class DjangoTestCase(TestCase): ++ @parameterized.expand([ ++ ("negative", -1.5, -2.0), ++ ("integer", 1, 1.0), ++ ("large fraction", 1.6, 1), ++ ]) ++ def test_floor(self, name, input, expected): ++ assert_equal(math.floor(input), expected) ++ ++Which will yield:: ++ ++ $ python manage.py test ++ ... ++ test_floor_0_negative (test_math.DjangoTestCase) ... ok ++ test_floor_1_integer (test_math.DjangoTestCase) ... ok ++ test_floor_2_large_fraction (test_math.DjangoTestCase) ... ok + + + Migrating from ``nose-parameterized`` to ``parameterized`` +@@ -650,7 +673,7 @@ What happened to ``nose-parameterized``? + only made sense to change the name! + + What do you mean when you say "nose is best supported"? +- There are small caveates with ``py.test`` and ``unittest``: ``py.test`` ++ There are small caveats with ``py.test`` and ``unittest``: ``py.test`` + does not show the parameter values (ex, it will show ``test_add[0]`` + instead of ``test_add[1, 2, 3]``), and ``unittest``/``unittest2`` do not + support test generators so ``@parameterized.expand`` must be used. +@@ -664,3 +687,26 @@ Why do I get an ``AttributeError: 'funct + You've likely installed the ``parametrized`` (note the missing *e*) + package. Use ``parameterized`` (with the *e*) instead and you'll be all + set. ++ ++What is the ``no value for arguments`` error when using ``pytest>=4``? ++ The ``no value for arguments`` error occurs with ``pytest>=4`` when the ++ parameters for a method do not supply values for all the test function ++ arguments. ++ ++ For example, consider:: ++ ++ @parameterized([ ++ (1, ), ++ (2, 3), ++ ]) ++ def test_foo(a, b): ++ pass ++ ++ In this case, the error will be ``no value for arguments: 'b' with ++ paramters (1, )``, because the parameter ``(1, )`` does not provide ++ a value for the argument ``b``. ++ ++ Because ``pytest.mark.parametrized`` - which is used to implement ++ parametrized testing with ``pytest>=4`` - depends fairly heavily on ++ argument names, this can also come up if other decorators are used (for ++ example, if ``@mock.patch`` is used as a class decorator). diff --git a/python-parameterized.spec b/python-parameterized.spec index a1264a9..bc3f4f0 100644 --- a/python-parameterized.spec +++ b/python-parameterized.spec @@ -1,16 +1,16 @@ %global srcname parameterized Name: python-%{srcname} -Version: 0.7.4 +Version: 0.8.1 Release: 1 Summary: Parameterized testing with any Python test framework License: BSD URL: https://pypi.python.org/pypi/parameterized -Source0: https://files.pythonhosted.org/packages/bc/ef/d6c26f40a7636f43a52c9719f9d8228f08e01187081e5891702ea0754060/%{srcname}-%{version}.tar.gz +Source0: https://files.pythonhosted.org/packages/source/p/%{srcname}/%{srcname}-%{version}.tar.gz -# Python 3.8 -#Patch0: https://github.com/wolever/parameterized/pull/75/commits/1842e2038ae123e16601e083a553fe931f34fbd0.patch +Patch0: parameterized-pr116-pytest4.patch +Patch1: remove_nose.patch BuildArch: noarch @@ -21,7 +21,6 @@ BuildArch: noarch Summary: %{summary} BuildRequires: python3-devel BuildRequires: python3-setuptools -BuildRequires: python3-nose BuildRequires: python3-nose2 BuildRequires: python3-pytest %{?python_provide:%python_provide python3-%{srcname}} @@ -43,7 +42,6 @@ Python 3 version. %check sed -i 's|^import mock|from unittest import mock|' parameterized/test.py export PYTHONPATH=%{buildroot}%{python3_sitelib} -nosetests-%{python3_version} -v nose2-%{python3_version} -v py.test-%{python3_version} -v parameterized/test.py %{__python3} -m unittest -v parameterized.test @@ -55,5 +53,8 @@ py.test-%{python3_version} -v parameterized/test.py %{python3_sitelib}/%{srcname}/ %changelog +* Fri Apr 29 2022 yaoxin - 0.8.1-1 +- Update to 0.8.1 and remove python-nose + * Thu Jun 11 2020 Dillon Chen - 0.7.4-1 - build for openEuler diff --git a/remove_nose.patch b/remove_nose.patch new file mode 100644 index 0000000..1e11851 --- /dev/null +++ b/remove_nose.patch @@ -0,0 +1,123 @@ +--- + parameterized/parameterized.py | 7 ++++--- + parameterized/test.py | 30 ++++++++++++++++-------------- + 2 files changed, 20 insertions(+), 17 deletions(-) + +Index: parameterized-0.8.1/parameterized/test.py +=================================================================== +--- parameterized-0.8.1.orig/parameterized/test.py ++++ parameterized-0.8.1/parameterized/test.py +@@ -3,7 +3,7 @@ + import inspect + import mock + from unittest import TestCase +-from nose.tools import assert_equal, assert_raises ++import pytest + + from .parameterized import ( + PY3, PY2, PYTEST4, parameterized, param, +@@ -91,12 +91,12 @@ if not PYTEST: + self.actual_order = self.stack.pop(0) + + def tearDown(self): +- missing_tests.remove("teardown_called(%s)" %(self.stack.pop(0), )) ++ missing_tests.remove("teardown_called(%s)" % (self.stack.pop(0), )) + + @parameterized([(1, ), (2, )]) + def test_setup(self, count, *a): +- assert_equal(self.actual_order, "setup %s" %(count, )) +- missing_tests.remove("test_setup(%s)" %(self.actual_order, )) ++ assert self.actual_order == "setup %s" % count ++ missing_tests.remove("test_setup(%s)" % self.actual_order) + + + def custom_naming_func(custom_tag, kw_name): +@@ -248,9 +248,9 @@ class TestParamerizedOnTestCase(TestCase + frame_locals = frame[0].f_locals + nose_test_method_name = frame_locals['a'][0]._testMethodName + expected_name = "test_on_TestCase2_custom_name_" + str(foo) + "_" + str(bar) +- assert_equal(nose_test_method_name, expected_name, +- "Test Method name '%s' did not get customized to expected: '%s'" % +- (nose_test_method_name, expected_name)) ++ assert nose_test_method_name == expected_name, \ ++ "Test Method name '%s' did not get customized to expected: '%s'" % \ ++ (nose_test_method_name, expected_name) + missing_tests.remove("%s(%r, bar=%r)" %(expected_name, foo, bar)) + + +@@ -272,7 +272,7 @@ class TestParameterizedExpandDocstring(T + actual_docstring = test_method.__doc__ + if rstrip: + actual_docstring = actual_docstring.rstrip() +- assert_equal(actual_docstring, expected_docstring) ++ assert actual_docstring == expected_docstring + + @parameterized.expand([param("foo")], + doc_func=lambda f, n, p: "stuff") +@@ -348,7 +348,7 @@ def test_helpful_error_on_empty_iterable + + def test_skip_test_on_empty_iterable(): + func = parameterized([], skip_on_empty=True)(lambda: None) +- assert_raises(SkipTest, func) ++ pytest.raises(SkipTest, func) + + + def test_helpful_error_on_empty_iterable_input_expand(): +@@ -381,7 +381,7 @@ def test_helpful_error_on_non_iterable_i + + def tearDownModule(): + missing = sorted(list(missing_tests)) +- assert_equal(missing, []) ++ assert missing == [] + + def test_old_style_classes(): + if PY3: +@@ -433,7 +433,7 @@ class TestOldStyleClass: + def test_parameterized_argument_value_pairs(func_params, p, expected): + helper = eval("lambda %s: None" %(func_params, )) + actual = parameterized_argument_value_pairs(helper, p) +- assert_equal(actual, expected) ++ assert actual == expected + + + @parameterized([ +@@ -443,7 +443,7 @@ def test_parameterized_argument_value_pa + (123456789, "12...89", 4), + ]) + def test_short_repr(input, expected, n=6): +- assert_equal(short_repr(input, n=n), expected) ++ assert short_repr(input, n=n) == expected + + @parameterized([ + ("foo", ), +@@ -457,7 +457,7 @@ cases_over_10 = [(i, i+1) for i in range + + @parameterized(cases_over_10) + def test_cases_over_10(input, expected): +- assert_equal(input, expected-1) ++ assert input == expected-1 + + + @parameterized_class(("a", "b", "c"), [ +@@ -476,7 +476,7 @@ class TestParameterizedClass(TestCase): + + def _assertions(self, test_name): + assert hasattr(self, "a") +- assert_equal(self.b + self.c, 3) ++ assert self.b + self.c == 3 + missing_tests.remove("%s:%s(%r, %r, %r)" %( + self.__class__.__name__, + test_name, +Index: parameterized-0.8.1/parameterized/parameterized.py +=================================================================== +--- parameterized-0.8.1.orig/parameterized/parameterized.py ++++ parameterized-0.8.1/parameterized/parameterized.py +@@ -286,7 +286,7 @@ def default_name_func(func, num, p): + + _test_runner_override = None + _test_runner_guess = False +-_test_runners = set(["unittest", "unittest2", "nose", "nose2", "pytest"]) ++_test_runners = set(["unittest", "unittest2", "nose2", "pytest"]) + _test_runner_aliases = { + "_pytest": "pytest", + }