Готовый перевод The Art of Unit Testing / Искусство модульного тестирования: Foreword
Предисловие ко второму изданию
Дело было, кажется, в 2009. Я выступал на норвежской конференции разработчиков в Осло (ах, Осло в июне!). Все действие происходило на огромной спортивной арене. Организаторы разбили зрительские трибуны на секции напротив которых были установлены подмостки, и шторами из плотной черной ткани разделили пространство на восемь отдельных "залов". Помниться, я как раз заканчивал свой доклад который был не то о TDD, не то о SOLID, не то вообще об астрономии или
еще о чем-то, когда внезапно из соседней секции раздался громкий и хриплый голос, поющий под гитару.
Шторы висели так, что я смог заглянуть за них и увидеть того парня из соседней секции, который производил весь этот шум. Конечно, им оказался Рой Ошероув.
Тут, те, кому я знаком, вспомнят, что прерваться на песню посреди технического доклада о программном обеспечении вполне в моем духе. По-этому, врнувшись к моей аудитории, я подумал, что этот Ошероув близок мне по духу, и что мне следует поближе познакомиться с ним.
Это я и сделал - узнал его получше. А на деле, это он сделал значительный вклад в мою новую книгу "The Clean Coder", а также преподавал со мной три дня в классе TDD. Эти впечатления с Роем были весьма позитивными, и я надеюсь их гораздо больше.
Полагаю, что ваше знакомство с Роем во время чтения этой книги будет позитивным, так как эта книга - нечто особенное.
Вы когда-нибудь читали саги Миченера? Я - нет, но мне рассказывали, что они все начинаются в “атоме”. Книга, которую Вы держите, не является рассказом Джеймса Миченера, но она действительно начинается в атоме — атоме модульного тестирования.
Не заблуждайтесь, листая первые страницы. Это не простое введение в модульное тестирование. Это начало пути, и если вы опытны, вы можете бегло посмотреть первые главы. По ходу книги, главы, основываясь друг на друге, погружают вас на новую глубину. Действительно, если прочитать последнюю главу (не зная, что она последняя), я бы подумал, что следующая глава расскажет о мире во всем мире — серьезно, а что бы вы стали делать дальше, если бы решили проблему модульного тестирования в костных организациях с старыми традиционными системами?
Эта книга техническая - глубоко техническая. Тут много кода. Это хорошая вещь. Но Рой не ограничивает себя техническим. Время от времени он достает гитару и прерывается на песню, рассказывая анекдоты из своего профессионального прошлого, или философствует о смысле дизайна, или определения интеграции. Он, похоже, любит рассказывать об ошибках, которые он сделал в далеком темном прошлом 2006-го.
Да, и не волнуйтесь, что весь код написан на C#. Я имею в виду, разве кто-то может отличить C# и Java? В любом случае – это не важно. C# использован только для примера, в то время как сами концепции могут применяться и к Java, и C, Ruby, Python, Php и любому другому языку программирования (за исключением разве что COBOL).
Будь вы новичёк в модульном тестировании и разработке через тестирование или уже опытны в этих вопросах, в любом случае вы найдете что-то полезное для себя. Так что будьте готовы к удовольствию услышать как Рой споет вам песню "Искусство Модульного Тестирования".
Рой, пожалуйста, настрой гитару.
Роберт Сесил Мартин (Дядя Боб) CLEANCODER.COM
Предисловие к первому изданию
Когда Рой Ошероув сказал мне что что он работал над книгой о модульном тестировании, я был очень рад услышать это. Тема тестирования приобретала все большее значение в последние несколько лет, но при этом ощущался острый недостаток материалов по модульному тестированию. Посмотрев на свою книжную полку я увидел книги о разработке через тестирование, о тестировании в целом, но там не было ни одного полноценного руководства по модульному тестированию – ни одной книги которая бы раскрывала тему и и вела читателя от первых шагов к общепринятым практикам. Это ошеломляющая правда. Но ведь модульное тестирование это далеко не новая практика. Как же так получилось?
Наша индустрия очень молодая. Математики заложили основы нашей работы менее 100 лет назад, но "железо" для реализации их мыслей появилось 60 лет назад. Мы только сейчас обнаружили, как начальная разница между и теорией и практикой повлияла на нашу индустрию.
В начале машинные циклы был дорогостоящими. Мы запускали программы пакетами. У программистов было выделенное по расписанию время, и они "пробивали" свои программы на перфокартах и шли в машинный зал. Если программа работала неправильно, вы потеряли вашем время, поэтому вы проверяли листинг программы с ручкой, обрабатывая все сценарии выполнения в голове, все граничные случаи. Я сомневаюсь что в то время идея автоматизированного тестирования представлялась возможной. Зачем использовать машины для тестирования, когда ты можешь использовать их для решения проблем. Дефицит привел нас к темной стороне.
Позже, когда машины стали быстрее, мы опьянели от интерактивного вычисления. Мы можем просто набирать код и менять его как пожелаем. Идея проверки кода "на столе" исчезла и мы потеряли часть дисциплинированности, присущей истокам. Мы знали что программирование - это тяжело, но это значило лишь то, что мы стали больше времени проводить у компьютера, изменяя строки и символы, пока не найдем магическое заклинание, которое работает.
Мы прошли от дефицита к избытку и потеряли середину, но сейчас мы ее восстанавливаем. Автоматизированное модульное тестирование объединяет дисциплину проверки кода "на столе" с вновь приобретенной признательностью к компьютеру, как ресурсу разработки. Мы можем писать автоматизированные тесты на языке разработки, чтобы проверять нашу работу, но не единожды, а так часто, как необходимо. Я не думаю, что есть какая-то столь же мощная практика в разработке программного обеспечения.
Я написал это в 2009. Я был счастлив увидев книгу Роя в печатном варианте. Это практическое руководство поможет вам начать и послужит справочником для решения ваших тестовых задачах. "Искусство Модульного Тестирования" это не книга о идеальном сценарии. Она научит вас как тестировать код как есть, как получить преимущество при использовании общих библиотек, и, что важно, как написать код, который легко протестировать.
"Искусство Модульного Тестирования" - это важный заголовок который был написан годом ранее, но мы не оказались готовы к нему. Сейчас мы готовы. Наслаждайтесь.
Майкл Физерс
Предисловие
Самым провальным проектом, над которым я работал, был проект в котором были модульные тесты.Или я так думал. Я был руководителем группы программистов, разрабатывающих систему выставления счетов и мы проводили полный цикл разработки через тестирование - писали тест, потом писали код, видели что тест провалился, исправляли код, переписывали код и начинали все снова.
Первое время все было хорошо. Думали что хорошо, и у нас были тесты которые показывали, что наш код работает. Но со временем, изменились требования. Мы начали оперативно менять наш код, чтобы соответствовать новым требованиям, и когда мы это делали, тесты ломались, и их нужно было исправлять. Код работал, но наши тесты были настолько слабыми что любое изменение кода приводило к поломке теста, хотя код продолжал корректно работать.
Что еще хуже, некоторые тесты стали непригодным для использования, потому что люди, которые написали их покинули проект, и никто не знал, что проверяют эти тесты, и что с ними делать. Имена которые мы давали тестовым функциям, ни о чем нам не говорили, и нам пришлось тестировать через другие функции. Закончилось тем, что за пол года мы выбросили большую часть тестов.
Проект был обречен на провал, потому что мы тратили на тесты больше времени, чем на код. Тестирование занимало много времени на обслуживание, вера что они нас спасут в долгосрочной перспективе угасла и мы отказались от тестирования. Я ушел в другие проекты, где мы больше внимания уделяли качеству тестов, и мы добились лучших результатов, экономя много времени на отладке и интеграции. Благодаря первому проваленному проекту, я сформировал ряд практик при использовании модульных тестов, и использую их от проекта к проекту. В каждом новом проекте, с которым я работаю, формируются новые практики работы с модульными тестами.
Понимания как написать модульный тест, как сделать его обслуживаемым, читаемым, доверяемым - обо всем рассказано в этой книге, не важно каким языком или средой разработки вы пользуетесь. Это книга рассказывает об основных принципах написания модульных тестов, тестов-взаимодействия, и показывает лучшие практики для написания, управления и обслуживания модульных тестов в реальном мире.
Благодарности
Я выражаю благодарность Майклу Стефансу и Нермине Миллер из Mannig, которые прошли со мной все шаги этого длинного пути, помогли опубликовать эту книгу. Так же спасибо всем в Manning, кто работал над вторым изданием на передовой и за кулисами.
Спасибо Джим Ньюкирк, Майкал Физерс, Жерард Меззарос, и многим другим, кто делился со мной идеями, для создания этой книги. И отдельная благодарность Дяде Бобу Мартину, за предисловие ко второму изданию.
Дальше список лиц прочитавших рукопись на различных этапах ее развития. Я благодарен им за обратную связь. Aaron Colcord, Alessandro Campeism, Alessandro Gallo, Bill Sorensen, Bruno Sonnino, Camal Cakar, David Madouros, Dr. Frances Buontempo, Dror Helper, Francesco Goggi, Iván Pazmiño, Jason Hales, João Angelo, Kaleb Pederson, Karl Metivier, Martin Skurla, Martyn Fletcher, Paul Stack, Philip Lee, Pradeep Chellappan, Raphael Faria, и Tim Sloan. Так же спасибо Rickard Nilsson, который сделал корректировку рукописи перед публикацией.
И напоследок, хочется сказать спасибо всем читателям книги Manning’s Early Access Program за ваши комментарии на форуме. Вы помогли сделать книгу лучше.
Об этой книге
Одна из самых умных вещей, которую я когда либо слышал от кого-то об обучении (и я забыл кто это был), чтобы научиться чему-то, учи других. Работа над первым изданием книги и публикация в 2009 оказались ничтожно малым учительским опытом для меня. Изначально я писал книгу, потому что устал от одних и тех же вопросов. Но были и другие причины. Я хотел попробовать что-то новое; Я хотел поэкспериментировать; Мне было интересно чему я могу научиться в процессе написания книги, неважно какой. Модульное тестирование было тем, в чем я был хорош. Я так думал. Проклятье в том, что чем более ты опытен, тем глупее себя чувствуешь.
В первом издании есть части с которыми сегодня я не согласен - например, что модуль относится к методу. Это не всегда правда. Модуль - это единица работы, что обсуждается в первой части второго издания. Он может быть маленьким, как метод, или большим, как несколько классов (возможно сборок) ... и есть другие изменения, как вы увидите ниже.
Изменения во втором издании
Во втором издании, Я добавил материал о сравнении ограниченной и неограниченной изоляции общих библиотек и новую главу 6 о том, как добиться хорошей изоляции общей библиотеки и как общая библиотека Typemock работает внутри.
Я больше не использую RhinoMocks. Держитесь в стороне от неё, она умерла, по крайней мере пока. Я использую NSubstitute для примеров принципов изоляции общей библиотеки. Я так же рекомендую FakeItEasy. Я не схожу с ума по поводу MOQ, по причинам описанных в главе 6.
В главе о внедрении модульного тестирования на предприятии добавлены новые технологии внедрения.
Есть много конструктивных изменений в коде. В большинстве случаев, я перестал использовать свойства и больше использовать внедрение конструктора. Немного рассуждений о принципах SOLID, чтобы подготовить почву для будущего.
Разделы, связанные со сборкой части 7 также содержат новую информацию. Я узнал много нового об автоматизации и шаблонах со времени первого издания
Я не рекомендую методов настройки и даю альтернативные идеи для получения той же функциональности вне ваших тестов. Я также использую более новые версии Nunit, поэтому некоторые из новшеств Nunit изменены в книге.
В главе 10, инструменты для совместимости, после обновления кода.
Поработав с Ruby последние 3 года, дали мне больше перспектив о дизайне и тестировании аргументов, что отражено в 11 главе. Инструменты и библиотеки обновлены новыми инструментами а старые инструменты удалены.
Для кого эта книга
Эта книга может быть полезна всем кто занимается разработкой программного обеспечения. Все примеры приведены на языке C#, но они так же могут быть полезны другим разработчикам для платформы .NET,а так же разработчикам на других объектно-ориентированных языков программирования со статической типизацией (VB.NET, Java, C++). Если вы архитектор ПО, разработчик, менеджер проекта, специалист тех. поддержки или начинающий разработчик - эта книга будет полезна для вас.
Рекомендации к прочтению
Если вы никогда не писали модульных тестов, то книгу лучше читать от начала до конца, так вы получите полную картину. Если у вас уже есть опыт, можете без опасений переходить к любой главе. Книга разделена на 4 части.
В 1-ой части рассматривается написание юнит-тестов "с нуля". Главы 1 и 2 охватывают самые основы, например, использование фреймворков модульного тестирования (NUnit), и содержат описание основных атрибутов ([Test] и [TestCase] и т.п.). В этих главах также объясняются идеи утверждений (asserts), игнорируемых тестов (ignoring tests), тестирования единицы работы (unit-of-work testing). Кроме того, рассматриваются 3 типа результатов модульного теста и три типа тестов. необходимых для них: тестирование значений, тестирование состояния и тестирование взаимодействия.
Во второй части обсуждаются продвинутые техники осллабления зависимостей: mock-объекты, заглушки, изоляционные фреймворки и паттерны рефакторинга вашего кода. В третьей главе вводится понятие заглушек и рассказывается как вручную из создавать и использовать. Глава 4 описывает тестирования взаимодействия с помощью рукописных mock-объектов. Глава 5 совмещает обе эти концепции и показывает как изоляционные фреймворки комбинируют эти идеи и позволяет сделать их автоматизированными. Глава 6 дает глубокое понимание ограниченных и неограниченных изоляционных фреймворков и их внутренней работы.
В части 3 обсуждаются способы организации модульного тестирования, шаблоны для запуска и рефакторинга их структуры, лучшие практики написания. В главе 7 обсуждаются иерархии тестов, как использовать инфраструктуру API, и как объединить тесты и процесс автоматической сборки. В главе 8 обсуждаются лучшие практики модульного тестирования для создания удобных в сопровождении, хорошо написанных и надежных тестов.
В четвертой части обсуждается реализация внедрения модульного тестирования в организации и как работать с существующим кодом. В главе 9 обсуждаются проблемы, с которыми вы столкнетесь при попытки ввести модульное тестировании в организации, а также возможные решения. Также определяет и отвечает на некоторые вопросы, которые возможно будут заданы. В 10-ой главе рассматривается введение модульного тестирования в унаследованный код. Определяются несколько путей решения, где начинать тестирование и обсуждаются инструменты для тестирования "нетестируемого" кода. 11 глава посвящена теме проектированию для тестируемости и существующие сегодня альтернативы.
В приложении приведен список инструментов, которые могут быть полезными в вашем тестовом опыте.
Код и загрузки
Вы можете скачать исходные коды к этой книге с GitHub https://github.com/royosherove/aout2 или на сайте книги www.ArtOfUnitTesting.com или с сайта издателя www.manning.com/TheArtofUnitTestingSecondEdition. Файл Readme.txt в корневой папке, а так же в папке к каждой главе, содержит описание как установить и запустить код.
Весь исходный код в листингах или в тексте представлен шрифтом фиксированной ширины так, чтобы отделять его от обычного текста. В листингах, жирный текст указывает на код, который изменился по сравнению с предыдущим примером или что будет изменен в следующем. Во многих листингах, код аннотируется указывая на ключевые понятия и нумерованные части ссылаются на объяснения, которые следуют в тексте.
Требования к программному обеспечению
Чтобы использовать код в этой кники, вам понадобится по крайне мере Visual Studio C# Express Editon (бесплатная версия) или лучше (платные версии). Вам также понадобится NUnit (бесплатный open source фрейvворк), а также другие утилиты, которые будут упоминаться в этой книге. Все инструменты упомянутые в этой книге либо бесплатные, либо open source, либо имеют пробные версии, которые вы можете свободно использовать во время чтения этой кнги
Автор в сети интернет
Покупка этой книги включает бесплатный доступ к закрытому форуму, запущенному Manning Publications, где вы можете прокомментировать книгу, задать вопрос и получить помощь автора и других пользователей. Чтобы получить доступ к форуму, перейдите по ссылке - www.manning.com/TheArtofUnitTestingSecondEdition. На странице вы найдете информацию о том, как попасть на форум после регистрации, какую помощь вы там найдете и правилах поведения.
Издательства Меннинг заботиться о своих читателях и предлагает место для конструктивного диалога как между отдельными читателями, так и между читателями и автором. Это не говорит о каком-то обязательном и конкретном участии со стороны автора, его обсуждение книги на форуме остается добровольным (и неоплачиваемым). Мы предлагаем вам задавать стимулирующие вопросы, чтобы его интерес не угас!
Форум "Автор онлайн" и архивы предыдущих обсуждений будут доступны на сайте издателя пока книга находится в печати.
Другие проекты от Роя Ошероува
Другие книги Роя:
"Прекрасные конструкции: Создание читаемых, обслуживаемых автоматизированных процессов" доступно на http://BeautifulBuilds.com
"Заметки руководителю группы разработки: Создание самоорганизующихся команд" доступно на http://TeamLeadSkills.com
Другие источники:
Блог "Записки тимлиду" автора этой книги доступен по адресу http://5whys.com
Онлайн видео TDD Мастер класс от Роя доступен тут http://TddCourse.Osherove.com.
Много бесплатного видео о модульном тестировании доступы по адресам http://ArtOfUnitTesting.com и http://Osherove.com/Videos.
Рой постоянно проводит обучение и консультации по всему миру. Вы можете связаться с ним http://contact.osherove.com для проведения обучения в вашей компании.
Подпишитесь в Твиттере @RoyOsherove
О изображении на обложке
Фигура на обложке The Art of Unit Testing, Second Edition это Japonais en costume de cérémonie, японец в церемониальной одежде. Иллюстрация взята из книги Джеймса Причарда "Natural History of Man", книги рукописных литографий, опубликованной в Англии в 1847. Она была найдена нашим дизайнером в магазине антиквариата в Сан-Франциско.
Причард стал работать над исследованием коренных жителей в 1813 году. К моменту, когда его работа была опубликована - 34 года спустя, он собрал большинство доступных исследований о различных народах и нациях, и его работа стала базовой в современной этнологии. В "Истории Причарда" были портреты представителей разных рас и племен в национальной одежде, взятые из оригинальных рисунков художников, большинство основанные на первоисточниках.
Образы из коллекции Причарда, как и другие иллюстрации, которые появляются на наших обложках, воплощают в жизнь богатство и разнообразие одежд и племенных обычаев двух вековой давности. Дресс-код с тех пор изменился, а прежде богатое межрегиональное разнообразие сошло на нет. Сейчас уже трудно различить одного жителя континента от другого, не говоря уже о стране или регионе. Возможно, смотря на это оптимистичнее, мы обменяли культурное и внешнее многообразие на разнообразие в личной жизни. И более разнообразную и интересную интеллектуальную и техническую жизнь.
Мы в издательстве "Мэннинг" ценим изобретательность, инициативу, и, да, юмор в компьютерном бизнесе с обложками книг на основе богатого национального многообразия прежней жизни - возвращаясь к нему с помощью коллекций изображений, таких как у Причарда.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/50563/210881
Переводчики: nekalex, novmicha, mangregory, Bodro
ChiFuka, vakimov, SakhipovRR, shurshik93
elGatoBinario, dima117
Настройки
Готово:
