Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > expl

Оценить эту запись

Unit-тестирование haXe во FlashDevelop

Запись от expl размещена 08.03.2011 в 18:31
Обновил(-а) expl 08.03.2011 в 22:47

Доброго времени суток всем!
Накатал сегодня плагин к 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. Так, вспоминаем что такое регулярные выражения и пишем:

Код AS3:
var login = _input.text;
if (!(~/бла-бла-бла/.match(login)))
{
	Alert.show("Неправильное имя!");
}
Осталось только правильно подобрать это бла-бла-бла

СТОП!
Вы что, собираетесь во время дебага регулярки каждый раз резетить игру и ждать появления
формы логина?

2. Включаем мозги и выносим функционал в другой класс:
Код AS3:
if (!(LoginHelper.isLoginCorrect(login)))
{
	Alert.show("Неправильное имя!");
}
3. Создаем этот класс:
Код AS3:
package ;
 
class LoginHelper 
{
	public static function isLoginCorrect(login:String):Bool
	{
		return true;// Нет теста - нет функционала, поэтому пока просто заглушка
	}
}
4. Создаем тест: правой кнопкой по классу и выбираем CreateTestCase, в диалоге жмём ОК.
Появляется папка tests, находим в ней "рыбу" нашего теста LoginHelperTest.hx и открываем
В данном примере нам не потребуются ни setUp ни tearDown - не обращаем на них внимания
Пишем тестовый метод:

Код AS3:
@Test
public function simpleNameIsPass()
{
 
}
Названия тестов - это отдельная тема, есть разные соглашения, один из принципов - это писать то,
как должен вести себя тестируемый класс, т.е. пишем как он должен работать

5. Пишем сам тест
Стоп, плагин кривой - автокомплит не работает, надо в AdditionCompillerOptions добавить
-lib munit
Заработал! (если Вы, конечно, до этого munit установили с помощью haxelib install munit)
Код AS3:
@Test
public function simpleNameIsPass()
{
	Assert.isTrue(LoginHelper.isLoginCorrect("User"));
}
Нажимаем Alt + Shift + A и видим в открывшемся флешплеере:

Код:
MUnit Results
------------------------------

Class: LoginHelperTest .

PASSED <----- вот она, ЗЕЛЁНАЯ полоска, но munit суров, потому это просто текст
Tests: 1  Passed: 1  Failed: 0 Errors: 0 Time: 0.015
==============================
Тест прошёл! Ясен пень - мы же все время true возвращаем!
Значит нужны еще тесты! Нет тестов - нет кода!

6. Тест на НЕпрохождение
Допустим, мы не хотим, чтобы в имени использовались знаки препинания
Код AS3:
@Test
public function punctuationIsNotPassed()
{
	Assert.isFalse(LoginHelper.isLoginCorrect("User,name"));
}
Alt + Shift + A:

Код:
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
==============================
LoginHelperTest#punctuationIsNotPassed (32) - это значит, что punctuationIsNotPassed НЕ выполняется,
т.е. punctuation как раз passed

Есть красный тест - есть что делать!
Лезем в LoginHelper.hx и начинаем добиваться зелёной полосы
Правим LoginHelper периодически нажимая Alt + Shift + A, пока не увидим зелёную полосу,

Уфф, ели вспомнил как с этими регулярками обращаться:
Код:
PASSED
Tests: 2  Passed: 2  Failed: 0 Errors: 0 Time: 0.018
Код AS3:
package ;
 
class LoginHelper 
{
	public static function isLoginCorrect(login:String):Bool
	{
		return ~/^\w+$/.match(login);
	}
}
7. Есть зелёный тест - можно двигаться дальше!
Чего мы еще не хотим видеть в имени?
Стоп! а мы цыфры то хотим видеть? Да хотим, пользователи не смогут выразить свою
индивидуальность приписыванием к занятому нику какой-нибудь циферки ведь!
А у нас это работает? Щас узнаем.

Код AS3:
@Test
public function nameWithDigitsIsPassed()
{
	Assert.isTrue(LoginHelper.isLoginCorrect("User777"));
}

Код:
PASSED
Tests: 3  Passed: 3  Failed: 0 Errors: 0 Time: 0.019
Хех, а ничего делать и не надо - всё уже сделано

8. Наверно называть логин, начиная с цивер - дурной тон - запретим это дело:
Код AS3:
@Test
public function loginCantBeginWithDigits()
{
	Assert.isFalse(LoginHelper.isLoginCorrect("8User"));
}
Есть красная полоска!
Лезем в LoginHelper.

Код AS3:
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
Тут важно заметить что прошли все 4 теста, т.е. поправив регулярку под новые условия,
мы уверены, что не отломали старые
Вот и все. Стоит ли еще написать тестов зависит от уровня паранойи. Я бы на этом остановился.
Всего комментариев 22

Комментарии

