MyTetra Share
Делитесь знаниями!
статья unittest
Время создания: 31.08.2017 21:01
Текстовые метки: knowledge
Раздел: Python - unittests - example - Cat
Запись: xintrea/mytetra_db_mcold/master/base/1501834539yvctunb7v6/text.html на raw.githubusercontent.com

Pythoscope

Благо, мы программисты — народ ленивый, готовы убить пару недель для того, что бы решить часовую задачу за пять минут. Так что за несколько минут гугления в яндексе я нашел коллег по несчастью и интересное решение по облегчению написания тестов. Устанавливаем Pythoscope:

sudo pip install Pythoscope


Примечание

К сожалению, у stable-ветки проблемы с юникодом. Для тестовых целей сойдет и она, но для реального применения лучше воспользоваться dev-веткой, благо она работает стабильно:

sudo apt-get install bzr

bzr branch lp:pythoscope

cd pythoscope/

python setup.py install




Протестируем кота

Что бы тестировать кота, нам сначала собственно нужен кот. Напишем его:

# cat.py

class Cat(object):

def __init__(self, name='Tom'):

self.name = name


def eat(self, food):

if food == 'fish':

return 'Yummy!'

else:

return 'Ugh!'


Теперь перейдем в папку с cat.py и инициализируем Pythoscope:

pythoscope --init


Команда создаст папку .pythoscope, где хранится вся информация, связанная с Pythoscope. А теперь, наконец, генерация собственно тестов:

pythoscope cat.py


У нас появилась папка tests с вложенным cat_test.py. В котором… Почти ничего нет:

# tests/cat_test.py

import unittest


class TestCat(unittest.TestCase):

def test___init__(self):

# cat = Cat(name)

assert False # TODO: implement your test here


def test_eat(self):

# cat = Cat(name)

# self.assertEqual(expected, cat.eat(food))

assert False # TODO: implement your test here


if __name__ == '__main__':

unittest.main()


Негусто? Ну, по крайней мере теперь есть каркас, который будет экономить нам время при написании тестов. Как выяснилось, магии не бывает — тесты сами не напишутся. Но не всё потеряно, мы можем помочь Pythoscope понять, что запускать для тестов. Для этого реализавны, так называемые «точки входа» (points of entry) — некие use-case использования нашего кода. Напишем points of entry для нашего котэ:

# .pythoscope/points-of-entry/eat_fish_poe.py


from cat import Cat

Cat().eat('fish')


Запустим еще раз генерацию тестов:

pythoscope cat.py


Теперь лучше, к тестовому классу добавился метод который действительно что-то тестирует:

# tests/cat_test.py

...


def test_eat_returns_Yummy_for_fish_after_creation_with_Tom(self):

cat = Cat('Tom')

self.assertEqual('Yummy!', cat.eat('fish'))


...


А что если подсунуть котэ не рыбу? Ошибка? Надо и это проверить:

# .pythoscope/points-of-entry/eat_tomato_poe.py


from cat import Cat

Cat().eat('tomato')


Генерируем:

pythoscope cat.py


Отлично, осталось лишь проверить:

nosetests


..

----------------------------------------------------------------------

Ran 2 tests in 0.001s


OK



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования