[Python-Dev] Adding test case methods to TestCase subclasses

Ethan Furman ethan at stoneleaf.us
Sat Apr 16 00:56:14 CEST 2011


Ben Finney wrote:
> Ethan Furman <ethan at stoneleaf.us> writes:
 >> Ben Finney wrote:
 >>>
>>> How can composition add test cases detectable by Python's ‘unittest’?
 >>
>> Metaclasses, if's that an option...
> […]
>> or a class decorator
> […]
> 
> Both interesting, thank you. But Python 3 isn't an option for several
> projects where I'd like to use this.
> 

Well, I'm sure there's a way to do it -- alas, I lack the time to find 
it either in the docs, archives, or by experimentation.


What I did find is that if you have your functions in modules, instead 
of in classes, it works fine in Python 2.6+.

8<---spam.py-------------------------------------------------------
def test_spam_01(self):
     print('testing spam_01')
def test_spam_02(self):
     print('testing spam_02')
8<-----------------------------------------------------------------

8<---eggs.py-------------------------------------------------------
def test_eggs_01(self):
     print('testing eggs_01')
def test_eggs_02(self):
     print('testing eggs_02')
8<-----------------------------------------------------------------

8<---test_compose.py-----------------------------------------------
import unittest

class Compose(object):  # 2.6-2.7, functions must be in modules
     def __init__(self, *parts):
         self.parts = parts
     def __call__(self, func):
         for part in self.parts:
             for attr in dir(part):
                 if attr[:2] == attr[-2:] == '__':
                     continue
                 if getattr(cls, attr, None):
                     raise AttributeError(
                         "%s already exists in %s" % (attr, cls))
                 setattr(func, attr, getattr(part, attr))
         return func

@Compose(spam, eggs)
class TestAll(unittest.TestCase):
     def setUp(self):
         print('Setting up...')
     def tearDown(self):
         print('Tearing down...')
     def test_something(self):
         print('testing something')

if __name__ == '__main__':
     unittest.main()
8<---test_compose.py-----------------------------------------------

Compose now has rudimentary error checking, and if can live with your 
extras living in their own .py files, this might work for you.

~Ethan~


More information about the Python-Dev mailing list