Добрый день.
Всего восемь ступеней нужно преодолеть начинающему программисту, чтобы быть причисленным к лику небожителей. Восемь ступеней – и Дональд Кнут, Эдсгер Дейкстра, Линус Торвальдс встретят вас хлебом-солью на Олимпе. Только представьте: вы снисходительно похлопываете каждого из них по плечу, устраиваетесь поудобнее, как вдруг… Мартин Фаулер, словно черт из табакерки, вырастает перед глазами. Отбирает каравай и дает вам пинка. Линус пытается вас защитить, но тщетно. Мартин непреклонен: “Парень перепрыгнул через мою ступеньку! Караул! Он ничего не знает про fake, dummy, mock и stub”. И вы смиренно бредете прочь, несолоно хлебавши – осваивать “ступеньку Мартина”.
Или не бредете? Если с test doubles у вас все в порядке, пожалуйста, пропустите этот уровень, разберитесь с Мартином и осваивайте новые рубежи. А мы рассмотрим реализацию заглушек в Python.
Для подготовки компонентов-двойников в Python можно воспользоваться пакетами, специально написанными для этих целей. К примеру, в Stubble предлагается задать метакласс для класса-заглушки и переопределить компоненты исходного класса:
class Stub(object): __metaclass__ = stubble.stubclass(RealClass) def foo(self, a): 'i am a fake foo'
Другой пример – с помощью Fudge заменить метод класса …
import fudge >>> auth = fudge.Fake() >>> def check_user(username): ... if username=='bert': ... print "Bird is the word" ... else: ... print "Access denied" ... >>> auth = auth.provides('show_secret_word_for_user').calls(check_user)
… или просто заставить его выдавать заранее известное значение:
auth = fudge.Fake() >>> user = auth.provides('current_user').returns_fake() >>> user = user.provides('is_logged_in').returns(True)
Между тем, зачастую подобные трюки в Python можно реализовать средствами самого языка (как и в случае с Perl). В качестве иллюстрации возьмем файл account.py, содержащий класс BankAccount, из нашего примера c unittest. Далее создадим файл test.py, в котором переопределим методы deposit и get класса BankAccount:
from account import BankAccount def deposit_fake (self, amount): self.balance += amount*10 def get_stub(self): return 1000 account = BankAccount(30) # Redefine the "deposit" method BankAccount.deposit = deposit_fake account.deposit(50) balance = account.get() print "With deposit_fake: ", balance # Redefine the "get" method BankAccount.get = get_stub balance = account.get() print "With get_stub: ", balance
Сначала, положив на депозит 50 рублей, мы обрели в 10 раз больше (30+50*10=530), затем мы получаем 1000 рублей при любой сумме на счету:
[capt@rh work]# python test.py With deposit_fake: 530 With get_stub: 1000
Но Мартина не проведешь. «Подумаешь, заглушки. Нужно проверять поведение системы. Какие методы вызываются в тех или иных сценариях? Соответствует ли результат нашим ожиданиям?». Мартин, как всегда, прав. Пришло время имитаторов. Оставайтесь с нами.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Pingback : OpenQuality.ru | Взлетная полоса, или введение в mock-объекты | May 13, 2009
[…] заглушки (stubs). Мы рассматривали их реализации в Perl и Python. Они довольно удобны, если воспринимать мир вокруг […]
Автор комментария : Ochir | June 23, 2009
кстати к вопросу о заглушкаих и моках.
Может ли fudge заменить MiniMock? Насколько я понял из описания Fudge, он может использоваться как для заглушек, так и для моков.
[Ответить]
Автор комментария : Капитан Аляска | June 23, 2009
Ochir, думаю, что может. Но я пошел обратным путем: выбрал MiniMock после сравнения с Fudge, Mox и прочими. Привлек минимализм и работа на встроенной функциональности doctest. Есть ли у вас пример из жизни, иллюстрирующий ситуацию, когда MiniMock не хватает и надо смотреть в сторону других mock-framework’ов?
[Ответить]
Автор комментария : Ochir | June 24, 2009
я вообще тоже за минимализм, и пока для моих задач вроде мне хватает minimock, но если вдруг его не хватит можно будет знать что есть fudge
[Ответить]
Pingback : OpenQuality.ru | Качество программного обеспечения | August 1, 2013
[…] • Google Testing Blog: что такое test doubles и с чем их едят. Три года назад на эту тему. […]