Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unittest tests reuse for family of classes

I have problem organizing my unittest based class test for family of tests. For example assume I implement a "dictionary" interface, and have 5 different implementations want to testing.

I do write one test class that tests a dictionary interface. But how can I nicely reuse it to test my all classes? So far I do ugly:

DictType = hashtable.HashDict

In top of file and then use DictType in test class. To test another class I manually change the DictType to something else.

How can do this otherwise? Can't pass arguments to unittest classes so is there a nicer way?

like image 227
zaharpopov Avatar asked Mar 28 '10 07:03

zaharpopov


People also ask

What is the use of unit testing?

This is used to validate that each unit of the software performs as designed. The unittest test framework is python’s xUnit style framework. White Box Testing method is used for Unit testing.

What is unittest test framework?

What is Unit Testing? Unit Testing is the first level of software testing where the smallest testable parts of a software are tested. This is used to validate that each unit of the software performs as designed. The unittest test framework is python’s xUnit style framework.

What is the use of unittest in pytest?

It’s meant for leveraging existing unittest -based test suites to use pytest as a test runner and also allow to incrementally adapt the test suite to take full advantage of pytest’s features. To run an existing unittest -style test suite using pytest, type:

What is the difference between unit testing and white box testing?

This is used to validate that each unit of the software performs as designed. The unittest test framework is python’s xUnit style framework. White Box Testing method is used for Unit testing. A test fixture is used as a baseline for running tests to ensure that there is a fixed environment in which tests are run so that results are repeatable.


1 Answers

The way I tackle this with standard unittest is by subclassing -- overriding data is as easy as overriding methods, after all.

So, I have a base class for the tests:

class MappingTestBase(unittest.TestCase):
    dictype = None
    # write all the tests using self.dictype

and subclasses:

class HashtableTest(MappingTestBase):
    dictype = hashtable.HashDict

class OtherMappingTest(MappingTestBase):
    dictype = othermodule.mappingimpl

Here, the subclasses need override only dictype. Sometimes it's handier to also expose MappingTestBase use "hook methods". When the types being tested don't have exactly identical interfaces in all cases, this can be worked around by having the subclasses override the hook methods as needed -- this is the "Template Method" design pattern, see e.g. this page which has a commented and timelined collection of a couple of video lectures of mine on design patterns -- part II is about Template Method and variants thereof for about the first 30 minutes.

You don't have to have all of this in a single module, of course (though I often find it clearest to lay things out this way, you could also make one separate test module per type you're testing, each importing the module with the abstract base class).

like image 80
Alex Martelli Avatar answered Sep 30 '22 11:09

Alex Martelli