вторник, 30 марта 2010 г.

Пишем CMS. Шаг № 8. Unit-тестирование

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

1. Перво-наперво качаем последнюю версию NUnit (откуда, найдете сами).

2. Создаем в солюшене отдельный проект типа ClassLibrary и добавляем референс на библиотеку nunit.framework.dll, которая лежит в папке framework каталога, куда распаковался наш nunit.

3. Создаем новый класс, добавляем в него ссылку на пространство имен NUnit.Framework, затем перед классом добавляем атрибут [TestFixture], а перед методом-тестом (который должен быть обязательно public и возвращать void - атрибут [Test].

4. Теперь надо организовать удобный запуск тестов. Я обычно делаю так. В окне свойств проекта с тестами щелкаю вкладку Debug, а там - Start external program, где указываю путь к nunit.exe. А сам проект устанавливаю как SetUp as statrup project. Это значит, что теперь, когда я нажимаю F5, запускается именно этот проект, вернее, запускается оболочка nunit.exe, которая подтягивает наши проекты.

5. Теперь надо создать проект среды тестирования. Для этого нажмем F5 и увидим диалог NUnit, там мы выберем меню New Project, введем название и сохраним проект где-нибудь (я предпочитаю корневую папку проекта с тестами). Теперь можно добавить туда нашу dll с тестами (она обычно лежит в bin/debug) - через меню Project - Add assembly (некоторые версии NUnit имеют такой баг - после того, как вы создаете проект и загружаете туда dll, он не подхватывает библиотеку, выдает какую-то странную ошибку. Если это произошло, просто сохраните проект и закройте оболочку, затем запустите снова - должно пройти.)

6. Ну вот и все! Теперь можете писать свои тесты и запускать их. Да! Одна маленькая, но очень важная деталь - если вы не обратите на это внимание, вы можете часами биться об стену, пытаясь понять, в чем дело. А дело в том, что если вы работаете например, с ADO.Net Entity Framework и вам надо потестировать, хорошо ли из базы забираются данные, то вы обязательно должны скопировать файл App.Config в папку проекта с тестами - именно отсюда фреймворк будет брать информацию по соединению с БД. Но и это еще не все. В свойствах NUnit проекта в поле Configuration File Name нужно обязательно указать имя этого конфигурационного файла.

Теперь, кажется, все... удачного тестирования!

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

Evgenii комментирует...

Очень интересна тема создания CMS, но я только учусь, не так давно изучаю программирование... хотелось бы видеть больше кода к каждой главе, так как понимается это все с трудом) буду признателен, если распишешь как все это делается...

Electric Cat комментирует...

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

Evgenii комментирует...

ну к примеру вопросы такие... CMS обычно пишут для более легкого управления сайтом, например добавления новых страниц, редактирования содержимого и прочее... а например изменение языка, я думаю волнует в последнею очередь... ну да ладно, вопросы конкретные
1) делается цмс для готовых сайтов, или же можно будет делать из них
2) есть ли готовый пример (что то вроде теста), посмотреть как все это выглядит? ведь я так понимаю ты уже не первый раз это делаешь)

Electric Cat комментирует...

1)CMS обычно не делается для готовых сайтов, поскольку CMS и есть сайт. Обычная логика любой CMS (обобщенно) - иметь некий набор сущностей, которые можно редактировать, расширять и т.д. Например, вы можете добавить сущность "автомобиль" и приклепить к ней набор полей любых типов. По соответствующей ссылке будет отображена страница с данными конкретной марки автомобиля. Сущности эти, как правило, либо берутся из имеющихся, например, "новости", "блоги" и т.д. или являются полностью настраиваемыми. Вот это, грубо говоря, и есть, как работает CMS. Каким образом? Дело в том, что все данные в БД хранятся в виде модели EAV, т.е. когда, опять же грубо говоря, есть таблица для сущностей, и таблица атрибутов, эту сущность описывающую. Таким образом можно не только задать любые атрибуты (поля), но и логику, например, в виде динамически добавляемых скриптов JS.

2)Нет, делаю CMS первый раз - на основе опыта разработки сайтов, не имеющих центра управления. К сожалению, разработка по некоторым причинам отложена на неопределенное время.

Что касается языка, то может, кому-то это и не так важно, а мне, например, было важно.

Evgenii комментирует...

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

Electric Cat комментирует...

Хммм, имхо, мне кажется, не стоит начинать изучение asp.net с написания CMS. Попробуйте для начала создать простой сайт из нескольких страниц, с использованием основных фич asp.net: авторизация, пользовательские контролы и т.д., ну и конечно, данные должны браться из БД. Как только это освоите, вопросы про "по конкретнее про базу" отпадут сами собой. Впрочем, если вы добавите страницы, которые позволяют не просто отображать данные из БД, а сохранять в нее, то это уже и будет простейшая CMS.

Evgenii комментирует...

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