Тестирование (unittest), если переменная является непустой строкой в python правильным способом?



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


Первое, что я хотел убедиться (с помощью unittests), это то, что 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)


Это приемлемо или я совершаю серьезную ошибку новичка? Ваша обратная связь очень много значит!
516   2  

2 ответов:

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

Да и нет.

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

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

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.

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

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

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

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

Кряк, кряк.

Comments

    Ничего не найдено.