Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Python. Генерация юнит-тестов

Anna | 16.06.2014 | нет комментариев
Только ленивый ещё не писал о необходимости писать тесты. Но давайте сознаемся Добросовестно — писать тесты нередко уныло. Исключительно для legacy-кода. Сотни повторяющихся, однообразных строк. Тоска. Что с этим дозволено сделать?

image
Картинка для привлечения внимания. Прекрасный питон, да?

Pythoscope

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

Устанавливаем Pythoscope:

sudo pip install Pythoscope
Примечание

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

sudo apt-get install bzr
bzr branch lp:pythoscope
cd pythoscope/
python setup.py install

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

image

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

# 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

Великолепно! Успешного и легкого тестирования!

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB