Уведомления

Группа в Telegram: @pythonsu

#1 Март 7, 2014 17:29:03

the_author
Зарегистрирован: 2014-03-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Юнит тест

Здравствуйте

Есть некая функция foo, на вход которой идет строка s, эта функция сверяет её с шаблоном и выдаёт True (совпадает с шаблоном) или False (не совпадает с шаблоном).

Каким образом лучше протестировать работу этой функции?

Будет ли удовлетворительным, если составить юнит тест типа:

import unittest
import foo
class TestFoo(unittest.TestCase):
    right_examples = (...,
                               ...,
                               ...)
    wrong_examples = (...,
                                 ...,
                                 ...)
    def test_right(self):
        '''foo should give True result with right input'''
        for s in self.right_examples:
            result = foo.foo(s)
            self.assertEqual(True, result)
    def test_wrong(self):
        '''foo should give False result with wrong input'''
        for s in self.wrong_examples:
            result = foo.foo(s)
            self.assertEqual(False, result)
if __name__ == '__main__':
    unittest.main()

Офлайн

#2 Март 7, 2014 18:37:51

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Юнит тест

:) Обычно еще тестируют подачей не строки. Тест должен по возможности покрывать все возможные варианты. Правильно вы тестируете или нет можно понять только если вы шаблон приведете и контрольные строки.



Офлайн

#3 Март 7, 2014 19:59:16

the_author
Зарегистрирован: 2014-03-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Юнит тест

doza_and
Обычно еще тестируют подачей не строки.
То есть для полного тестирования желательно добавить подобный метод? :
    def test_not_a_string(self):
        '''foo should fail with not a string input'''
        self.assertRaises(foo.TypeError , foo.foo, 57)
И если я добавлю этот метод, то тест будет выдавать error в заключении. Это как бы ожидаемая ошибка. Нужно ли try-except добавлять в функцию foo? Или как сделать, чтобы юнит тест прошел на “ОК” в этом случае?

doza_and
Тест должен по возможности покрывать все возможные варианты. Правильно вы тестируете или нет можно понять только если вы шаблон приведете и контрольные строки.
Тестируется название электронной почты на удовлетворение неким правилам. Соответственно в right_examples лежат названия эл. почты, удовлетворяющие правилам, а в wrong_examples - вручную набранные неверные названия (на каждое правило по примеру).

Офлайн

#4 Март 7, 2014 20:17:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Юнит тест

the_author
Каким образом лучше протестировать работу этой функции?
во-первых, подумай, как бы ты проверял её вручную, что бы ты проверял, на каких моментах она может сломаться
потом делаешь один тест, который это всё проверяет
когда он сделан, начинаешь его разносить по разным тестам
тесты нужно называть информативно

the_author
self.assertEqual(True, result)
используй специальные assert'ы (self.assertTrue)

dip3. unittests
dip3. unittests. refactoring



Офлайн

#5 Март 7, 2014 20:22:47

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Юнит тест

the_author
Каким образом лучше протестировать работу этой функции?

Проанализировать требования, предъявляемые к функциональности и используя классы эквивалентности, составить набор данных, для тестов.

Чтобы понимать, как работает логика тестировщика, попробуй протестировать карандаш или стул. После этого, у тебя не будут возникать подобные вопросы.



Отредактировано Budulianin (Март 7, 2014 20:47:15)

Офлайн

#6 Март 7, 2014 20:24:26

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Юнит тест

the_author
Тестируется название электронной почты на удовлетворение неким правилам.

Это классическая задача, есть куча примеров её решения.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version