Юнит тесты лишь косвенно относятся к основной теме. Но я под шумок, между делом, расскажу пару слов и про них. Для юнит-тестов нам нужны две зависимости:
<dependency>
<groupId>com.adobe.flexunit</groupId>
<artifactId>flexunit</artifactId>
<version>4.0-rc-1.1</version>
<type>swc</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.adobe.flexunit</groupId>
<artifactId>uiRunner</artifactId>
<version>4.0-rc-1.1</version>
<type>swc</type>
<scope>test</scope>
</dependency>
Но они у нас уже есть в flex super pom, так что можно об этом не волноваться. Будет использоваться FlexUnit 4.
Если вы не переделывали структуру каталогов проекта под себя, а используете стандартную для Maven, то у вас так:
projectA
- moduleA
- src
- main
- flex
- com.yourCompany.bla-bla-bla.yourClasses
- ModuleA.mxml
- resources
- test
- flex
- resources
Теперь в папке moduleA/src/test создаем класс TestSomething. Название не важно. Наследоваться не нужно. Допустим мы хотим протестировать мега-мощный вики-парсер, который умеет преобразовывать строку
and *here several words* in bold
в строку
and <span fontWeight="bold">here several words</span> in bold
Вы можете догадаться, что это парсер который будет использоваться в будущем движке моего блога :) Ну а парсит он, разумеется, в TLF-разметку
Чтобы проверить, справляется ли парсер с этой работой, мы пишем такой тест в классе TestSomething:
[Test]
public function testBoldLexeme() : void
{
var lexeme : Lexeme = new Lexeme(/*some params here*/);
Assert.assertEquals('and <span fontWeight="bold">here several words</span> in bold',
lexeme.parse('and *here several words* in bold'));
}
Еще в классе понадобится импорт
import org.flexunit.Assert;
ну и импорты тех объектов, которые в тесте используются.
И все, теперь надо как-то запускать. Это будет чуть проще, чем описано в доке Writing a Basic Test, ибо нам не понадобится самим писать TestRunner. Об этом за нас позаботится flexmojos.
Итак, правый клик на классе TestSomething в панели Project, в контекстном меню находим Create "TestSomething" (или сразу Run "TestSomething") Если все-таки Create, то IDEA создаст нам Run Configuration, который мы потом будем запускать по Shift+F9.
Запускаем. IDEA компилирует код, генерирует test runner -- moduleA/target/_flexunit.swf, запускает его в браузере, и сообщает результат теста в панели Debug.
Подробности о flex unit 4 прочитаете в доках. А я еще расскажу про подгрузку внешних файлов.
Иногда тестам нужно загрузить внешний файл. Например, для вики-парсера неплохо бы иметь достаточно большой и сложный по разметке текст, чтобы прогонять его через парсер и сверять результат с заранее подготовленным эталоном. Исходный текст и текст эталон довольно велики, поэтому хочется хранить их в отдельных файлах. Во-первых, чтобы не заграмождать код тестов. Во-вторых, так их удобнее поддерживать. Ведь оный текст и впредь будет удлинняться и усложняться.
С загрузкой файлов особых проблем нету. Тесты компилируются с опцией useNetwork=true, но они могут получать и локальные файлы, ибо IDEA автоматически генерирует настройки флэш-плеера, разрешающие такую загрузку.
В линуксе это файл ~/.macromedia/Flash_Player/#Security/FlashPlayerTrust/unittest.cfg в котором вы увидите список абсолютных пустей ко всем _flexunit.swf файлам
Проблем нету, но есть неудобства, ибо такая загрузка асинхронна. И хотя flex unit 4 поддерживает асинхронные операции, но это лишний и громоздкий код, от которого хотелось бы избавиться.
К счастью, внешние файлы можно не подгружать в рантайме, а эмбедить при компиляции. И тогда тест выглядит красиво и лаконично:
package
{
import com.flashdevs.yzh.wikiParser.WikiParser;
import org.flexunit.Assert;
public class TestWikiParser
{
[Embed(source="/parsing_source.txt", mimeType="application/octet-stream")]
private var ParsingSource : Class;
[Embed(source="/parsing_result.txt", mimeType="application/octet-stream")]
private var ParsingResult : Class;
[Test]
public function testWikiParser() : void
{
var source : String = new ParsingSource().toString();
var result : String = new ParsingResult().toString();
// NOTE: result string must not contain \n symbols,
// but they left in parsing_result.txt for convenient editing.
// So we cut them here.
result = result.split('\n').join('');
var parser : WikiParser = new WikiParser();
Assert.assertEquals(result, parser.parse(source));
}
}
}
Add new comment