Skip to main content

Decorator for parameterized testing with Nose

Project description

Now with 100% less Python 3 incompatibility!

Nose. It’s got test generators. But they kind of suck:

  • They often require a second function

  • They make it difficult to separate the data from the test

  • They don’t work with subclases of unittest.TestCase

  • kwargs? What kwargs?

But nose-parameterized fixes that:

# test_math.py
from nose.tools import assert_equal
from nose_parameterized import parameterized

import unittest
import math

@parameterized([
    (2, 2, 4),
    (2, 3, 8),
    (1, 9, 1),
    (0, 9, 0),
])
def test_pow(base, exponent, expected):
    assert_equal(math.pow(base, exponent), expected)

class TestMathUnitTest(unittest.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)
$ nosetests -v test_math.py
test_math.test_pow(2, 2, 4) ... ok
test_math.test_pow(2, 3, 8) ... ok
test_math.test_pow(1, 9, 1) ... ok
test_math.test_pow(0, 9, 0) ... ok
test_floor_0_negative (test_math.TestMathUnitTest) ... ok
test_floor_1_integer (test_math.TestMathUnitTest) ... ok
test_floor_2_large_fraction (test_math.TestMathUnitTest) ... ok

----------------------------------------------------------------------
Ran 7 tests in 0.002s

OK

Exhaustive Usage Examples

The @parameterized and @parameterized.expand decorators accept a list or iterable of tuples or param(...), or a callable which returns a list or iterable:

from nose_parameterized import parameterized, param

# A list of tuples
@parameterized([
    (2, 3, 5),
    (3, 5, 8),
])
def test_add(a, b, expected):
    assert_equal(a + b, expected)

# A list of params
@parameterized([
    param("10", 10),
    param("10", 16, base=16),
])
def test_int(str_val, expected, base=10):
    assert_equal(int(str_val, base=base), expected)

# An iterable of params
@parameterized(
    param.explicit(*json.loads(line))
    for line in open("testcases.jsons")
)
def test_from_json_file(...):
    ...

# A callable which returns a list of tuples
def load_test_cases():
    return [
        ("test1", ),
        ("test2", ),
    ]
@parameterized(load_test_cases)
def test_from_function(name):
    ...

Note that, when using an iterator or a generator, Nose will read every item into memory before running any tests (as it first finds and loads every test in each test file, then executes all of them at once).

The @parameterized decorator can be used test class methods, and standalone functions:

from nose_parameterized import parameterized

class AddTest(object):
    @parameterized([
        (2, 3, 5),
    ])
    def test_add(self, a, b, expected):
        assert_equal(a + b, expected)

@parameterized([
    (2, 3, 5),
])
def test_add(a, b, expected):
    assert_equal(a + b, expected)

And @parameterized.expand can be used to generate test methods in situations where test generators cannot be used (for example, when the test class is a subclass of unittest.TestCase):

import unittest
from nose_parameterized import parameterized

class AddTestCase(unittest.TestCase):
    @parameterized.expand([
        ("2 and 3", 2, 3, 5),
        ("3 and 5", 2, 3, 5),
    ])
    def test_add(self, _, a, b, expected):
        assert_equal(a + b, expected)

Note that @parameterized.expand works by creating new methods on the test class. If the first parameter is a string, that string will be added to the end of the method name. For example, the test case above will generate the methods test_add_0_2_and_3 and test_add_1_3_and_5.

The param(...) helper represents the parameters for one specific test case. It can be used to pass keyword arguments to test cases:

from nose_parameterized import parameterized, param

@parameterized([
    param("10", 10),
    param("10", 16, base=16),
])
def test_int(str_val, expected, base=10):
    assert_equal(int(str_val, base=base), expected)

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

nose-parameterized-0.3.4.tar.gz (5.9 kB view details)

Uploaded Source

Built Distributions

nose_parameterized-0.3.4-py2.py3-none-any.whl (6.6 kB view details)

Uploaded Python 2 Python 3

nose_parameterized-0.3.4-py2-none-any.whl (6.6 kB view details)

Uploaded Python 2

File details

Details for the file nose-parameterized-0.3.4.tar.gz.

File metadata

File hashes

Hashes for nose-parameterized-0.3.4.tar.gz
Algorithm Hash digest
SHA256 57a2d9898e963f8a02dd6a4848c22ab12af8ba0d00e37bf263ef350e93dc6821
MD5 6c8c1d570488f83b61f9a9f12cd55329
BLAKE2b-256 b8c9668e42298ff4d83157ba49afdd492207e596a259ec85ef7bb30a82cd3f58

See more details on using hashes here.

File details

Details for the file nose_parameterized-0.3.4-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for nose_parameterized-0.3.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7d60a101e3118255a37818838bdd23d0c466cd6914de330d3b2b3666428d8741
MD5 a3c3267767ed23a267ee0eb564a48147
BLAKE2b-256 db30ae96fa7fd39f5533434a5d32437d3d8a60f2fceb3632415397afc31cd320

See more details on using hashes here.

File details

Details for the file nose_parameterized-0.3.4-py2-none-any.whl.

File metadata

File hashes

Hashes for nose_parameterized-0.3.4-py2-none-any.whl
Algorithm Hash digest
SHA256 7cfa46304e9cbe3d0f2e7f202a6f9062a7d7c84e7a37d3e77fa5b3cdab57ffeb
MD5 4f233f42b6f7bcda4d1d784741e08619
BLAKE2b-256 b9ffe4cef035eea6919464d2394211a7da2c2f0effced4fbcd544ac851173fd6

See more details on using hashes here.

Supported by

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