?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
Переопредели переопределение
nyaload
_winnie
Там, где в Java люди ради mock-тестирования пишут свой "интерфейс получения случайных чисел", свой "интерфейс файловой системы", "свой интерфейс получения времени" и "интерфейс вызова Sleep()" — программисты на питон просто заменяют в стандартном модуле стандартные функции файловой системы, случайных чисел или даты. В крайнем случае можно даже модуль целиком заменить ( sys.modules["time"] = my_object ), или переопределить функцию импорта модулей.

Сегодня порадовался такому диалогу:

Q: чуваки, я для тестирования переопределил стандартные дату и время, но в стороннем модуле стоит проверка isinstance(obj, datetime)! Что делать?

A: Не тормози, просто переопредели isinstance ( __builtin__.isinstance ) на свою функцию

  • 1
Извращенцы!

>но в стороннем модуле стоит проверка isinstance(obj, datetime)
Статическая типизация по-питоновски. Ужос.

Типично, это pattern-матчинг ADT вида "дата-и-время | дата | строка | число" для GUI/nice-print

Например, передаёшь список дат для графика - и он рисует даты на осях.

Передашь дату в списке для редактора свойст объекта - и он там пишет в локали пользователя "13 мая" и по кнопочке показывает календарь.

Edited at 2013-06-24 05:03 pm (UTC)

Что пишет в локали - это зашибись. А вот что это пиршество духа потом кому-то разгребать приходится...

питон - это какой-то особенный образ мышления

Перловик поступил бы точно так же, лиспер какой-нибудь наверное тоже. Это не питон, это динамические языки.
Там ещё и duck typing в чести, и много других вещей, приводящих правоверных явистов в священный ужас.

В проекте, который у меня сейчас открыт в редакторе, переопределена системная функция die (перловый эквивалент throw). Не для тестов, а вообще. И очень удобно, знаете ли!

я на перле много пописал, полгода даже профессионально, но никогда ничего подобного не делал :) ладно, ок, делал один раз пару месяцев назад впервые и только в виде исключения :)

>isinstance
>duck typing
Я бы предпочёл, чтобы в одном проекте было что-нибудь одно.

словно javascript никогда не видели. Переопределятели методов строк или массивов там просто в мейнстриме продакшена а не тестов как тут. Для тестов это все правильно.

слово видел, а ничего серьезного не писал, только маленькие вспомогательные скриптики на 3-4 строчки

Вообще-то, есть специальные средства для этого. См. модуль abc.

Если в продакшен такое не идёт, то получается, что тесты тестируют не продакшен среду, а нечто другое, и их ценность (в общем случае, YMMV) не вполне убедительна.

А если такое идёт в продакшен то это ёбтваюжемать! :)

Самый брутальный пример, когда лучше тестировать не production - это sleep на сутки в продакшне + работа с датами после sleep

Иногда хочется проверить, что код не падает на rand(), который выдает граничные значения (0 и 1.0 - epsilon). Тоже сложно проверить "по настоящему".

Иногда бывают менее брутальные случаи, когда почему-то хочется тестировать работу именно с виртуальной файловой системой, а не с реальной, пусть даже tmpfs. Может захотеться в цепочке слоёв "логика -> абстрактное получение данных -> поход по http" проверить именно вторую стрелочку, а не первую, но при этом почему-то западло поднять тестовый веб-сервер. Не такие уж необходимые препятствия как в первом случае, но почему-то иногда может хотеться именно "виртуальный веб-сервер через хеш-таблицу" а не "фейковый веб-сервер через TCP-сокеты".

Edited at 2013-06-24 11:52 pm (UTC)

sleep на сутки?!!! O_o

Классический способ вычислить завтрашнюю дату!

"...мать, мать, мать!" привычно отозвалось эхо

впрочем, херня война, я как-то лицезрел sleep(2 года)

ичсх в питончачем коде.

не обязательно sleep (может быть event на наступление определенной даты/времени, cron внутри сервиса)

не обязательно на сутки (достаточно тестирования каких-нибудь минутных и секундных таймаутов)

Edited at 2013-06-25 04:00 pm (UTC)

понятно.
прикольно.

Какая прекрасная возможность отстрелить себе руки и ноги.

  • 1