GitHub

nose-random is designed to facilitate Monte-Carlo style unit testing. The idea is to improve testing by running your code against a large number of randomly generated input scenarios.

Even with random testing it's important that test success/failure is reproducible, otherwise it's hard to

  • know if you've fixed a failing test
  • know if an test fails only on some machines or configurations and not others
  • debug a failing test

nose-random avoids this pitfall because it

  • uses a fixed seed so that each test run is identical
  • tells you which scenario caused a test to fail
  • lets you to run the test only on a specific scenario to facilitate debugging

Installation

pip install git+https://github.com/ZoomerAnalytics/nose-random.git

or clone the repo and run python setup.py install.

Usage

The following example shows how to set up a randomized test.

# tests.py
import unittest
from nose_random import randomize
class RandomTestCase(unittest.TestCase):
    def generate_scenario(self, rng):
        return rng.random(), 10 * rng.random()
    @randomize(1000, generate_scenario)
    def failing_test(self, scenario):
        x, y = scenario
        self.assertLess(x, y)
    @randomize(1000, generate_scenario)
    def passing_test(self, scenario):
        x, y = scenario
        self.assertLess(x, y + 1)

Running nosetests from the same folder will produce the following output:

F.
======================================================================
FAIL: failing_test (tests.RandomTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\dev\nose-random\nose_random\__init__.py", line 62, in randomized_test
    test(self, scenario)
  File "C:\Dev\nose-random\examples\tests.py", line 13, in failing_test
    self.assertLess(x, y)
AssertionError: 0.9903329105632304 not less than 0.0015605977653532221 with scenario 2FDO1B08J20A (27 of 1000)
----------------------------------------------------------------------
Ran 2 tests in 0.067s

This means that the failing_test function succeeded with the first 26 scenarios but then failed with the 27th. To debug this scenario you can run the same command specifying the scenario id.

nosetests --scenario=2FDO1B08J20A

This will cause the tests to only be run against the failing scenario (note '1 of 1' as opposed to '27 of 1000').

AssertionError: 0.9903329105632304 not less than 0.0015605977653532221 with scenario 2FDO1B08J20A (1 of 1)

PyCharm

Note that the module will also pick up the --scenario= string if passed as a parameter to a PyCharm unittest run/debug configuration.

Read the original on github.com ↗