Flexmojos и FlexUnit4

Юнит тесты лишь косвенно относятся к основной теме. Но я под шумок, между делом, расскажу пару слов и про них. Для юнит-тестов нам нужны две зависимости:


<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

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.