Domanda

Come posso fare unittest modulo Visualizza Valori di pitone per ogni affermazione, piuttosto che in mancanza al primo uno per ogni banco di prova? Sarebbe molto più facile per eseguire il debug se potessi vedere il motivo completo di fallimenti piuttosto che solo il primo.

Nel mio caso le asserzioni si basano su un paio loop su un array contenente un oggetto più alcuni nomi delle funzioni e l'uscita prevista (vedi sotto), quindi non c'è un modo ovvio (almeno a me) ad appena separata ogni asserzione in un TestCase separata:

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()

ritorna obj.__getattribute__('hello') obj.hello così node.__getattribute__(test_state)() è il mio modo di chiamare la funzione di membro del nodo il cui nome è memorizzato nella variabile test_state.

È stato utile?

Soluzione 2

Sono stato in grado di farlo, facendo nuove classi di test case che utilizzano in modo dinamico la fabbrica costruita nel tipo ():

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

Altri suggerimenti

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top