アサーションごとにpyunit showの出力を作成する

python python-unittest unit-testing
アサーションごとにpyunit showの出力を作成する

テストケースごとに最初の1つが失敗するのではなく、どのようにしてpythonのunittestモジュールにすべてのアサーションの出力を表示させることができますか? 最初のものだけではなく、完全な失敗パターンを見ることができれば、デバッグはずっと簡単になります。

私の場合、アサーションは、オブジェクトといくつかの関数名と期待される出力を含む配列のループを2回繰り返すことに基づいているので(少なくとも私にとっては)、すべてのアサーションを単にに分割する明白な方法はありません。別のテストケース:

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  2


ベストアンサー

import unittest import get_nodes

TestSuper(unittest.TestCase)クラス:def setUp(self):self.root = get_nodes.mmnode_plus.factory( 'mytree.xml')def条件(self、aノード、skip_traversal、skip_as_child、skip_as_parent、is_leaf):self.assertEquals(is skip_traversal、aNode.skip_traversal)self.assertEquals(skip_as_child、aノード) skip_as_child)self.assertEquals(skip_as_parent、aノード) skip_as_parent)self.assertEquals(is_leaf、aノード) is_leaf)

クラスTestRoot(TestSuper):def testRoot(self):self.condition(self.root、** {'skip_traversal':False、 'skip_as_child':True、 'skip_as_parent':False、 'is_leaf':False})

クラスTestRoot0(TestSuper):def testRoot0(self):self.condition(self.root [0]、** {'skip_traversal':False、 'skip_as_child':False、 'skip_as_parent':False、 'is_leaf':False} )

クラスTestRoot1(TestSuper):def testRoot1(self):self.condition(self.root [1]、** {'skip_traversal':True、 'skip_as_child':True、 'skip_as_parent':True})

クラスTestRoot10(TestSuper):def testRoot10(self):self.condition(self.root [1] [0]、** {'skip_traversal':True})

クラス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})

クラスTestRoot0(TestSuper):def testRoot000(self):self.condition(ルート[0] [0] [0]、** {'is_leaf':True、 'skip_traversal':False、 'skip_as_child':False、 'skip_as_parent ':True})

クラスTestRoot04(TestSuper):def testRoot04(self):self.condition(self.root [0] [4]、** {'skip_traversal':True、 'skip_as_child':True、 'skip_as_parent':True})

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

unittest.main()

2


組み込みのtype()ファクトリを使って新しい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})、]

テストの(node、states)の場合、i = 0です。test_stateの場合、states.iteritems()のexp_resultです。

input = node .__ getattribute __(test_state)()errstr = "ノード%sの状態%sでは%sではなく、期待される%s"%(input、exp_result、test_state、repr(node))

locals()['foo' str(i)] =タイプ( 'foo' str(i)、(unittest.TestCase、)、{'input':入力、 'exp_result':exp_result、 'errstr':errstr、 ' testme ':lambda self:self.assertEqual(self.input、self.exp_result、self.errstr)})i = 1

1


タイトルとURLをコピーしました