Flash Builder 4.5& FlexUnit 4.1

时间:2011-07-28 14:05:43

标签: flex unit-testing flash-builder flexunit

我们在Flex 4.1中编写了一个大型的多模块产品,运行在基于Java的中间层之上。

来自Java背景,我希望在Flex环境中获得编写和运行单元测试的支持。

我已经使用FlexUnit的4.1版本更新了Flash Builder 4.5,我可以在应用程序项目上成功编写和执行单元测试,但我还没有弄清楚如何在Flash中的模块或库项目上进行单元测试助洗剂。

图书馆计划的问题

由于我们需要将测试编译到应用程序(SWF),因此我需要在Flash Builder中创建一个配套项目,或者更改库(SWC)项目的依赖项上的链接类型以避免外部,因为外部依赖项应该是预期的由其他人提供(通常是顶级应用程序)。

作为一项实验,我尝试更改示例库项目上的链接:成功生成了一个测试运行器SWF,但FlexUnit无法运行它,因为报告的#1065错误对我没有任何意义。

对于我们的无头构建(使用Gradle),我发现通过简单地合并所有依赖项而不管它们在生成测试运行器SWF时的原始链接,这很容易解决。我也可以使用外部工具支持从Eclipse中轻松运行,因为结果是与通常的JUnit视图中显示的JUnit兼容的XML结果。

你是怎么做到的?

其他Flex开发人员如何在多模块和多库项目中构建单元测试?您是否在Flash Builder 4.5中运行测试?您可以为任何库或模块项目独立运行测试吗?

1 个答案:

答案 0 :(得分:2)

好的,这是我第二次回答我自己的问题(最后一个也是围绕Flex)。

我已经开始为每个项目添加测试,但是我从一个中心测试项目中运行测试。

每个项目都应该:

  • 测试目录
  • 在测试目录中使用<project name>Test.mxml命名约定的MLXML应用程序
  • 顶层测试套件,聚合了通常包结构中测试目录下项目中的所有测试
  • 一些单元测试; - )

Flash Builder不喜欢生活在src之外的任何其他目录中的MXML应用程序,因此 NOT test目录设置为另一个源目录非常重要。

现在将每个项目的test源目录添加到整个测试项目中。您需要将所有需要的依赖项(运行时和测试)添加到此项目中。

我发现FlexUnit在如何管理单元测试的运行器方面有点奇怪。当您选择'run as - &gt;时,它将提供生成测试运行器MXML应用程序的功能。 Eclipse中的Flex单元测试(您可以选择应运行的测试)。从上下文菜单中选择“执行FlexUnit测试”不会导致生成MXML。

您不应将此MXML文件检入源代码管理中,而应忽略它。原因是如果要运行不同的测试集,FlexUnit不会成功重新生成此文件。这意味着您需要在需要重新生成文件时手动删除该文件。

以下是我们在库项目中用于测试运行器的MXML示例:

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           minWidth="955" minHeight="600" creationComplete="onCreationComplete()">

<fx:Script>
    <![CDATA[
        import net.infonic.hs.AllTestsSuite;

        import org.flexunit.listeners.CIListener;
        import org.flexunit.runner.FlexUnitCore;

        private var core: FlexUnitCore;

        public function currentRunTestSuite(): Array {
            var testsToRun:Array = new Array();
            testsToRun.push(AllTestsSuite);
            return testsToRun;
        }           

        private function onCreationComplete(): void {
            core = new FlexUnitCore();
            core.addListener(new CIListener());
            core.run(currentRunTestSuite());
        }           
    ]]>
</fx:Script>

</s:Application>