Comments 15
Красиво, да. Но если к каждой рабочей функции цеплять тесты, то у нее появиться существенный оверхед, не так ли?
Абсолютно нет! ) Заметьте:
Декоратор возвращает функцию неизменной! Т.е. оверхед будет только на запуске на прогонку тест-кейсов. Дальше код будет работать с прежней скоростью.
def decor(f):
check(f)
return f
Декоратор возвращает функцию неизменной! Т.е. оверхед будет только на запуске на прогонку тест-кейсов. Дальше код будет работать с прежней скоростью.
Но до того, как возвратить, тестирует. Т.е. оверхед будет не при запуске на прогонку тест-кейсов, а при импорте. Ну или, если угодно, запуск на прогонку будет при импорте, в отличии от обычных доктестов и юнит-тестов, которые выполняются по требованию.
Иногда это вполне допустимо, но как универсальное решение — не катит точно. Универсальное решение с похожим подходом и без оверхеда — обычные доктесты.
Иногда это вполне допустимо, но как универсальное решение — не катит точно. Универсальное решение с похожим подходом и без оверхеда — обычные доктесты.
Протестовать не буду, тут все верно. На универсальность не разу не претендовал, ибо.
По поводу «оверхед будет не при запуске на прогонку тест-кейсов, а при импорте» при желании можно сообразить что-то типа
Пост писался не только для практической пользы, сколько еще для того, что может оказаться кому-то полезным примером в написании декораторов.
По поводу «оверхед будет не при запуске на прогонку тест-кейсов, а при импорте» при желании можно сообразить что-то типа
import should
should.not_check() # отменяет тесты.
Пост писался не только для практической пользы, сколько еще для того, что может оказаться кому-то полезным примером в написании декораторов.
BDD в Python стиле.
очень хорошо, спасибо.
я бы еще добавил should.not_throw_anything()
и как-то в таком стиле бы еще сделать инвариантность…
очень хорошо, спасибо.
я бы еще добавил should.not_throw_anything()
и как-то в таком стиле бы еще сделать инвариантность…
Идея красивая. Но имхо код загромождается. Я за то, чтобы хранить тест-кейсы в отдельном месте.
засорять код тестами считается «полезно»?
не согласен со словом «засорять», по-этому считаю вопрос бессмысленным. Вы же, например, не станете протестовать против «засорения» кода Javadoc'ами? Так что плохого в таком подходе?
формально, это не тесты, а утверждения. На месте автора, я бы еще поиграл с читабельностью этого кода.
например так:
но думаю, есть лучшие варианты.
@should.throw((1,0), Exception)
@should.give((5,2),7)
например так:
@should.throw(Exception).when(1,0)
@should.give(7).when(5,2)
но думаю, есть лучшие варианты.
С python'ом знаком недавно. К сожалению не понял, а чем предлагаемый вариант лучше doc-текстов? К томуже доктесты — это еще и автоматическая документация =) Да и возможностей (из коробки) у доктестов значительно больше.
доктест понятнее
def div(a, b): """ >>> div(1, 0) Traceback (most recent call last): ... ZeroDivisionError: integer division or modulo by zero """ return a / b def add(a, b): """ >>> add(5, 2) 7 >>> add('aa', 'bbb') 'aabbb' >>> add([1], [2, 3]) [1, 2, 3] """ return a + b
>> Тем кто не знаком с декораторами — ссылка для ознакомления.
Как меня замучали «умники»… Уже просто в печенках сидит…
— О смотрите, я знаю что такое Гугл и я могу вас туда послать… Ух какой я умный!
PS: А за сам пост и интересный декоратор спасибо :)
Как меня замучали «умники»… Уже просто в печенках сидит…
— О смотрите, я знаю что такое Гугл и я могу вас туда послать… Ух какой я умный!
PS: А за сам пост и интересный декоратор спасибо :)
Sign up to leave a comment.
(Python) Парочка полезных декораторов