Skip to main content

Utilities for handling python test cases with temporary directories and files, for people using `pyunit`/`unittest`.

Project description

tempcase

Build Status

Utilities for handling python test cases with temporary directories and files, for people using pyunit/unittest.

Supports python 2.7 and 3.4+.

N.B. the existence of this library is not an endorsement of unittest. Use pytest if you want a powerful, modern, pythonic testing paradigm. Please.

Motivation

Unit tests should be as isolated as possible, but when testing a file-generating method, it is often inconvenient to manually handle separate output directories with informative names and away from the code.

pytest solves this easily with the tmpdir fixture, but unittest has no such utility.

tempcase provides a base class for unittest-style test cases with ergonomic methods for creating temporary directories as required, with automatic cleanup which can be disabled for debugging purposes.

Installation

pip install tempcase

Usage

import os

import tempcase


class MyTestCase(tempcase.TempCase):
    _project_name = 'mylibrary'

    def test_creates_file(self):
        """
        Test that ``my_file.txt`` is successfully created.
        The first call to ``path_to`` for a ``TestCase`` will create a directory in your default temp directory, 
        which has the name of the project as defined above, the name of the ``TestCase``, a timestamp, and a random
        alphanumeric string.
        The first call to ``path_to`` for a test method will create a subdirectory within that, named for the 
        test method.
        The test method directory and its contents will be deleted by ``tearDown``.
        The ``TestCase`` directory, if empty, will be cleaned up by ``tearDownClass``.
        """
        fpath = self.path_to('my_file.txt')  # os.path.join-like syntax
        open(fpath, 'w').close()
        self.assertTrue(os.path.isfile(fpath))

    def test_something_else(self):
        """No unnecessary directories are created"""
        self.assertTrue(True)

    def test_creates_file_no_cleanup(self):
        """
        Setting ``self._cleanup = False`` anywhere in a test method will disable cleanup just for that method, 
        allowing you to look at the output for debugging purposes.
        The containing ``TestCase`` directory will also not be deleted.
        """
        fpath = self.path_to('my_other_file.txt')
        open(fpath, 'w').close()
        self.assertTrue(os.path.isfile(fpath))
        self._cleanup = False

    def tearDown(self):
        """Be sure to call the super() tearDown if you override it! Same goes for tearDownClass."""
        super().tearDown()  # python 3+
        print("I did a tearDown")


class MyTestCaseWithNoCleanup(tempcase.TempCase):
    _project_name = 'mylibrary'
    _cleanup = False

    def test_creates_file(self):
        """This will not be cleaned up, by default"""
        fpath = self.path_to('my_file.txt')
        open(fpath, 'w').close()

    def test_creates_file_with_cleanup(self)
        """You can clean up individual methods if you like"""
        self._cleanup = True
        open(self.path_to('my_file.txt'), 'w').close()

For existing projects with an already-fragile inheritance chain above every test case, and local paths defined in a method body (not in a setUp), the in_tempdir decorator may be useful. It creates a temporary directory, changes the working directory, and then changes back and cleans up the temp dir after execution.

import unittest
import tempcase

class MyOldTestCase(unittest.TestCase):
    @tempcase.in_tempdir('my_project')
    def test_old_code(self):
        """
        This method has now be ``os.chdir()``'d into a temporary directory which will be cleaned up.
        The working directory will then automatically switch back to whatever it was before.
        The directory's cleanup cannot be prevented.
        """
        open('my_local_file.txt', 'w').close()

    _project_name = 'my_project'  # can be defined in the class or passed to the decorator

    @tempcase.in_tempdir
    def test_slightly_newer_code(self):
        pass

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tempcase-1.0.0.tar.gz (6.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tempcase-1.0.0-py2.py3-none-any.whl (6.4 kB view details)

Uploaded Python 2Python 3

File details

Details for the file tempcase-1.0.0.tar.gz.

File metadata

  • Download URL: tempcase-1.0.0.tar.gz
  • Upload date:
  • Size: 6.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.0

File hashes

Hashes for tempcase-1.0.0.tar.gz
Algorithm Hash digest
SHA256 2f2fb58a598a7d10720906363bece9300ce21a9245ef9e1d8edd978bead4f85a
MD5 c3cb286c6f8b5638f90623e687bc97a7
BLAKE2b-256 380c2856d0b7d413223c18a16ddacd939d99430a0d0a071b8d7ed44b4a85e626

See more details on using hashes here.

File details

Details for the file tempcase-1.0.0-py2.py3-none-any.whl.

File metadata

  • Download URL: tempcase-1.0.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 6.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.0

File hashes

Hashes for tempcase-1.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 252036002d5c94e3e60dc577d69f8ed7bc597345cc292a63390cbf892674ddfc
MD5 e70ca26ef3f061ca5079ba7e1982f9cd
BLAKE2b-256 91eafc3261679da5577711bd960a1e16a9f42e46e349a479e8a4ab166a71488e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page