Merge branch 'pull-74'
diff --git a/.travis.yml b/.travis.yml
index c14db95..025e9b3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,6 @@
+# !!! WARNING !!!
+# This file is automatically generated by ./rebuild-travis-yaml
+# !!! WARNING !!!
 language: python
 sudo: false
 matrix:
@@ -6,7 +9,9 @@
       python: "2.7"
     - env: "TOXENV=py27-nose2"
       python: "2.7"
-    - env: "TOXENV=py27-pytest"
+    - env: "TOXENV=py27-pytest2"
+      python: "2.7"
+    - env: "TOXENV=py27-pytest3"
       python: "2.7"
     - env: "TOXENV=py27-unit"
       python: "2.7"
@@ -16,7 +21,9 @@
       python: "3.5"
     - env: "TOXENV=py35-nose2"
       python: "3.5"
-    - env: "TOXENV=py35-pytest"
+    - env: "TOXENV=py35-pytest2"
+      python: "3.5"
+    - env: "TOXENV=py35-pytest3"
       python: "3.5"
     - env: "TOXENV=py35-unit"
       python: "3.5"
@@ -26,7 +33,9 @@
       python: "3.6"
     - env: "TOXENV=py36-nose2"
       python: "3.6"
-    - env: "TOXENV=py36-pytest"
+    - env: "TOXENV=py36-pytest2"
+      python: "3.6"
+    - env: "TOXENV=py36-pytest3"
       python: "3.6"
     - env: "TOXENV=py36-unit"
       python: "3.6"
@@ -36,11 +45,27 @@
       python: "pypy"
     - env: "TOXENV=pypy-nose2"
       python: "pypy"
-    - env: "TOXENV=pypy-pytest"
+    - env: "TOXENV=pypy-pytest2"
+      python: "pypy"
+    - env: "TOXENV=pypy-pytest3"
       python: "pypy"
     - env: "TOXENV=pypy-unit"
       python: "pypy"
     - env: "TOXENV=pypy-unit2"
       python: "pypy"
+    - env: "TOXENV=py37-nose"
+      python: "3.7"
+    - env: "TOXENV=py37-nose2"
+      python: "3.7"
+    - env: "TOXENV=py37-pytest3"
+      python: "3.7"
+    - env: "TOXENV=py37-unit"
+      python: "3.7"
+    - env: "TOXENV=py37-unit2"
+      python: "3.7"
+
 install: pip install tox==3.7.0
 script: tox
+# !!! WARNING !!!
+# This file is automatically generated by ./rebuild-travis-yaml
+# !!! WARNING !!!
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index f471735..af6122c 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,6 @@
+0.7.1 (2019-11-19)
+    * Fix #73: calling `setUp` and `tearDown` in parameterized classes
+
 0.7.0 (2019-02-05)
     * Added parameterized_class feature, for parameterizing entire test
       classes (many thanks to @TobyLL for their suggestions and help testing!)
diff --git a/README.rst b/README.rst
index 9014bc1..8ec1e09 100644
--- a/README.rst
+++ b/README.rst
@@ -174,7 +174,7 @@
 Compatibility
 -------------
 
-`Yes`__.
+`Yes`__ (mostly).
 
 __ https://travis-ci.org/wolever/parameterized
 
@@ -190,6 +190,7 @@
      - Py3.6
      - Py3.7
      - PyPy
+     - ``@mock.patch``
    * - nose
      - yes
      - yes
@@ -198,6 +199,7 @@
      - yes
      - yes
      - yes
+     - yes
    * - nose2
      - yes
      - yes
@@ -206,7 +208,17 @@
      - yes
      - yes
      - yes
-   * - py.test
+     - yes
+   * - py.test 2
+     - yes
+     - yes
+     - no*
+     - no*
+     - no*
+     - no*
+     - yes
+     - yes
+   * - py.test 3
      - yes
      - yes
      - yes
@@ -214,6 +226,25 @@
      - yes
      - yes
      - yes
+     - yes
+   * - py.test 4
+     - no**
+     - no**
+     - no**
+     - no**
+     - no**
+     - no**
+     - no**
+     - no**
+   * - py.test fixtures
+     - no†
+     - no†
+     - no†
+     - no†
+     - no†
+     - no†
+     - no†
+     - no†
    * - | unittest
        | (``@parameterized.expand``)
      - yes
@@ -223,6 +254,7 @@
      - yes
      - yes
      - yes
+     - yes
    * - | unittest2
        | (``@parameterized.expand``)
      - yes
@@ -232,13 +264,17 @@
      - yes
      - yes
      - yes
+     - yes
 
-*Note*: py.test 4 is `not yet supported`__ (but coming!), and py.test 2 under
-Python 3 `does not appear to work`__. Please comment on the related issues if
-you are affected.
+\*: py.test 2 does `does not appear to work (#71)`__ under Python 3. Please comment on the related issues if you are affected.
 
-__ https://github.com/wolever/parameterized/issues/34
+\*\*: 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
+__ https://github.com/wolever/parameterized/issues/34
+__ https://github.com/wolever/parameterized/issues/81
 
 Dependencies
 ------------
@@ -518,8 +554,8 @@
 trailing comma: ``(foo, )``)
 
 
