2009-02-17 21 views
1

我怎樣才能使python的unittest模塊顯示每個斷言的輸出,而不是在每個測試用例的第一個失敗?如果我能看到完整的故障模式,而不僅僅是第一種故障,那麼調試將變得更容易。使每個斷言的pyunit顯示輸出

在我的情況下,斷言是基於一個包含一個對象加上一些函數名和期望的輸出的數組的循環,所以沒有一個明顯的方法(至少對我來說)只是每一個斷言分離到一個單獨的測試用例:

import unittest 
import get_nodes 

class mytest2(unittest.TestCase): 
    def testfoo(self): 
     root = get_nodes.mmnode_plus.factory('mytree.xml') 

     tests = [ 
      (root, {'skip_traversal': False, 'skip_as_child': True, 'skip_as_parent': False, 'is_leaf': False}), 
      (root[0], {'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False, 'is_leaf': False}), 
      (root[1], {'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}), 
      (root[1][0], {'skip_traversal': True}), 
      (root[0][0], {'is_leaf': False, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False}), 
      (root[0][0][0], {'is_leaf': True, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}), 
      (root[0][4], {'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}), 
      (root[0][7], {'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}), 
     ]  

     for (node, states) in tests: 
      for test_state, exp_result in states.iteritems(): 
       self.assertEqual(node.__getattribute__(test_state)(), exp_result, "unexpected %s for state %s of node %s %s" % (not exp_result, test_state, repr(node), repr(node.__dict__))) 

unittest.main() 

obj.__getattribute__('hello')回報obj.hello所以node.__getattribute__(test_state)()我打電話節點的成員函數名稱存儲在test_state變量的方式。

回答

1

我能夠使新的TestCase類動態使用內置型()工廠做到這一點:

root = get_nodes.mmnode_plus.factory('somenodes.xml') 

tests = [ 
    (root, {'skip_traversal': False, 'skip_as_child': True, 'skip_as_parent': False, 'is_leaf': False}), 
    (root[0], {'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False, 'is_leaf': False}), 
    (root[1], {'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}), 
    (root[1][0], {'skip_traversal': True}), 
    (root[0][0], {'is_leaf': False, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False}), 
    (root[0][0][0], {'is_leaf': True, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}), 
    (root[0][4], {'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}), 
    (root[0][7], {'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}), 
] 

i = 0 
for (node, states) in tests: 
    for test_state, exp_result in states.iteritems(): 

     input = node.__getattribute__(test_state)() 
     errstr = "expected %s, not %s for state %s of node %s" % (input, exp_result, test_state, repr(node)) 

     locals()['foo' + str(i)] = type('foo' + str(i), (unittest.TestCase,), 
      {'input': input, 'exp_result': exp_result, 'errstr': errstr, 'testme': lambda self: self.assertEqual(self.input, self.exp_result, self.errstr)}) 
     i += 1 
2
import unittest 
import get_nodes 

class TestSuper(unittest.TestCase): 
    def setUp(self): 
     self.root = get_nodes.mmnode_plus.factory('mytree.xml') 
    def condition(self, aNode, skip_traversal, skip_as_child, skip_as_parent, is_leaf): 
     self.assertEquals(skip_traversal, aNode.skip_traversal) 
     self.assertEquals(skip_as_child, aNode. skip_as_child) 
     self.assertEquals(skip_as_parent, aNode. skip_as_parent) 
     self.assertEquals(is_leaf , aNode. is_leaf) 

class TestRoot(TestSuper): 
    def testRoot(self): 
     self.condition(self.root, **{'skip_traversal': False, 'skip_as_child': True, 'skip_as_parent': False, 'is_leaf': False}) 

class TestRoot0(TestSuper): 
    def testRoot0(self): 
     self.condition(self.root[0], **{'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False, 'is_leaf': False}) 

class TestRoot1(TestSuper): 
    def testRoot1(self): 
     self.condition(self.root[1], **{'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}) 

class TestRoot10(TestSuper): 
    def testRoot10(self): 
     self.condition(self.root[1][0], **{'skip_traversal': True}) 

class TestRoot00(TestSuper): 
    def testRoot00(self): 
     self.condition(self.root[0][0], **{'is_leaf': False, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': False}) 

class TestRoot0(TestSuper): 
    def testRoot000(self): 
     self.condition(root[0][0][0], **{'is_leaf': True, 'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}) 

class TestRoot04(TestSuper): 
    def testRoot04(self): 
     self.condition(self.root[0][4], **{'skip_traversal': True, 'skip_as_child': True, 'skip_as_parent': True}) 

class TestRoot07(TestSuper): 
    def testRoot07(self): 
     self.condition(self.root[0][7], **{'skip_traversal': False, 'skip_as_child': False, 'skip_as_parent': True}) 

unittest.main() 
+0

不能像這樣被動態地從同一陣列產生的? – 2009-02-17 19:54:36