Running tests written for nose

pytest has basic support for running tests written for nose.

Usage

After Installation type:

python setup.py develop  # make sure tests can import our package
pytest  # instead of 'nosetests'

and you should be able to run your nose style tests and make use of pytest’s capabilities.

Supported nose Idioms

  • setup and teardown at module/class/method level
  • SkipTest exceptions and markers
  • setup/teardown decorators
  • yield-based tests and their setup
  • __test__ attribute on modules/classes/functions
  • general usage of nose utilities

Unsupported idioms / known issues

  • unittest-style setUp, tearDown, setUpClass, tearDownClass are recognized only on unittest.TestCase classes but not on plain classes. nose supports these methods also on plain classes but pytest deliberately does not. As nose and pytest already both support setup_class, teardown_class, setup_method, teardown_method it doesn’t seem useful to duplicate the unittest-API like nose does. If you however rather think pytest should support the unittest-spelling on plain classes please post to this issue.

  • nose imports test modules with the same import path (e.g. tests.test_mod) but different file system paths (e.g. tests/test_mode.py and other/tests/test_mode.py) by extending sys.path/import semantics. pytest does not do that but there is discussion in #268 for adding some support. Note that nose2 choose to avoid this sys.path/import hackery.

    If you place a conftest.py file in the root directory of your project (as determined by pytest) pytest will run tests “nose style” against the code below that directory by adding it to your sys.path instead of running against your installed code.

    You may find yourself wanting to do this if you ran python setup.py install to set up your project, as opposed to python setup.py develop or any of the package manager equivalents. Installing with develop in a virtual environment like Tox is recommended over this pattern.

  • nose-style doctests are not collected and executed correctly, also doctest fixtures don’t work.

  • no nose-configuration is recognized.

  • yield-based methods don’t support setup properly because the setup method is always called in the same class instance. There are no plans to fix this currently because yield-tests are deprecated in pytest 3.0, with pytest.mark.parametrize being the recommended alternative.