dynamic unittest

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Oleg  Paraschenko

    #1

    dynamic unittest

    Hello,

    I decided to re-use functionality of "unittest" module for my purposes.
    More precisely, I have a list of folders. For each folder, code should
    enter to the folder, execute a command and assert the output. It's
    reasonable to use "unittest" here, but the problem is that "unittest"
    doesn't support (== I haven't found how) dynamic creation of tests.

    I thought it would be very easy, but due to lack of closures in Python
    (more precisely, closures do exist, but they are counter-intuitive for
    lisp programmers), I failed. Finally, I found a way using a global
    variable. I exploit the fact that "unittest" uses "cmp" to arrange test
    cases. Therefore, if we have an array of test names and sequential
    number of running the common function, we know the name of the current
    test. Here is a sample code:

    ------- <dynamic_unitte st.py>

    import sys, unittest
    test_names = ['aaa', 'ddd', 'bbb']
    test_names.sort ()
    test_index = 0

    class DynamicTestCase (unittest.TestC ase):
    def one_test(self):
    global test_index
    test_name = test_names[test_index]
    test_index = test_index + 1
    # Ok for 'aaa' and 'bbb', failure for 'ddd'
    assert test_name in ['aaa', 'bbb']

    for test_name in test_names:
    func_name = 'test_' + test_name
    setattr(Dynamic TestCase, func_name, DynamicTestCase .one_test)

    suite = unittest.makeSu ite(DynamicTest Case, 'test_')
    if not unittest.TextTe stRunner().run( suite).wasSucce ssful():
    sys.exit(1)

    ------- </dynamic_unittes t.py>

    I think this code might help others, so I post it to the group.
    Comments are welcome.

    --
    Oleg Parashchenko olpa@ http://xmlhack.ru/ XML news in Russian
    http://uucode.com/blog/ Generative Programming, XML, TeX, Scheme
    XSieve at XTech 2006: http://xtech06.usefulinc.com/schedule/detail/44

  • Peter Otten

    #2
    Re: dynamic unittest

    Oleg Paraschenko wrote:
    Hello,
    >
    I decided to re-use functionality of "unittest" module for my purposes.
    More precisely, I have a list of folders. For each folder, code should
    enter to the folder, execute a command and assert the output. It's
    reasonable to use "unittest" here, but the problem is that "unittest"
    doesn't support (== I haven't found how) dynamic creation of tests.
    >
    I thought it would be very easy, but due to lack of closures in Python
    (more precisely, closures do exist, but they are counter-intuitive for
    lisp programmers), I failed. Finally, I found a way using a global
    variable. I exploit the fact that "unittest" uses "cmp" to arrange test
    cases. Therefore, if we have an array of test names and sequential
    number of running the common function, we know the name of the current
    test. Here is a sample code:
    >
    ------- <dynamic_unitte st.py>
    >
    import sys, unittest
    test_names = ['aaa', 'ddd', 'bbb']
    test_names.sort ()
    test_index = 0
    >
    class DynamicTestCase (unittest.TestC ase):
    def one_test(self):
    global test_index
    test_name = test_names[test_index]
    test_index = test_index + 1
    # Ok for 'aaa' and 'bbb', failure for 'ddd'
    assert test_name in ['aaa', 'bbb']
    >
    for test_name in test_names:
    func_name = 'test_' + test_name
    setattr(Dynamic TestCase, func_name, DynamicTestCase .one_test)
    >
    suite = unittest.makeSu ite(DynamicTest Case, 'test_')
    if not unittest.TextTe stRunner().run( suite).wasSucce ssful():
    sys.exit(1)
    >
    ------- </dynamic_unittes t.py>
    >
    I think this code might help others, so I post it to the group.
    Comments are welcome.
    Here's what your code might look like with closures:

    import sys
    import unittest

    test_names = ['aaa', 'ddd', 'bbb']
    test_names.sort ()

    class DynamicTestCase (unittest.TestC ase):
    pass

    def make_test(test_ name):
    def one_test(self):
    self.assert_(te st_name in ['aaa', 'bbb'])
    return one_test

    for test_name in test_names:
    setattr(Dynamic TestCase, 'test_' + test_name, make_test(test_ name))

    if __name__ == "__main__":
    unittest.main()

    Peter

    Comment

    • Oleg  Paraschenko

      #3
      Re: dynamic unittest

      Hello Peter,

      thanks a lot. I've overlooked this simple way to create the right
      closure.

      --
      Oleg

      Comment

      Working...