-Using with ``mock.patch``
-.........................
+Using with ``@mock.patch``
+..........................
 
 ``parameterized`` can be used with ``mock.patch``, but the argument ordering
 can be confusing. The ``@mock.patch(...)`` decorator must come *below* the
diff --git a/parameterized/parameterized.py b/parameterized/parameterized.py
index ba13861..bb3b62c 100644
--- a/parameterized/parameterized.py
+++ b/parameterized/parameterized.py
@@ -594,6 +594,17 @@
 
             test_class_module[name] = type(name, (base_class, ), test_class_dict)
 
+        # We need to leave the base class in place (see issue #73), but if we
+        # leave the test_ methods in place, the test runner will try to pick
+        # them up and run them... which doesn't make sense, since no parameters
+        # will have been applied.
+        # Address this by iterating over the base class and remove all test
+        # methods.
+        for method_name in list(base_class.__dict__):
+            if method_name.startswith("test_"):
+                delattr(base_class, method_name)
+        return base_class
+
     return decorator
 
 
diff --git a/parameterized/test.py b/parameterized/test.py
index fa7b3ef..1b0abb6 100644
--- a/parameterized/test.py
+++ b/parameterized/test.py
@@ -166,12 +166,9 @@
                              (foo, mock_umask._mock_name))
 
     expect([
-        "test_multiple_function_patch_decorator"
-        "(42, 51, 'umask', 'fdopen')",
-        "test_multiple_function_patch_decorator"
-        "('foo0', 'bar0', 'umask', 'fdopen')",
-        "test_multiple_function_patch_decorator"
-        "('foo1', 'bar1', 'umask', 'fdopen')",
+        "test_multiple_function_patch_decorator(42, 51, 'umask', 'fdopen')",
+        "test_multiple_function_patch_decorator('foo0', 'bar0', 'umask', 'fdopen')",
+        "test_multiple_function_patch_decorator('foo1', 'bar1', 'umask', 'fdopen')",
     ])
 
     @parameterized.expand([(42, 51), ("foo0", "bar0"), param("foo1", "bar1")])
@@ -529,13 +526,35 @@
 ])
 class TestParameterizedClassDict(TestCase):
     expect([
+        "TestParameterizedClassDict_0:setUp(1, 0)",
+        "TestParameterizedClassDict_0:tearDown(1, 0)",
         "TestParameterizedClassDict_0:test_method(1, 0)",
         "TestParameterizedClassDict_1:test_method(0, 1)",
+        "TestParameterizedClassDict_1:setUp(0, 1)",
+        "TestParameterizedClassDict_1:tearDown(0, 1)",
     ])
 
     foo = 0
     bar = 0
 
+    def setUp(self):
+        # Ensure that super() works (issue #73)
+        super(TestParameterizedClassDict, self).setUp()
+        missing_tests.remove("%s:setUp(%r, %r)" %(
+            self.__class__.__name__,
+            self.foo,
+            self.bar,
+        ))
+
+    def tearDown(self):
+        # Ensure that super() works (issue #73)
+        super(TestParameterizedClassDict, self).tearDown()
+        missing_tests.remove("%s:tearDown(%r, %r)" %(
+            self.__class__.__name__,
+            self.foo,
+            self.bar,
+        ))
+
     def test_method(self):
         missing_tests.remove("%s:test_method(%r, %r)" %(
             self.__class__.__name__,
diff --git a/rebuild-travis-yaml b/rebuild-travis-yaml
new file mode 100755
index 0000000..372ec84
--- /dev/null
+++ b/rebuild-travis-yaml
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+
+"""
+Rebuilds the .travis.yml file based on the output of ``tox --listenvs``
+"""
+
+import subprocess as sp
+
+template = """\
+# !!! WARNING !!!
+# This file is automatically generated by ./rebuild-travis-yaml
+# !!! WARNING !!!
+language: python
+sudo: false
+matrix:
+  include:
+{env_list}
+install: pip install tox==3.7.0
+script: tox
+# !!! WARNING !!!
+# This file is automatically generated by ./rebuild-travis-yaml
+# !!! WARNING !!!
+"""
+
+# Maps tox python versions (ex, "py27") to Travis Python versions (ex, "2.7")
+py_version_map = {
+    "py26": "2.6",
+    "py27": "2.7",
+    "py35": "3.5",
+    "py36": "3.6",
+    "py37": "3.7",
+    "pypy": "pypy",
+}
+
+def main():
+    tox_envs = sp.check_output("tox --listenvs", shell=True).splitlines()
+    env_list = []
+    for env in tox_envs:
+        if not env.strip():
+            continue
+        py_ver, _, _ = env.partition("-")
+        env_list.append("""\
+    - env: "TOXENV=%s"
+      python: "%s"
+""" %(env, py_version_map[py_ver]))
+
+    with open(".travis.yml", "w") as f:
+        f.write(template.format(env_list="".join(env_list)))
+
+
+if __name__ == "__main__":
+    main()
diff --git a/setup.py b/setup.py
index 0082729..8c2dc57 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@
 
 setup(
     name="parameterized",
-    version="0.7.0",
+    version="0.7.1",
     url="https://github.com/wolever/parameterized",
     license="FreeBSD",
     author="David Wolever",