OpenQuality.ru

Качество программного обеспечения

Качество программного обеспечения: в главных ролях

Лента  Радар  Блог  Опыт  
Разум  Видео  Заметки  Эпизоды


Ступень Мартина, или двойники в Python

Добрый день.

Всего восемь ступеней нужно преодолеть начинающему программисту, чтобы быть причисленным к лику небожителей. Восемь ступеней – и Дональд Кнут, Эдсгер Дейкстра, Линус Торвальдс встретят вас хлебом-солью на Олимпе. Только представьте: вы снисходительно похлопываете каждого из них по плечу, устраиваетесь поудобнее, как вдруг… Мартин Фаулер, словно черт из табакерки, вырастает перед глазами. Отбирает каравай и дает вам пинка. Линус пытается вас защитить, но тщетно. Мартин непреклонен: “Парень перепрыгнул через мою ступеньку! Караул! Он ничего не знает про 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

Но Мартина не проведешь. «Подумаешь, заглушки. Нужно проверять поведение системы. Какие методы вызываются в тех или иных сценариях? Соответствует ли результат нашим ожиданиям?». Мартин, как всегда, прав. Пришло время имитаторов. Оставайтесь с нами.

Отправить в Twitter, Facebook, FriendFeed, ВКонтакте | Опубликовано 11.04.2009 в рубрике "Модульные тесты"

Комментарии (5)

  1. Pingback : OpenQuality.ru | Взлетная полоса, или введение в mock-объекты | May 13, 2009

    […] заглушки (stubs). Мы рассматривали их реализации в Perl и Python. Они довольно удобны, если воспринимать мир вокруг […]


  2. Автор комментария : Ochir | June 23, 2009

    кстати к вопросу о заглушкаих и моках.
    Может ли fudge заменить MiniMock? Насколько я понял из описания Fudge, он может использоваться как для заглушек, так и для моков.

    [Ответить]


  3. Автор комментария : Капитан Аляска | June 23, 2009

    Ochir, думаю, что может. Но я пошел обратным путем: выбрал MiniMock после сравнения с Fudge, Mox и прочими. Привлек минимализм и работа на встроенной функциональности doctest. Есть ли у вас пример из жизни, иллюстрирующий ситуацию, когда MiniMock не хватает и надо смотреть в сторону других mock-framework’ов?

    [Ответить]


  4. Автор комментария : Ochir | June 24, 2009

    я вообще тоже за минимализм, и пока для моих задач вроде мне хватает minimock, но если вдруг его не хватит можно будет знать что есть fudge

    [Ответить]


  5. Pingback : OpenQuality.ru | Качество программного обеспечения | August 1, 2013

    […] • Google Testing Blog: что такое test doubles и с чем их едят. Три года назад на эту тему. […]



Добавить комментарий

Пожалуйста, исправьте результат: дважды два равно



КРАТКОЕ СОДЕРЖАНИЕ

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


ПУТЕВОДИТЕЛЬ

Список всех статей с краткой аннотацией и разбивкой по рубрикам. Открыть карту.

ПОДПИСКА

Доступ к самым интересным материалам по электропочте и RSS. Подробности.

ИЩЕЙКА