Проект однодневного курса по TDD

Итак, сейчас в воздухе витает идея создания однодневного курса по Test-Driven Development (TDD), ориентированного на студентов. Цель простая — за один день дать студентам и начинающим разработчикам необходимые знания для того, чтобы грамотно покрывать тестами свой код.

Предварительный план мероприятия включает в себя 6 сессий по 45 минут с перерывами по 15 минут а также часовым перерывом на обед. План сессий представлен ниже:

  1. Что такое тестирование, зачем оно нужно. Различные типы тестирования (модульное, интеграционное, приемочное). Участники процесса тестирования. Роль тестирования в различных моделях разработки ПО (agile, rup, cmmi etc.). Цели и принципы автоматизации тестов. Идеология TDD.
  2. Введение в модульное (юнит) тестирование. Обзор фреймворков и библиотек для тестирования. Инструментарий и автоматизация тестирования. Простые примеры TDD с использованием MbUnit & Gallio Icarus. Тестовое покрытие на примере NCover.
  3. Тестируемость кода. Проблемы (smells) в коде, поведении и проекте. Практики правильного построения тестов. Примеры.
  4. Продвинутые практики модульного тестирования. Типы утверждений, секции иниациализации и финализации. Data-driven тесты. Способы организации модульных тестов.
  5. Тестовые дубли – кто они и что с ними делать. Моки, фейки, стабы. Обзор современных мок-фреймворков – приемущества и ограничения. Паттерны ААА и Record-Replay. Примеры использования Moq.
  6. Дизайн для тестируемости и проблема зависимостей. Паттерн инъекции зависимостей. Введение в идеологию DI/IoC на примере фреймворка Unity. Примеры использования DI для тестирования.

Это предварительный план, и реально все может измениться. В плане “стека” очень сложно выбрать технологии, т.к. лично я фанат TypeMock но боюсь что на подобных встречах нужно рассказывать про менее коммерческие библиотеки. На данный момент, склонности к стеку такие:

  • MbUnit/Gallio. Единственной серьезной альтернативой является NUnit, но имеет смысл показывать именно “классический” синтаксис, мне кажется MbUnit тут как раз подходит.
  • Moq. Мое мнение что Rhino Mocks хоть и является “доминирующим” фреймворком, он слишком запутан, “вариативен” и вообще устарел.
  • Unity. Про DI все равно придется говорить, а поскольку базовые возможности всех фреймкворков примерно одинаковы, лучше рассказывать про тот, который легко изучать и использовать.
  • NCover. Не думаю что стоит “евангелизировать” идею тестового покрытия, но упомянуть стоит. Хороших некоммерческих альтернатив нет (PartCover не предлагать), поэтому придется говорить про NCover.

Реальное время подготовки такого эвента – пару месяцев. Планируется чисто теоретические эвент (т.е. без лабораторных и т.д.), но с хэндаутами и возможно последующими вебкастами – хотя на счет вебкастов не обещаю т.к. это жутко трудоемкое занятие.

Вообщем, нужна критика и полезные рекоммендации, так что если они у вас есть – пишите комментарии. Спасибо. Ах да, и забыл сказать, место проведения эвента – Санкт-Петербург.

Update: рассматривается также вариант номинальной аттестации участников, т.е. заполнение короткой multiple-choice анкеты в конце встречи. По результатам теста можно выдавать либо документ о прослушивании теста (если человек провалил тест) либо аттестат (если человек сдал тест хорошо). Эта практика уже проверенная, и мне кажется самое время задействовать бренд spbalt.net для чего-то полезного. (Почему spbalt.net а не Ineta? Потому что spbalt.net намного более активная группа, и участники там посильнее. Одним словом, авторитета больше.)