Старый 08.03.2011 20:41 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Я, к сожалению, не имел дела с unit тестами. Так сложилось. Конечно, этот недостаток я когда-нибудь устраню. И вот статья, которая мне интересна. Но... о чем? Что тестить? Как тестить? Какая рыба?
Было бы здорово, если бы ты обрисовал суть на пальцах. А то я прочитал — и не знаю, куда шагать, кроме как гуглить.
Старый 08.03.2011 21:07 expl вне форума
expl
Тестить можно много чего, проче перечислисть что нельзя (соединение с сервером, но можно логику, GUI - на самом деле можно, но тяжело, логику завязанную на рандом, и т.п.)

Просто пост не о тестировании а о плагине
Для AS3 плагин есть в комплекте с FlashBuilder, а для haXe - нет, хорошо хоть дебагер не так давно появился.

Думаешь есть смысл приписать сюда пример тестирования конкретного функционала?
Старый 08.03.2011 21:28 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ага. Самый элементарный пример. Юнит тест вычисления факториала, например. Или сортировки какой-нибудь. На примерах всегда красочней, а если сразу будет что-то подёргать, то многие просто скопипастят, запустят и радостно взвизгнут: ты будешь человеком, который поможет им сделать первый их в жизни юнит тест на HaXe. Или вообще первый.
Старый 08.03.2011 21:53 expl вне форума
expl
Красиво говоришь Ладно, чтонть напишу сюда
Старый 09.03.2011 02:20 easy.proger вне форума
easy.proger
Эм, простите, но я так и не понял зачем вобще этот munit... если он позволяет выполнить тяжелые алгоритмы быстрей чем AS код написанный в обычном проекте, то напишите об этом и желательно сравнительные тесты привести ... пока не чего нужного я не прочитал и это скорей всего потому что не понял самой темы
Старый 09.03.2011 10:52 expl вне форума
expl
Вы чего? Какая производительность? Это тупо либа для Unit-тестирования (т.е. тестирования частей приложения отдельными кусками) - google в помощь. Тесты производительности - это совсем другое
Старый 09.03.2011 11:12 easy.proger вне форума
easy.proger
А, сори )
Старый 09.03.2011 11:41 arkadattx вне форума
arkadattx
Вот бы немного поподробней о самих юнит-тестах... Может даже еще одну статейку... И, к примеру я, на HaXe не программирую, мне AS3 интересен... Гугл-гуглом, но чем нравятся статьи в блогах, так это возможностью диалога.
Старый 09.03.2011 12:00 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Да, уже гораздо лучше =)
Спасибо за статью!
Остаётся ждать примеров с setUp и tearDown. Но скорее, в следующей статье.
Старый 09.03.2011 18:15 Aloran вне форума
Aloran
а плагин под FD для unit-тестов существует?
Старый 09.03.2011 21:01 expl вне форума
expl
Не слышал о таком. Под FDT тоже не находил.
В FlashBuilder есть, даже тулзу, мерющую покрытие тестами (code coverage) можно установить
Обновил(-а) expl 09.03.2011 в 21:09
Старый 09.03.2011 22:04 Aloran вне форума
Aloran
FB не интересует... Такую штуковину хочется для родного FD
Старый 09.03.2011 23:29 expl вне форума
expl
Сочуствую, могу только посоветовать стиснуть зубы и запускать вручную как здесь:
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 iNils вне форума
iNils
 
Аватар для iNils
А в чем сочувствие то?
Старый 10.03.2011 00:41 expl вне форума
expl
Человеку инструмента не хватает, можно посочувствовать
Старый 10.03.2011 01:17 iNils вне форума
iNils
 
Аватар для iNils
У меня и без инструментов получается тестировать.
Старый 10.03.2011 01:47 expl вне форума
expl
У Aloran может тоже получается, только хочет он плагин,
зачем к словам то цепляться.
Старый 10.03.2011 10:30 Aloran вне форума
Aloran
без плагина и так все выходит, но человеку по свински всегда хочется чего то лучшего =)
Старый 13.03.2011 17:44 expl вне форума
expl
Если кому еще интересно, авторы 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 - он не запустится при запуске всех тестов,
если Вы с этим не согласны, то пишите так:
Код AS3:
@TestDebug
@Test
public function myTest()
{
    ...
}
В целом плагин по-прежнему полон хард/быдло-кода, найду время - постараюсь исправить
Обновил(-а) expl 13.03.2011 в 17:48
Старый 21.08.2011 18:42 expl вне форума
expl
Дошли руки обновить, теперь работает и на FlashDevelop4
http://code.google.com/p/munit-gener...downloads/list
Старый 14.08.2012 21:07 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Было бы круто плагинчик для FlexUnit. Зеленый и красный свет как в Идее
Старый 18.10.2013 13:53 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Собственно вот. Всё то же самое но четырьмя строками в макросах
https://github.com/Dukobpa3/stuff/bl...cros/munit.txt
 

 


Часовой пояс GMT +4, время: 21:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.