Тестирование (unittest), если переменная является непустой строкой в ​​Python, правильно? - PullRequest
3 голосов
/ 29 июня 2011

Возможно, этот вопрос тривиален, но я все еще пытаюсь подогреть юнит-тесты в 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 ]

3 голосов
/ 30 июня 2011

Это приемлемо или я совершаю грубую ошибку новичка?

Да и нет.

Это прекрасный пример написания модульного теста.

Но это тот случай использования, который не должен существовать в вашем коде.

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.

2 голосов
/ 29 июня 2011

Если это похоже на утку, то это утка. Не волнуйся так много о типе. Просто попробуйте использовать param. Если вам абсолютно необходимо проверить, что это кажется кошерным, вы всегда можете сделать:

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

... или, если действительно важно, чтобы param был чем-то (а не ничем):

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

Кря, кря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...