测试(unittest)如果变量是python中的非空字符串正确吗?

时间:2011-06-29 17:32:36

标签: python string unit-testing

也许这个问题很简单,但我仍然想在python中进行单元测试,所以请耐心等待。 :-)在尝试编写我自己的一些测试时,以下问题进行了评估。假设一个处理非空字符串的函数:

class BadInputError(Exception): pass

class FooBar(object):
    def take_a_string_and_do_something(param):
        if param == '':
            raise BadInputError('param should not be an empty string')
        if param is None:
            raise BadInputError('param should not be None')
        if not isinstance(param, basestring):
            raise BadInputError('param must be of type string)
        # process nonempty string

我想确保(通过单元测试)的第一件事是param只是非空字符串。所以我用这种方式写了我的测试用例。

class TestFooBar(unittest.TestCase):
    def test_take_a_string_and_do_something(self):
        foo = FooBar()
        self.failUnlessRaises(BadInputError, foo.take_a_string_and_do_something, '')
        self.failUnlessRaises(BadInputError, foo.take_a_string_and_do_something, None)
        self.failUnlessRaises(BadInputError, foo.take_a_string_and_do_something, 234)

这是否可以接受或者我是否犯了重大菜鸟错误?您的反馈意味着很多!

2 个答案:

答案 0 :(得分:3)

  

这是否可以接受,或者我是否犯了重大的菜鸟错误?

是和否。

这是如何编写单元测试的一个很好的例子。

但这是一个不应该存在于代码中的用例。

class FooBar(object):
    def take_a_string_and_do_something(self, param):
        # process nonempty string
        # If they couldn't provide a non-empty string, they get an exception.

你仍然可以像这样测试它。

class TestFooBar(unittest.TestCase):
    def setUp( self ):
        self.foo= FooBar()
    def test_zero_length_should_fail(self):
        self.failUnlessRaises(IndexError, foo.take_a_string_and_do_something, '')
    def test_none_should_fail(self):
        self.failUnlessRaises(TypeError, foo.take_a_string_and_do_something, None)
    def test_non_string_should_fail(self):
        self.failUnlessRaises(TypeError, foo.take_a_string_and_do_something, 234)

请注意,它更简单,也更可靠,因为您没有尝试复制Python广泛的内部错误检查。

答案 1 :(得分:2)

如果它看起来像一只鸭子它是一只鸭子。不要太担心类型。试着使用param。如果你绝对必须检查它看起来像犹太洁食,你可以随时做:

if not hasattr(param, 'replace'):
    raise ValueError('I cant work with param')

...或者,如果真正重要的是param是某种东西(而不是什么):

if not param:
    raise ValueError('param should not be empty')

嘎嘎,嘎嘎。