26 responses to “Проект однодневного курса по TDD”

  1. А тебе возможно интересно было бы сделать курс в каком нибуть институте.

    1. Так наверное и получится. В идеале хочется иметь полноценный коммерческий курс, но обкатать его хочется на студентах.

  2. Возможен вариант записи курсов на видео? Для всех тех, кто out of Спб.

    1. В принципе да. Тут главный вопрос что записывать – собственно презентацию, или писать отдельно слайдкаст. Дело в том что слайдкасты, как показывает практика, дело очень напряжное, особенно когда нужно покрыть большое количество материала.

  3. Лично я перестал понимать о чем идет речь уже после 3го пункта. Думается, что у людей, совсем не знакомых с темой, от объема новой информации будет голова пухнуть уже к середине мероприятия.

    Будет полезно иметь раздаточный материал по материалам презентации, в который можно будет подглядеть по ходу лекции.

    Можно тему Pex затронуть. Или любых других тулов для автогенерации тестов. http://research.microsoft.com/en-us/projects/pex/

    И да. Как будет проходит отбор на посещение мероприятия?

    1. Ну объем информации будет большой, не скрою. Но на коммерческих курсах примерно так. Раздаточный материал конечно будет, в смысле будут распечатки слайдов.

      Насчет PEX, BDD и еще миллиона дополнительных вещей я думал, но боюсь это все out of scope. Чтобы покрыть абсолютно всё, нужно примерно 3 дня, а это уже совсем другой уровень усилий. Возможно что-то трехдневное будет реализовано в коммерческом формате.

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

      1. Теоретически, если аудитория будет большая – можно попробовать пробить лекционную аудиторию в университете. Тогда проблем с местом и количеством не будет.

    2. Ну мы так и планируем делать. Другой вопрос – в каком университете. И есть еще вопрос что делать с питанием – в принципе эта проблема решается деньгами, но к сожалению денег от UGSS совсем не хватит при достаточно большом количестве участников. Вообще, финансирование такого эвента – это отдельная тема, и тут у меня готовых ответов вообще нет :)

  4. Что Вы имеете в виду под этим:
    “имеет смысл показывать именно “классический” синтаксис”, чем у MBUnit синтаксис более классический?

    Про Unity, не сказал бы, что это фреймворк который легко изучать, точнее что легче всех. Почему бы не рассказать на примере Ninject?

    1. Тут можно долго холиварить. Де факто лучше чтоб люди знали как писать Assert.AreEqual(a, b) чем Assert.That(a, Is.Equal(b)) или что-то в этом духе. Опять же, в консалтинге сейчас MbUnit фреймворк номер один, поэтому не грех рассказывать именно про него. И инструментарий Gallio на высоте.

      Что касается Unity, то конечно каждый сделает свой выбор, но отправной точкой должен быть он, т.к. он не слишком нагружен всякой непонятной инфраструктурой, да и синтаксис у него простой и понятный. Вообщем, от Unity я вряд ли откажусь.

  5. В принципе, идею про видео уже высказывали. У меня есть более конкретное предложение на этот счет – ты можешь провести курс как и планировал, записать на видео и выложить, скажем, на какой-нибудь intuit.ru – аудитория будет гораздо больше. Если интересно, напиши мне на почту – можно обсудить более подробно.

    1. Уже известно, на какой сайт это пойдет. Про intuit я ничего не знаю, посмотрю.

  6. Для студентов курс подобной продолжительности будет мало эффективен, только если проводить предварительный отсев, и не на весь курс, а на серию сессий из плана.

    1. Вот я как раз этого и боюсь. Я вообще не знаю сколько часов “нормально” для студента. Коммерческие-то курсы именно в полнодневном формате проводятся, и там никто не жалуется что много. А тут – у меня маловато знаний чтобы понять то, осилят все это слушатели или нет.

  7. Будучи студентом, больше одной пары подряд на одну и ту же тему я осилить не мог. Если обед, то можно две пары. Поэтому я бы сделал 2 дня по 4 часа, и обязательно с активным вовлечением слушателей.

    1. А вот это точно не получится, т.к. один день я выделить еще готов, но 2 дня – практически нереально. Тут получается три “пары”, думаю люди должны осилить все-таки…

      1. Тогда надо будет их активно будить, мне кажется.

        “Нестерук, встань и повтори, что я только что говорила” :)

    2. Млин… неужели все так плохо? Вот лично меня посылали на курсы причем не на один а на несколько дней. И так каждый день было как раз часов по 6 нового материала. И ведь ничего – справлялся.

      1. Если учесть что сие затевается для создания коммерческого курса, то ориентироваться на неусидчивость студентов не стоит.

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

  8. Тебя посылали, когда ты студентом был?

    Нет, я не спорю, у всех голова разная, но я по весне от регулярного недосыпа, авитаминоза и прочих обострений совсем тупел..

    1. Ну вот я и думаю как бы это правильно поставить с точки зрения организации. Так чтобы народ не тупел а получал удовольствие от новых знаний. У тебя есть идеи как “облегчить” нагрузку не меняя при этом график?

      1. Студенты бывают очень разными, как вообщем-то и лекторы. Если все шесть часов тебе передают ценный опыт это одно, если 5 из 6 часов льют воду то тут уж и более подготовленный контингент начнет засыпать.
        Вообщем, я полагаю, что если организовать доп курс на который можно прийти по желанию, то проблем со вниманием аудитории не будет.

  9. За день – полностью нереально! Тут нужна практика минимум месяц-два.

    1. Да, но хотя бы люди получат теорию, а практикой займутся отдельно. Я бы с удовольствием сделал лабораторные работа и все такое, но на все нужная уйма времени.

  10. >> Паттерны ААА и Record-Replay.

    А можете кинуть ссылку на описание явлений? А то экспресс-поиск в гугле ничего не дал.

    1. Все нужно искать в контексте различных фреймворков, например Rhino.Mocks. А вообще, можно просто гуглить:

      Arrange-Act-Assert
      Record-Replay

Оставить комментарий