воскресенье, 18 октября 2009 г.

UnitTests прежде чем переходить к практике.

Здравствуйте мои друзья. Извиняюсь что давно не писал, как-то навалилось(Да всё навалилось работа, лентяйство, быт ...).
Но за последние 2 недели произошло кое-что интересное. На работе было принято решение внедрять модульное тестирование.
Что из этого получилось попытаюсь сейчас описать.

Итак великий день 12 октября. Вашему покорному слуге стукнуло в голову, что так дальше жить нельзя и что для всех новых модулей необходимо писать модульные тесты. Поднял этот вопрос в отделе и было получено единогласное решение "да".
"Да" это хорошо но как это внедрять и с чего начать.
Сейчас ведутся разработки на 3х языках Delphi, Python, C#.net новые проекты разрабатываются на C# и Python. Вот именно с них то и было принято решение начать внедрение.
Отлично с языком определились, но что это такое модульные тесты? Зачем они нужны и как они помогут в дальнейшем?

И весь отдел принялся с довольно большим энтузиазмом выяснять что к чему. Ссылки я сейчас уже не дам но в двух словах очень помог Блог Александра Бындю. А вот ещё интересный сайт

Я попытаюсь изложить свои мысли (которые мне посчастливиться породить), в процессе ознакомления с этой интересной темой.

На вопрос что это? Я сформировал следующий ответ, это не определение и не истина последней инстанции, а только мои мысли. Модульное тестирование это определённый модуль способный проверять по заранее определённой логике, функции тестируемого модуля. Т.е. это программа проверяющая работоспособность программы.
Также наличие UnitTests по идее должно экономить время разработчика. Поскольку не будет требоваться длительная проверка в отладчике. А также должна возникнуть определённая уверенность в действиях в случае переработки кода. Имея тесты разработчику не следует бояться сломать существующую структуру, модульные тесты должны предупреждать разработчика в случае если он сломает существующую логику.
Фактически UnitTest поощряет программистов изменять код программы и делать его более простым(в идеале).

Собственно в предыдущем абзаце были получены ответы на вопросы зачем они нужны и как одни должны помогать.

Теперь оставалось самое простое :) разобраться с технологией создания тестов.

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

К сожалению всё вышеописанное было проделано за первую неделю, а вторую мы прожили без существенных сдвигов в данном направлении.

Надеюсь что эта статья будет началом цикла статей о модульном тестировании.
В коментах жду ссылки и советы по внедрению модульных тестов.

5 комментариев:

  1. Да! я хочу про это почитать!
    Вообще я когда-то пытал дьдку Саныча по поводу Юнит-тестов - было очень интересно общаться с мега-мозгом!
    Больше всего интересны Mock объекты, потому как с обычными классами, совершающими какие-либо вычисления на основе входных данных, всё понятно.
    ЗЫЖ После твоих рассказов мне прямо хочется обратно в банк вернуться :) У вас сподвижки интересные появляются... Python, C#... или вы на них еще не много пишите?

    ОтветитьУдалить
  2. Немного но пишем. Есть тестовая Контра на Asp и C#. А что Саныч рассказывал?

    ОтветитьУдалить
  3. Коль спасибо за редактирование текста.

    ОтветитьУдалить
  4. Unit тестирование просто потрясающая вещь!! :)
    Как рассказыывал одни мой авторитетный сотрудник, в Google практически все ПО пишется через тесты, именно поэтому их проекты чаще всего так хорошо работают.
    Сам же я сталкивался с тестированием при написании одного курсового проекта, а также свой диплом я писал полностью через тесты. Для написания я использовал язык Java и для тестирования использовал JUnit правда опыта работы с тестами на других языках не имею, однако занаю, что технология примерно одинакова :).
    Очень жаль что в компании в которой я работаю не практикуется тестирование, ИМХО, если ввести у нас подобную технологию то работы у QA станет ЗНАЧИТЕЛЬНО меньше. Главное не ленится и писать тесты на ВСЁ.

    ОтветитьУдалить
  5. Привет!

    Рад, что вы начали двигаться в этом направлении!

    "а как же протестировать модули которые взаимодействуют с БД, другими классами, файлами на диске ... т.е. с внешними ресурсами"

    Для этого нужна удобная/правильная/гибкая архитектура приложения. Про принципы проектирования я уже писал http://blog.byndyu.ru/2009/10/solid.html

    В частности принци инверсии зависимостей будет очень полезен http://blog.byndyu.ru/2009/12/blog-post.html

    В последнем абзаце "Инвертированная архитектура", код, который взаимодействует с БД (DAL) скрыт за DataAccess Layer Interface. Его и мОчим =)

    Успехов!

    ОтветитьУдалить