سؤال

كيف يمكنني إجراء إظهار النمط التغريد في بيثون لكل تأكيد، بدلا من الفشل في أول حالة اختبار لكل حالة؟ سيكون من الأسهل كثيرا التصحيح إذا كان بإمكاني رؤية النمط الكامل للفشل بدلا من أول واحد فقط.

في حالتي تعتمد التأكيدات على حلقات زوجين عبر مجموعة تحتوي على كائن بالإضافة إلى بعض أسماء الوظائف والإخراج المتوقع (انظر أدناه)، لذلك لا توجد طريقة واضحة (على الأقل بالنسبة لي) لفصل كل تأكيد اختبار منفصل:

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

كنت قادرا على القيام بذلك عن طريق جعل فئات اختبار جديدة ديناميكيا باستخدام نوع المدمج () مصنع:

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top