Начало работы с TDD?

2^(x+y) = 2^x * 2^y

2^10 ~ 1,000
2^20 ~ 1,000,000
2^30 ~ 1,000,000,000
2^40 ~ 1,000,000,000,000
(etc.)

2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512

Так, 2^31 (подписанный интервал макс.) 2^30 (приблизительно 1 миллиард) времена 2^1 (2), или приблизительно 2 миллиарда. И 2^32 2^30 * 2^2 или приблизительно 4 миллиарда. Этот метод приближения достаточно точен, выравниваются к приблизительно 2^64 (где ошибка растет приблизительно до 15%).

при необходимости в точном ответе тогда необходимо потянуть калькулятор.

Удобные выровненные словом полные приближения:

  • 2^16 ~ = 64 тысячи//uint16
  • 2^32 ~ = 4 миллиарда//uint32, IPv4, unixtime
  • 2^64 ~ = 16 квинтильонов (иначе 16 миллиардов миллиардов или 16 миллионов триллионов)//uint64, "bigint"
  • 2^128 ~ = 256 квинтильонов квинтильона (иначе 256 триллионов триллионов триллионов)//IPv6, GUID
10
задан Esko Luontola 28 July 2009 в 16:39
поделиться

7 ответов

Первым делом достаньте эту книгу:

Эффективная работа с устаревшим кодом

Для такого большого проекта прочтите и усвойте. TDD для приложения, управляемого данными, достаточно сложен. Для устаревшего вам потребуется серьезное планирование и усилия. На мой взгляд, это того стоит, но это все еще большая кривая.

8
ответ дан 3 December 2019 в 16:54
поделиться

Не торопитесь и ради бога не пытайтесь заставить разработчиков делать TDD.

В противном случае - вы получите беспорядочные «тесты» низкого качества, которые будут удалены через несколько месяцев, а разработчики никогда больше не захотят слышать о TDD.

Самое важное требование для TDD - хорошо знание того, как писать тесты (довольно очевидно, почему).

Второе требование - хорошее знание используемых технологий.
Это потому, что если что-то сложно кодировать, создание кода в уме будет невозможно.

Используемые инструменты на самом деле совершенно не важны.

Ps тонны устаревшего кода и приложений, ориентированных на данные => хороший шаблон для катастрофы.

5
ответ дан 3 December 2019 в 16:54
поделиться

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

В любом случае, Я бы порекомендовал вам начать с малого и выбрать новый не очень большой проект. Подойдет даже небольшая часть более крупного проекта. Используйте это как место, чтобы познакомить команду с TDD и показать руководству, что это возможно. Затем, когда команда станет более опытной, вы сможете выбирать более крупные проекты. Что касается устаревшего кода, я бы порекомендовал взглянуть на эту книгу:

Эффективная работа с устаревшим кодом, Майкл Фезерс

Также я бы определенно рекомендовал взглянуть на эту книгу:

Искусство модульного тестирования, Рой Ошеров

] Возможно, это не книга по TDD, но это отличная книга, чтобы узнать о модульном тестировании, имитации фреймворков, и в ней даже есть глава, посвященная устаревшему коду. Также в нем есть несколько рекомендаций о том, как заинтересовать команду и руководство. В нем немного говорится о TDD, интеграционных тестах, организации вашей кодовой базы, и подробно о том, что делает хороший модульный тест. В целом отличное чтение.

Надеюсь, это поможет.

4
ответ дан 3 December 2019 в 16:54
поделиться

100 замечаний за эффективную работу с устаревшим кодом, рекомендованным Ишаем. Я также рекомендую Pragmatic Unit Testing на C # с NUnit , поскольку вы используете .NET (хотя я предполагаю C #). Это было очень полезно для обучения основам модульного тестирования, обеспечивая прочную основу для работы.

1
ответ дан 3 December 2019 в 16:54
поделиться

