如何在没有全局变量的情况下将参数发送到UnitTest

时间:2015-06-08 10:33:29

标签: python unit-testing python-unittest

问题

是的我知道你不应该向unittest发送参数,但在这种情况下我必须这样才能访问当前框架中的一块硬件。由于细节无关的原因,我不能在测试中使用简单的board = myBoard.getBoard()方法,否则我不会在这里问你们所有人。

可怕的尝试1

class Test(object):

    @staticmethod   
    def __call__(board):

        _board = board
        global _board

        logging.info('Entering a Unit Test')

        suite = unittest.TestLoader()
        suite = suite.loadTestsFromTestCase(TestCase)
        unittest.TextTestRunner().run(suite)

将要求此方法在某个点执行单元测试。这是在当前框架中设置的方式,我只是遵循规则。

你可以在这里看到我分配一个全局变量(可怕)。然后可以通过测试方法轻松访问:

class TestCase(unittest.TestCase):

    def runTest(self):
        logging.critical('running')

    def setUp(self):
        logging.critical('setup')

    def test_Me(self):
        logging.critical('me')

结果是它不会进入runTest,但会在每个setUp方法之前test_。几乎是我想要的,我可以处理它而不是进入runTest

可怕的尝试2

我想做上面但没有全局变量所以我尝试了这个方法:

class Test(object):
    @staticmethod   
    def __call__(board):

        logging.info('Entering a basic Unit Test')

        suite = unittest.TestSuite() #creates a suite for testing
        suite.addTest(BasicCase(board))
        unittest.TextTestRunner().run(suite)

class BasicCase(unittest.TestCase):
    def __init__(self, board):

        self.board = board
        logging.critical('init')

        super(BasicCase, self).__init__()    

    def runTest(self):
        logging.critical('runtest')

    def setUp(self):
        logging.critical('reset')
        infra.Reset.__call__(self.board) #allows me to pass the board in a much nicer way

    def test_Connect(self):
        logging.critical('connection')

上述问题是,它显然只会initsetUprunTest,但它会错过任何test_方法。

如果我添加:

suite.addTest(BasicCase(board).test_Connect)

然后它不必要地调用init两次,我必须向test_Connect添加一个额外的成员变量来接受test对象。我也可以处理这个问题,因为我可以返回test_方法的列表,但这似乎很难。此外,我不认为它每次进入新的setUp方法时都会运行test_。不理想。

所以......

那么我可以使用其他一些方法,允许我快速运行所有类似单元测试但允许我传递board对象吗?

如果我应该使用不同的python模块,那么请说明,但我使用unittest,因为我得到了可爱的输出和assert方法。

0 个答案:

没有答案