Заставьте pyunit показывать выходные данные для каждого утверждения
-
05-09-2019 - |
Вопрос
Как я могу заставить модуль unittest python показывать выходные данные для каждого утверждения, а не завершаться неудачей при первом из них для каждого тестового примера?Было бы намного проще отлаживать, если бы я мог видеть полный набор сбоев, а не только первый.
В моем случае утверждения основаны на паре циклов над массивом, содержащим объект плюс некоторые имена функций и ожидаемый результат (см. Ниже), поэтому нет очевидного способа (по крайней мере, для меня) просто разделить каждое утверждение на отдельный тестовый набор:
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.
Решение 2
Я смог сделать это, создав новые классы TestCase динамически, используя встроенную фабрику type():
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
Другие советы
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()