4

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

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

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

图书馆项目的问题

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

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

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

你怎么做呢?

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

4

1 回答 1

2

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

我已经为每个单独的项目添加测试,但我从一个中央测试项目运行测试。

每个项目应该有:

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

Flash Builder 不喜欢 MXML 应用程序位于除 之外的任何其他目录中src,因此不要将该test目录设置为另一个源目录,这一点很重要。

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

我发现 FlexUnit 管理单元测试运行器的方式有点奇怪。当您在 Eclipse 中选择“run as -> Flex Unit Tests”时,它将提供生成一个测试运行器 MXML 应用程序(您可以选择它应该运行哪些测试)。从上下文菜单中选择“执行 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>
于 2011-08-15T13:45:28.837 回答