1) Я использую TestDriven.Net, и мне он нравится, поэтому я получил +1 за это
2) Покрытие кода полезно, если думать о нем в правильном настроении:
Высокое покрытие кода не обязательно означает высокое качество модульных тестов, но ...
Высококачественные модульные тесты действительно означают высокое покрытие кода

Я использовал только NCover, поэтому не могу рекомендовать альтернативы.

Что касается издевательства - как только вы поймете, что это такое и что это на самом деле означает для вас, вы увидите преимущества, которые он может предложить. А именно, это означает, что вы не зависите от интеграции тестируемого кода с внешней зависимостью, а также помогает сократить время выполнения текста (например, имитация уровня доступа к данным предотвращает дорогостоящее взаимодействие с БД). На мой взгляд, это важный фактор, так как если на выполнение тестов уходит много времени, люди могут перестать беспокоить их, если это означает, что им придется ждать слишком долго! Я использую NUnit, который имеет встроенную поддержку макетов.

Привяжите подход TDD к среде непрерывной интеграции (например, CruiseControl.NET ), и у вас есть очень мощная и производительная установка.

Начиная с TDD / модульного тестирования, я всегда рекомендовал бы писать тесты для кода, написанного «с настоящего момента», и не уделять слишком много внимания написанию тестов для устаревшего / существующего кода . В целом это сделать намного труднее и намного дороже с точки зрения времени, особенно если код старый / никому не свежий!

Обновление: Чтобы объяснить мой последний пункт немного подробнее, в ответ на комментарий Роберта ...

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

Это может стать отрицательным опытом - разработчику, которому поручили написать тесты для старого кода, о котором он мало что знает / помнит, будет труднее сделать это, и поэтому его первый опыт не является положительным. Вам также нужно быть осторожным в этой ситуации, так как вы можете получить слабые тесты, которые дают вам ложную уверенность. По моему опыту, абсолютно важно, чтобы каждый начал с этого положительно, иначе уверенность / мотивация в этом исчезнет, ​​и конечный результат будет намного хуже.

Я ' m , а не , на самом деле говоря, что вы не должны добавлять тесты для устаревшего кода - я делаю это сам, когда работаю со старым кодом или рядом с ним, в котором нет тестов, чтобы побитно улучшить охват тестами и качество. Разница в том, что я уже участвую в процессе, «верующий». Это ранние стадии, которые являются ключевыми ... отсюда и моя точка зрения о том, чтобы не уделять слишком много внимания унаследованному коду с самого начала.

3
ответ дан 3 December 2019 в 16:54
поделиться

Что касается начала, я бы также рекомендовал прочитать Refactoring Фаулера. Первая глава дает хорошее представление о том, что значит вводить тесты, а затем безопасно вводить изменения (хотя здесь упор делается на поведение, сохраняющее изменения). Кроме того, в этом докладе описываются некоторые методы, которые могут помочь улучшить тестируемость вашего кода. У Misko Hevery также есть это руководство по написанию тестируемого кода, в котором резюмируется доклад.

Судя по вашему описанию, вы хотите протестировать основные части своей системы - части с большим количеством зависимости, где изменения пугают. В зависимости от степени, в которой доступ к данным отделен от бизнес-логики, вам, вероятно, потребуется провести рефакторинг в сторону состояния, в котором код является более тестируемым - где легко и быстро создать экземпляры наборов тестовых данных, чтобы проверить логику изолированно. . Это может быть большая работа, и, возможно, не стоит затраченных усилий, если здесь изменения происходят нечасто и кодовая база хорошо зарекомендовала себя.

Я бы посоветовал быть прагматичным и использовать опыт команды, чтобы найти области, в которых он Проще всего добавить тесты, которые добавляют ценность. Я думаю, что наличие множества целенаправленных модульных тестов - лучший способ повысить качество, но, вероятно, легче протестировать код на более высоком уровне с помощью интеграционных или сценарных тестов, особенно вначале. Таким образом вы сможете на раннем этапе обнаружить серьезные сбои в основных системах. Четко укажите, что охватывают ваши тесты. Сценарные тесты будут охватывать большой объем кода, но, вероятно, не обнаружат мелких ошибок.

