我可以通过使用builtin 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}),
]
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