python_wrap_cases 0.1.8
Simple library for generate test cases.
License: BSD
Keywords: python_wrap_cases,test cases,test,test with parameters,generate tests

===============================
Python wrap cases
===============================

.. image:: https://badges.gitter.im/Join%20Chat.svg
   :alt: Join the chat at https://gitter.im/erm0l0v/python_wrap_cases
   :target: https://gitter.im/erm0l0v/python_wrap_cases?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge

.. image:: https://img.shields.io/travis/erm0l0v/python_wrap_cases.svg
        :target: https://travis-ci.org/erm0l0v/python_wrap_cases

.. image:: https://img.shields.io/pypi/v/python_wrap_cases.svg
        :target: https://pypi.python.org/pypi/python_wrap_cases

.. image:: https://readthedocs.org/projects/python-wrap-cases/badge/?version=latest
        :target: https://readthedocs.org/projects/python-wrap-cases/?badge=latest
        :alt: Documentation Status


Simple library for generate test cases with parameters.

What is this?
-------------

This library helps to generate tests with parameters.

Let's write some tests for this function:

.. code:: python

    import re
    
    
    def clear_start_end_dash(string):
        return re.sub(r'^[\s\-]*-|-[\s\-]*$', '', string)


We may write something like this:

.. code:: python

    from unittest import TestCase
    
    
    class ClearStartEndDashTest(TestCase):

        def test_remove_first_dash(self):
            result = clear_start_end_dash('-my string')
            self.assertEqual(result, 'my string')

        def test_remove_all_first_dashes(self):
            result = clear_start_end_dash('-  -- --my string')
            self.assertEqual(result, 'my string')

        def test_remove_last_dash(self):
            result = clear_start_end_dash('my string-')
            self.assertEqual(result, 'my string')

        def test_remove_all_last_dashes(self):
            result = clear_start_end_dash('my string-- -- -- - ')
            self.assertEqual(result, 'my string')

        def test_keep_dash_at_center(self):
            result = clear_start_end_dash('my-string')
            self.assertEqual(result, 'my-string')


It's good, but we spent a lot of time to write those absolutely the same test functions.

So let's decrease the number of duplicate functions:

.. code:: python

    from unittest import TestCase
    
    
    class ClearStartEndDashDryTest(TestCase):

        def test_remove_dash(self):
            cases = (
                ('-my string', 'my string'),
                ('-  -- --my string', 'my string'),
                ('my string-', 'my string'),
                ('my string-- -- -- - ', 'my string'),
                ('my-string', 'my-string')
            )
            for string, expected_result in cases:
                result = clear_start_end_dash(string)
                self.assertEqual(result, expected_result)


This code has a few problems:

* Easy to write but difficult to read.
* We can't use test fixture (`setUp`, `tearDown`) with each case.
* If some case fails, the other cases won't run.
* If test `test_remove_dash` fails, it won't help us find out what happened.

Look how easy we may solve these problems using this library:

.. code:: python

    from unittest import TestCase
    from python_wrap_cases import wrap_case
    
    
    @wrap_case
    class ClearStartEndDashWrapTest(TestCase):

        @wrap_case('-my string', 'my string')
        @wrap_case('-  -- --my string', 'my string')
        @wrap_case('my string-', 'my string')
        @wrap_case('my string-- -- -- - ', 'my string')
        @wrap_case('my-string', 'my-string')
        def test_remove_dash(self, string, expected_result):
            result = clear_start_end_dash(string)
            self.assertEqual(result, expected_result)


This code generates 5 tests, that works like a simple test functions.

Console output:

.. code::

    test_remove_dash_u'-  -- --my string'_u'my string' (tests.example.test_simple_test.ClearStartEndDashWrapTest) ... ok
    test_remove_dash_u'-my string'_u'my string' (tests.example.test_simple_test.ClearStartEndDashWrapTest) ... ok
    test_remove_dash_u'my string-'_u'my string' (tests.example.test_simple_test.ClearStartEndDashWrapTest) ... ok
    test_remove_dash_u'my string-- -- -- - '_u'my string' (tests.example.test_simple_test.ClearStartEndDashWrapTest) ... ok
    test_remove_dash_u'my-string'_u'my-string' (tests.example.test_simple_test.ClearStartEndDashWrapTest) ... ok


Installation
------------

.. code::

    pip install python_wrap_cases


Free software: BSD license

Documentation: https://python_wrap_cases.readthedocs.org.




History
-------

0.1.0 (2015-06-26)
---------------------

* First release on PyPI.


0.1.2 (2015-06-26)
---------------------

* Fix generators import

0.1.3 (2015-06-26)
---------------------

* Add some docs

0.1.4 (2015-06-29)
--------------------

* ReadMe add semicolon
* Fix pypi readme

0.1.5 (2015-07-01)
--------------------

* README remove ::;


0.1.6 (2015-07-01)
--------------------

* Add tests fot python 3.2

0.1.7 (2015-07-10)
--------------------

* Add six dependency

0.1.8 (2015-08-21)
--------------------

* Add func generator
* Add range generator
* Fix problem with iterator in custom generator
* Add new API for declaration wrapped TestCase. (added wrap_case decorator without parameters)