Переход от SourceSafe к Team System - это большой шаг, его масштаб зависит от того, сколько вы хотите сделать в Team System. Я думаю, вы можете получить большую пользу от использования встроенной тестовой среды Visual Studio. Например, в качестве первого шага вы можете реализовать несколько базовых наборов тестов для основных сценариев использования системы / ядра. Разработчики могут запускать их сами в Visual Studio во время работы и перед регистрацией. Эти комплекты можно постепенно расширять с течением времени. Позже, когда вы получите TFS, вы можете посмотреть, как запускать эти пакеты при регистрации и как часть процесса автоматической сборки. Вы можете следовать аналогичным путем независимо от конкретных инструментов.

С самого начала помните, что поддержание тестового кода связано с накладными расходами, а наличие хорошо разработанных тестов может принести дивиденды. Я видел ситуации, когда тесты копируются, затем слегка редактируются и т. Д. Подобное дублирование тестового кода может привести к резкому увеличению количества строк тестового кода, которые необходимо поддерживать при выполнении небольшого изменения кода продукта. Подобные хлопоты могут свести на нет ощутимое преимущество наличия тестов.

Visual Studio 2008 покажет вам только покрытие блоков, хотя анализ кода также даст другие показатели, такие как цикломатическая сложность для каждой сборки / класса / метода. Получение высокого охвата блоков с помощью ваших тестов, безусловно, важно и позволяет легко идентифицировать области системы, которые полностью не тестируются.

Однако я думаю, что важно помнить, что высокое покрытие блоков - это всего лишь простое измерение эффективности ваших тестов. Например, скажем, вы пишете класс для очистки файлового архива и сохранения 5 самых новых файлов. Затем вы пишете тестовый пример, который проверяет, начинаете ли вы с 10 файлов, а затем запускаете очиститель, который у вас остался с 5. Реализация, которая проходит тест, может удалить самые новые файлы, но может легко обеспечить 100% покрытие. Этот тест проверяет только одно из требований.

3
ответ дан 3 December 2019 в 16:54
поделиться

В течение пары лет я был осведомлен о написании модульных тестов и занимался им. Что позволило мне по-настоящему заняться модульным тестированием, так это то, что я начал работать над проектом с открытым исходным кодом с впечатляющим тестовым покрытием. Меня действительно поразило, что то, как я писал программное обеспечение, было «не по ту сторону истории».

Вы упомянули много инструментов, рекламируемые возможности которых восхищают вас, и задавались вопросом, как их собрать. Я думаю, что эти вопросы очень хорошо решены в "xUnit Test Patterns" от Addison-Wesley ( http://xunitpatterns.com/ ). Эта книга позволила мне собрать воедино все те инструменты и методы, о которых я читал в прошлом.

Книга может лучше служить аудитории, которая также ценит другие книги, такие как «Шаблоны проектирования« Банды четырех »,« Рефакторинг »и« Рефакторинг для шаблонов ». . Эти книги тоже великолепны, хотя они не сильно повлияли на мой стиль написания кода после того, как я их прочитал. Однако представление тестовых шаблонов XUnit отражает стиль книг. Поначалу их может быть трудно читать, поскольку они имеют тенденцию ссылаться на главы в произвольных направлениях. Я думаю, что они очень надежны.

GoF представила категории шаблонов - творческие, структурные и поведенческие. Эти категории служат способом связать и противопоставить объясняемые закономерности. Связывая шаблоны проектирования тестов с типичным временем жизни модульного теста, тестовые шаблоны XUnit также объединяют ряд методов, доступных для модульного тестирования. Те же шаги также используются для связывания и сопоставления различных инструментов, используемых для создания модульных тестов.

Это поможет с общим обзором и войдет в реальную реализацию.

Моя единственная критика тестовых шаблонов XUnit - это то, сколько текста они используют для критики NUnit. NUnit - прекрасное средство программирования, следует отдать должное его автору NUNit, о котором мы так много говорили в книге, которая, я думаю, станет классической.

0
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: