Advertisement
Guest User

JUnit annotations

a guest
Nov 9th, 2013
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.98 KB | None | 0 0
  1. from operator import itemgetter
  2. from functools import wraps
  3. import unittest
  4.  
  5.  
  6. BEFORE, AFTER, TEST = range(3)
  7.  
  8.  
  9. # NOTE: sequence is negative for LIFO sorting
  10. def before(f, __state=[0]):
  11.     # Annotate function, for use by annotated class decorator
  12.     f.annotate_call_when = BEFORE, __state[0]
  13.     __state[0] -= 1
  14.  
  15.     return f
  16.  
  17. def after(f, __state=[0]):
  18.     # Annotate function, for use by annotated class decorator
  19.     f.annotate_call_when = AFTER, __state[0]
  20.     __state[0] -= 1
  21.  
  22.     return f
  23.  
  24. def test(f):
  25.     # Annotate function, for use by annotated class decorator
  26.     f.annotate_call_when = TEST, 0
  27.  
  28.     return f
  29.  
  30. def annotated(cls):
  31.     def collect(ns):
  32.         for name, value in ns.iteritems():
  33.             annotation, n = getattr(
  34.                 value, "annotate_call_when", (None, 0))
  35.             if annotation == BEFORE:
  36.                 call_before.append((value, n))
  37.             elif annotation == AFTER:
  38.                 call_after.append((value, n))
  39.             elif annotation == TEST:
  40.                 call_test.append((name, value))
  41.  
  42.     def test_wrapper(test, call_before, call_after):
  43.         @wraps(test)
  44.         def wrapped(self):
  45.             for fixture, n in call_before:
  46.                 fixture(self)
  47.  
  48.             test(self)
  49.  
  50.             for fixture, n in call_after:
  51.                 fixture(self)
  52.  
  53.         return wrapped
  54.  
  55.     call_before = []
  56.     call_after = []
  57.     call_test = []
  58.  
  59.     # Collect all annotations
  60.     for base in cls.__mro__:
  61.         collect(base.__dict__)
  62.  
  63.     # Before and After functions must be called LIFO
  64.     # The order is correct for base classes, since base classes
  65.     # methods calls the after and before decorators first.
  66.     call_before.sort(key=itemgetter(1))
  67.     call_after.sort(key=itemgetter(1))
  68.  
  69.     # Wrap each annotated Test so that Before and After fixtures are
  70.     # executed correctly
  71.     for name, fun in call_test:
  72.        test = test_wrapper(fun, call_before, call_after)
  73.        setattr(cls, name, test)
  74.  
  75.     return cls
  76.  
  77.  
  78.  
  79. #
  80. # Example
  81. #
  82.  
  83. @annotated
  84. class TestCaseBase(unittest.TestCase):
  85.     @before
  86.     def fixture_base_before_1(self):
  87.         print "fixture base before 1"
  88.  
  89.     @before
  90.     def fixture_base_before_2(self):
  91.         print "fixture base before 2"
  92.  
  93.     @after
  94.     def fixture_base_after_1(self):
  95.         print "fixture base after 1"
  96.  
  97.     @after
  98.     def fixture_base_after_2(self):
  99.         print "fixture base after 2"
  100.  
  101.  
  102. @annotated
  103. class TestCase(TestCaseBase):
  104.     @before
  105.     def fixture_before_1(self):
  106.         print "fixture before 1"
  107.  
  108.     @before
  109.     def fixture_before_2(self):
  110.         print "fixture before 2"
  111.  
  112.     @after
  113.     def fixture_after_1(self):
  114.         print "fixture after 1"
  115.  
  116.     @after
  117.     def fixture_after_2(self):
  118.         print "fixture after 2"
  119.  
  120.     @test
  121.     def test(self):
  122.         print "test"
  123.  
  124.     # internal
  125.     def runTest(self):
  126.         pass
  127.  
  128.  
  129. if __name__ == '__main__':
  130.     t = TestCase()
  131.  
  132.     t.test()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement