XP - практика применения.

whirlwind

TDD infected, paranoid
>Согласен почти на 100%

А почему почти? Единственный вариант при котором я хоть как то могу оправдать использование мока, это самые первые препервые тесты, когда модель еще настолько абстрактна, что раскошеливаться на реальный класс рано. А еще какие могут быть варианты?
 

Crazy

Developer
Автор оригинала: whirlwind
ИМХО, дык лучше тест слетит, раньше чем софт. Они как раз для этого и нужны, в смысле тесты.
itprog говорит о том, что тесты, которые адекватно указывают на конкретный проблеммный класс, более полезны чем те, которые говорят "а у вас что-то сломалось". При чем здесь отказ от тестов и слетание софта?
 

robocomp

Новичок
Автор оригинала: pachanga
Стоп, я это знаю прекрасно. Вопрос-то был о другом. Конечно, наличие тестов лучше чем их полное отсутствие, однако вся мощь тестов раскрывается именно при работе в стиле TDD, а в конторе robocomp, выходит, вначале пишется готовая имплементация, и только потом тесты. Вот об этом я и спрашивал.
Извините за оверквотинг и, наверное, ниже кто-то дал ответ на этот вопрос.
Но я отвечу тоже, раз уж вопрос был ко мне.

Нет, тесты не пишутся после реализации -- это сложно через чур, так тесты писать.

Я только ли хотел сказать, что проектирование ведётся в диаграммах УМЛ и программисты получают картинку класса, который надо накодить. И код класса сопровождают тестами

-~{}~ 18.02.06 12:34:

Автор оригинала: whirlwind


>Но ведь если объект "B", с которым работает тестируемый объект "A", окажется неправильно рабочим, то слетит и тест для класса "A".

ИМХО, дык лучше тест слетит, раньше чем софт. Они как раз для этого и нужны, в смысле тесты.
Сам делаю так же, в принципе. В смысле, моки не использовал в последнем проекте, только вот в новом стану.

Но ты не совсме прав, мне кажется. Лучше пусть слетит тест для класса Б, если сломался класс Б. тесту класса А слетать не надо. Это тоже относится к изоляции

-~{}~ 18.02.06 12:37:

Автор оригинала: whirlwind
>Согласен почти на 100%

А почему почти? Единственный вариант при котором я хоть как то могу оправдать использование мока, это самые первые препервые тесты, когда модель еще настолько абстрактна, что раскошеливаться на реальный класс рано. А еще какие могут быть варианты?
Ещё есть вот какой вариант -- у тебя просто нет классов реальных. А программисты есть. И ты можешь дать им каждому разработать класс (да-да, мне тоже не нравится такой подход, но вот у нас в реальности он используется и, наверное, работает). допустиам, прогрммист Василий получает задание разбработать класс, который использует класс Б, который разрабатывает Иван. КЛасса б нет. Ни в каком виде. Василий делает мок и разрабатывает класс свой. И все зашибись

-~{}~ 18.02.06 12:40:

О постоянной интеграции был вопрос.

В кратце, из репозитория извлекается текущая версия, по ней проъодят модульны тесты, склывадется их результат в файл.
spikephpcoverage строит отчёт о покрытии кода тестами. (довольно гадкий отчёт -- всё не работает -))

Проводится тест на соответствие стандарту кодирования, результат складывается в отчёт.
 

pachanga

Новичок
Я только ли хотел сказать, что проектирование ведётся в диаграммах УМЛ и программисты получают картинку класса, который надо накодить. И код класса сопровождают тестами
Т.е. вы выделяете некоторого архитектора, который занимается чисто дизайном и команду программистов, которые пытаются "натянуть" дизайн на имплементацию? Если это так, то я ярый противник такого подхода... Мне вот интересно, у вас рассогласования дизайна и имплементации бывают? Какова продолжительность жизни UML диаграм?

В кратце, из репозитория извлекается текущая версия, по ней проъодят модульны тесты, склывадется их результат в файл
Реальный пример такого файла можешь привести? Мне очень любопытно.

-~{}~ 18.02.06 14:04:

Автор оригинала: whirlwind
А почему почти? Единственный вариант при котором я хоть как то могу оправдать использование мока, это самые первые препервые тесты, когда модель еще настолько абстрактна, что раскошеливаться на реальный класс рано. А еще какие могут быть варианты?
Теперь, мне кажется, я понял, что ты имел в виду под изоляцией тестов. Ты, наверное, имел в виду изолирование тестируемых сущностей друг от друга, так? Если да, то в таких ситуациях мы все же стараемся использовать моки или стабы, хотя все зависит от конкретной ситуации. Порой бывают такие случаи, когда необходимо протестировать все граничные ситуации работы одного объекта, в зависимости от другого. Пользоваться реальной имплементацией становится обычно довольно трудоемко, и здесь на помощь приходят моки. Но повторюсь, слишком злоупотреблять этим нельзя, и обычно на страже стоят не очень детальные тесты более высшего уровня.

Один из таких возможных примеров:

PHP:
class TestAcceptor{
    function accept($char){}
}
Mock :: generate('TestAcceptor', 'MockAcceptor');
function testParse() {
    $acceptor = new MockAcceptor();
    $acceptor->expectArgumentsAt(0, "accept", array("a"));
    $acceptor->expectArgumentsAt(1, "accept", array("b"));
    $acceptor->expectCallCount("accept", 2);
    $acceptor->setReturnValue("accept", true);    
    $parser = new AlphabeticCharsStringParser($acceptor);    
    $this->assertTrue($parser->parse("a...b.."));    
}
Здесь как раз такой случай, когда непонятно, что из себя будет представлять реальный класс, поэтому в целях тестирования AlphabeticCharsStringParser был заведен псевдо-класс TestAcceptor(в принципе, можно было бы сделать псевдо-интерфейс), на который потом вешается мок.

С другой стороны, этот тест можно переписать при помощи стаба:

PHP:
class StubAcceptor {
    var $result = '';
    function accept($char) {
        $this->result .= $char;
        return true;
    }
}
function testParse() {
    $acceptor = new StubAcceptor();
    $parser = new AlphabeticCharsStringParser($acceptor);    
    $this->assertTrue($parser->parse("a...b.."));   
    $this->assertEqual($this->acceptor->result, "ab");
}
Получается намного короче и изящнее, не так ли? И в этом случае я бы воспользовался именно стабом.

Однако бывают такие случаи, когда необходимо менять поведение инъецируемой сущности в целях тестирования различных ситуаций. В моем примере и мок, и стаб возвращают true при любом обращении к accept, но, естественно, это не всегда может быть верно, а без этого граничные ситуации протестировать невозможно. Вот здесь, как раз, и проявляется сильная сторона моков, т.к. вся необходимая инфраструктура для этого в них уже встроена. Можно, конечно, стаб также научить по-разному реагировать на различные обращения к accept, но из-за этого читабельность теста может сильно пострадать, поэтому обычно отдается предпочтение моку.

Это я все к тому, что однозначного ответа здесь нет, да и быть не должно. Поэтому я против полного отрицания моков ;)

-~{}~ 18.02.06 14:14:

допустиам, прогрммист Василий получает задание разбработать класс, который использует класс Б, который разрабатывает Иван. КЛасса б нет. Ни в каком виде. Василий делает мок и разрабатывает класс свой. И все зашибись
Вряд ли картина настолько идеальна. Если класса Б еще нет, то придумать под него интерфейс заранее крайне сложно. У нас возникали ситуации, когда неудобства использования Б новым классом, назовем его А, заставляли Б полностью переписывать. Поэтому в этой ситуации идеальным является разработка и Б, и А в паре Василия вместе с Иваном.
 

robocomp

Новичок
Автор оригинала: pachanga

Реальный пример такого файла можешь привести? Мне очень любопытно.

-~{}~ 18.02.06 14:04:
Это просто результат работы simpletest в html. ничего особо интересного в этом файле нет.

Подход насчёт умл действительно не очень работоспособен, тут ничего не скажешь. Но так работать вполне можно. Диаграммы модифицируются. И срок их жизни ровно такой же, как у код.

Но мне лично ближе подход, когда нет архитектора и кодеров и когда границы размыты. Когда не надо согласовывать добавление метода в класс с архитектором письменно и т.п. -))

Но такой подход работает не всегда.

-~{}~ 19.02.06 14:21:

Автор оригинала: pachanga

Реальный пример такого файла можешь привести? Мне очень любопытно.

-~{}~ 18.02.06 14:04:
Это просто результат работы simpletest в html. ничего особо интересного в этом файле нет.

Подход насчёт умл действительно не очень работоспособен, тут ничего не скажешь. Но так работать вполне можно. Диаграммы модифицируются. И срок их жизни ровно такой же, как у код.

Но мне лично ближе подход, когда нет архитектора и кодеров и когда границы размыты. Когда не надо согласовывать добавление метода в класс с архитектором письменно и т.п. -))

Но такой подход работает не всегда.
 
Сверху