Unit-тестирование haXe во FlashDevelop
Доброго времени суток всем!
Накатал сегодня плагин к FlashDevelop для более удобной работы с munit
http://code.google.com/p/munit-gener...r.dll&can=2&q=
Делает 3 простых вещи:
1. Кликаем правой кнопкой по *.hx - файлу в дереве проекта, выбираем "Create test case..." - создается рыба для тестового случая (название должно оканчиваться на Test)
2. Alt-Shift-A - генерация TestSuite и запуск всех тестов под дебагером (только для swf только для flashplayer9+)
3. Alt-Shift-E - запуск открытого в редакторе тестового случая (запуск отдельных тестов пока сам munit не поддерживает)
Установка плагина:
- Поместить MUnitGenerator.dll в каталог \FlashDevelop\Plugins
- Перезапустить FlashDevelop
Установка munit:
- набрать в DOS-консоли haxelib install munit
- нажать Enter
Дополнительные настройки во FlashDevelop:
- Правой кнопкой по проекту в дереве проекта, Settings, вкладка CompillerOptions, -lib munit
- Это чисто для автокомплита при написании тестов.
Вот собственно все.
Вопрос в чём: это еще кому нибудь нужно?
Просто плагин написан "голопом по европам" с диким хардкодом настроек и работает только для компиляции под flashplayer9. Для моих скромных целей - этого за глаза. Но ели это еще кому-нибудь нужно - может есть смысл довести его до ума?
Тут просили пример юнит-тестирования привести, вот собственно он:
--------------------------------------------------------------------------------------
Первый пример будет до безобразия простым.
Пусть он не покажет всех преимуществ юнит-тестирования, но зато будет не сильно надуман.
Представьте ситуацию:
Вы пишите форму регистрации пользователя и надо проверить корректность нового логина
1. Так, вспоминаем что такое регулярные выражения и пишем:
var login = _input.text; if (!(~/бла-бла-бла/.match(login))) { Alert.show("Неправильное имя!"); }
СТОП!
Вы что, собираетесь во время дебага регулярки каждый раз резетить игру и ждать появления
формы логина?
2. Включаем мозги и выносим функционал в другой класс:
3. Создаем этот класс:
package ; class LoginHelper { public static function isLoginCorrect(login:String):Bool { return true;// Нет теста - нет функционала, поэтому пока просто заглушка } }
Появляется папка tests, находим в ней "рыбу" нашего теста LoginHelperTest.hx и открываем
В данном примере нам не потребуются ни setUp ни tearDown - не обращаем на них внимания
Пишем тестовый метод:
Названия тестов - это отдельная тема, есть разные соглашения, один из принципов - это писать то,
как должен вести себя тестируемый класс, т.е. пишем как он должен работать
5. Пишем сам тест
Стоп, плагин кривой - автокомплит не работает, надо в AdditionCompillerOptions добавить
-lib munit
Заработал! (если Вы, конечно, до этого munit установили с помощью haxelib install munit)
@Test public function simpleNameIsPass() { Assert.isTrue(LoginHelper.isLoginCorrect("User")); }
Код:
MUnit Results ------------------------------ Class: LoginHelperTest . PASSED <----- вот она, ЗЕЛЁНАЯ полоска, но munit суров, потому это просто текст Tests: 1 Passed: 1 Failed: 0 Errors: 0 Time: 0.015 ==============================
Значит нужны еще тесты! Нет тестов - нет кода!
6. Тест на НЕпрохождение
Допустим, мы не хотим, чтобы в имени использовались знаки препинания
@Test public function punctuationIsNotPassed() { Assert.isFalse(LoginHelper.isLoginCorrect("User,name")); }
Код:
MUnit Results ------------------------------ Class: LoginHelperTest . massive.munit.AssertionException: Expected FALSE but was [true] at LoginHelperTest#punctuationIsNotPassed (32) FAILED <----- а вот и КРАСНАЯ полоса - один тест НЕ прошёл Tests: 2 Passed: 1 Failed: 1 Errors: 0 Time: 0.024 ==============================
т.е. punctuation как раз passed
Есть красный тест - есть что делать!
Лезем в LoginHelper.hx и начинаем добиваться зелёной полосы
Правим LoginHelper периодически нажимая Alt + Shift + A, пока не увидим зелёную полосу,
Уфф, ели вспомнил как с этими регулярками обращаться:
Код:
PASSED Tests: 2 Passed: 2 Failed: 0 Errors: 0 Time: 0.018
package ; class LoginHelper { public static function isLoginCorrect(login:String):Bool { return ~/^\w+$/.match(login); } }
Чего мы еще не хотим видеть в имени?
Стоп! а мы цыфры то хотим видеть? Да хотим, пользователи не смогут выразить свою
индивидуальность приписыванием к занятому нику какой-нибудь циферки ведь!
А у нас это работает? Щас узнаем.
@Test public function nameWithDigitsIsPassed() { Assert.isTrue(LoginHelper.isLoginCorrect("User777")); }
Код:
PASSED Tests: 3 Passed: 3 Failed: 0 Errors: 0 Time: 0.019
8. Наверно называть логин, начиная с цивер - дурной тон - запретим это дело:
@Test public function loginCantBeginWithDigits() { Assert.isFalse(LoginHelper.isLoginCorrect("8User")); }
Лезем в LoginHelper.
package ; class LoginHelper { public static function isLoginCorrect(login:String):Bool { return ~/^\D\w+$/.match(login); } }
Код:
PASSED Tests: 4 Passed: 4 Failed: 0 Errors: 0 Time: 0.019
мы уверены, что не отломали старые
Вот и все. Стоит ли еще написать тестов зависит от уровня паранойи. Я бы на этом остановился.
Всего комментариев 22
Комментарии
08.03.2011 21:53 | |
Красиво говоришь Ладно, чтонть напишу сюда
|
09.03.2011 10:52 | |
Вы чего? Какая производительность? Это тупо либа для Unit-тестирования (т.е. тестирования частей приложения отдельными кусками) - google в помощь. Тесты производительности - это совсем другое
|
09.03.2011 11:12 | |
А, сори )
|
09.03.2011 12:00 | |
Да, уже гораздо лучше =)
Спасибо за статью! Остаётся ждать примеров с setUp и tearDown. Но скорее, в следующей статье. |
09.03.2011 18:15 | |
а плагин под FD для unit-тестов существует?
|
09.03.2011 21:01 | |
Не слышал о таком. Под FDT тоже не находил.
В FlashBuilder есть, даже тулзу, мерющую покрытие тестами (code coverage) можно установить |
|
Обновил(-а) expl 09.03.2011 в 21:09
|
09.03.2011 22:04 | |
FB не интересует... Такую штуковину хочется для родного FD
|
09.03.2011 23:29 | |
Сочуствую, могу только посоветовать стиснуть зубы и запускать вручную как здесь:
http://www.ruelke.org/blog-entry-127.html Или с ant'ом, как эти товарисчи (сам антом не пробовал): https://github.com/robertpenner/as3-...ster/build.xml (кстати, там неплохие примеры тестов - не представляю как бы они написали свою либу без них) Основной трабл, конечно - это запуск отдельных тестов одним кликом - его не получится Оно, впринципе и моем плагине можно только TestCase целиком запустить - вот жду, когда разработчики munit добавят фитчу запуска отдельных тестов - чтобы тест под курсором можно было запускать. (а то ставишь точку останова в тестируемый класс и "дальше, дальше, когда же падающий тест, блин начнется") Кстати, кто-то таки пытался для asunit плагин написать, судя по дате 2006 - всё заглохло http://www.flashdevelop.org/communit....php?f=4&t=718 |
|
Обновил(-а) expl 09.03.2011 в 23:34
|
09.03.2011 23:53 | |
А в чем сочувствие то?
|
10.03.2011 00:41 | |
Человеку инструмента не хватает, можно посочувствовать
|
10.03.2011 01:17 | |
У меня и без инструментов получается тестировать.
|
10.03.2011 01:47 | |
У Aloran может тоже получается, только хочет он плагин,
зачем к словам то цепляться. |
10.03.2011 10:30 | |
без плагина и так все выходит, но человеку по свински всегда хочется чего то лучшего =)
|
13.03.2011 17:44 | |
Если кому еще интересно, авторы munit в середине недели добавили поддержку запуска отдельных тестов (причем это у них возможно и без плагина), я добавил это в плагин только сечас:
http://code.google.com/p/munit-gener...or-0.1.0.0.zip Изменения: - поменял папку tests на test - т.к. герератор командной строки munit создает папку с именем test - чтобы лишних различий не было; - поведение Alt+Shift+A осталось без изменений - запуск всех тестов помеченных тегом @Test - поведение Alt+Shift+E стало интереснее: а) Если открыт класс тестового случая и курсор находится не имени теста - запускается только один этот тест (будь он помечен как @Test или @TestDebug или и то и другое); б) Если открыт класс тестового случая и курсор находится на имени класса - запускаются все тесты тестового случая, помеченные как @Test; с) В других случаях запускаются только тесты помеченные как @TestDebug. Это удобно - можно пометить проблемный тест и запускать его по Alt+Shift+E, какой бы Вы класс в данный момент не правили Примечание: Если класс помечен @TestCase, но не помечен @Test - он не запустится при запуске всех тестов, если Вы с этим не согласны, то пишите так: В целом плагин по-прежнему полон хард/быдло-кода, найду время - постараюсь исправить |
|
Обновил(-а) expl 13.03.2011 в 17:48
|
21.08.2011 18:42 | |
Дошли руки обновить, теперь работает и на FlashDevelop4
http://code.google.com/p/munit-gener...downloads/list |
14.08.2012 21:07 | |
Было бы круто плагинчик для FlexUnit. Зеленый и красный свет как в Идее
|
18.10.2013 13:53 | |
Собственно вот. Всё то же самое но четырьмя строками в макросах
https://github.com/Dukobpa3/stuff/bl...cros/munit.txt |
Последние записи от expl
- Конвеер Потапенко (07.02.2012)
- Менеджер курсоров на базе стека (21.01.2012)
- Unit-тестирование haXe во FlashDevelop (08.03.2011)