使用Flash Builder 4和FlexUnit进行测试驱动开发

在本文中,我介绍使用Flash Builder 4和FlexUnit进行测试驱动开发(Test Driven Development,TDD)的一些基本知识。

随着Flash应用程序变得越来越动态和复杂,它们也变得越来越难以维护和扩展,尤其是在开发过程中业务需求发生变化时。这些挑战非常大,并且在所有开发类型中都很常见,包括移动、Web和桌面应用程序开发。

考虑这样一个场景:您需要更改一个大型应用程序,以满足新的业务需求。您如何知道所做的细微更改会不会破坏应用程序的其他部分?您如何确保代码是安全的,尤其是在使用别人编写的代码时。

对软件工程师而言,这个问题既不是新问题,也不是在特定平台上才会遇到。Java和ASP开发人员已经受到了同样的问题的挑战,他们发现测试驱动开发(TDD)是一项非常有用的技术,可用于创建易于维护的应用程序。

Flash已远远不是一个小型的动画工具。Adobe Flash Platform现在包含一种遵从ECMAScript的编程语言,以及其他编程语言构建大型动态应用程序所必需的常用方法。实际上,Adobe和其他许多公司都发现,TDD解决了开发人员在日常开发中面临的诸多挑战。

我注意到,尽管许多开发人员听说过TDD,但他们并不愿意使用TDD,因为他们对TDD不熟悉,害怕使用它会延长开发时间。

对于我个人的经验而言,我发现当在适当的项目上正确使用TDD时,并不会延长开发时间。实际上,TDD可以缩短开发时间,简化应用程序维护。我还发现,我可以以某种途径在现有应用程序上使用TDD,将TDD方法应用于已经存在的任何框架。

有一点值得注意,即使有一个独立的质量保证(QA)部门来执行正式测试,也可以使用TDD。TDD有助于开发人员提供更加可靠的代码,使QA专注于其他任务,包括测试用户界面和创建他们需要测试的用例。

前提条件:

要最好地掌握本文,您需要以下软件和文件:

Flash Builder 4

示例文件:

预备知识

最好拥有开发Flex应用程序的经验。

clip_image002
本文的编写经过了Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License的授权

测试驱动开发概述

那么到底什么是TDD?测试驱动开发是一种软件开发技术,程序员编写失败的测试来在编写实际代码之前定义功能。

注意,使用FlexUnit,您通常会在编写代码之后编写测试,许多时候您需要向现有代码添加测试。

极限编程(Extreme Programming)模式中,团队开发的是具有不断变化的需求的动态项目,开发周期包括TDD,用于在编写代码本身之前编写测试。注意,TDD并不是完整的开发周期,它仅是极限编程(XP)开发模式的一部分。在编写代码之前准备测试,这有助于开发团队通过很少的步骤论证他们的工作,而不是让客户或其他相关人士等待完整的结果。

以增量方式进行开发还使满足不断变化的需求变得更加简单,有助于确保您的代码完成它需要完成的任务,不会执行无用的操作。这里值得提一下,TDD技术的关注重点是生成代码,而不是创建测试平台。测试的能力只是一项附带优势。

TDD基于这样一个理念,您开发的任何功能都需要测试,如果您无法测试它,您应该反思是否真的希望开发它。

使用FlexUnit 4应用TDD技术

图1. 测试驱动开发周期

TDD流程包含6个简单步骤(参见图1):

  1. 添加测试 第一步是理解业务需求,考虑所有可能的场景,以及根据这些场景添加测试。如果需求不够清晰,您可以立即提出问题,而不是等到软件开发完成,否则将需要花多得多的精力来更改代码。
  2. 编写失败的单元测试 这一阶段用于确保测试单元本身正常工作。测试不会通过,因为您还未编写任何代码。
  3. 编写代码 在此阶段,您以最简单、最高效的方式编写代码,以确保测试通过。无需包含任何涉及模式,考虑应用程序的剩余部分,或者清理代码。您的目标只是通过测试。
  4. 测试通过 一旦编写了所有代码并且测试通过了,您就会知道测试满足了所有业务需求,您可以与客户或团队其他成员共享所做的工作。
  5. 重构 在测试完成且您确认它满足业务需求之后,您就可以替换任何临时参数,添加设计模式,删除重复代码,以及创建类来有效完成任务,从而保证代码已准备好投入生产。在理想情况下,一旦重构阶段完成,代码就会经过代码审核,这对确保代码处于良好的状态且符合公司的编码标准非常重要。在重构和代码审核之后,应该再次运行测试,以确保流程未受到任何破坏。
  6. 重复测试 当单元测试完成时,您可以前进到下一个单元测试,并与客户或团队其他成员共享代码。

使用FlexUnit测试Flex和ActionScript项目

FlexUnit是一个针对Flex和ActionScript 3.0应用程序和库的单元测试框架。它提供的功能类似于Java单元测试框架Junit。FlexUnit被用于许多内部Adobe项目,而且是开源的。

Flash Builder 4提供了集成FlexUnit支持,支持自动创建测试单元的框架,既节省了时间,还无需反复创建相同的类,确保了最佳实践的使用。

FlexUnit有两个版本:FlexUnit 0.9(也称为FlexUnit 1)和FlexUnit 4。本文使用的是FlexUnit 4。

要在以前的Flex Builder中使用FlexUnit,您必须下载FlexUnit SWC文件并将其包含在您的项目中。一旦创建了测试,Flash Builder 4就会自动包含5个SWC。以下SWC将添加到项目的Referenced Libraries下:

  • flexunit_0.9.swc
  • Hamcrest.swc
  • FlexUnit4_1.0.swc
  • flexunitextended.swc
  • FlexUnitTestRunner_rb.swc

这些SWC包含针对FlexUnit 0.9、FlexUnit 4、测试运行程序和其他库的所有API。SWC作为Flex 4 SDK的一部分进行维护,所以无需下载FlexUnit或手动添加它们。一旦添加了测试,它们就会自动添加。

在Flash Builder 4中创建Test Suite和测试用例

在本节中,您将使用Flex Builder 4和FlexUnit 4创建Test Suite和测试用例。

创建Test Suite类

为了演示如何在Flash Builder中使用FlexUnit,我将使用一个计算数字的简单应用程序。按照以下步骤创建该应用程序并添加一个Test Suite:

  1. 选择File > New > Flex Project创建项目。
  2. 对于Project Name,键入CalculatorApplication
  3. 单击Finish。
  4. 要创建Test Suite,选择File > New > Test Suite Class(参见图2)。
  5. 2. 在Flash Builder 4中创建新Test Suite

  6. 在New Test Suite Class对话框中,将类命名为CalculatorTestSuite
  7. 选择New FlexUnit 4 Test(参见图3)。
  8. 单击Finish。
  9. 3. 创建一个名为CalculatorTestSuite的新Test Suite类

Test Suite是一个测试组合。它运行一组测试用例。在开发期间,您可以创建一组测试,并将它们封装到Test Suite中,完成之后,您就可以运行该Test Suite,以确保您的代码在进行更改之后仍然能正常工作。

注意:尽管极限编程鼓励在创建代码之前编写测试(这也是理想的工作方式),但在实际中,您会发现许多时候都会在编写代码之后编写测试。这类决定因案例不同而异,可以调整方法来适合您的工作流程。

Flash Builder 4在flexUnitTests文件夹下添加了以下类:

package flexUnitTests
{
     [Suite]
     [RunWith("org.flexunit.runners.Suite")]
     public class CalculatorTestSuite
     {
     }
}

Suite元数据标记表示该类是一个套件。RunWith标记表示要使用特定的类执行它后面的测试的测试运行器。FlexUnit 4是一个运行器集合,将运行一组完整的测试。您可以限定每个运行器实现特定接口。例如,您可以指定一个不同的类来运行测试,而不使用FlexUnit 4内置的默认运行器。

添加Test Case类

有了您希望测试的类之后,您可以创建Test Case类:

  1. 选择File > New > Test Case Class。
  2. 选择New FlexUnit 4 Test。
  3. 键入flexUnitTests作为包。
  4. 键入CalculatorLogicTester作为名称(参见图4)。
  5. 单击Next。
  6. 4. 创建新Test Case类

    注意:在FlexUnit 1中,您可以选择生成setUp()和tearDown()存根。这些存根会在测试用例开始(setUp)和停止(tearDown)时自动调用。它们可用于在测试开始之前设置信息和事件,以及清除信息和事件来确保您没有任何内存泄漏。在FlexUnit 4中,您可以使用元数据标记[Before]和[After]来定义这些方法,在本文后面您将看到。

    在下一个对话框中(参见图5),选择希望测试的方法。

  7. 选择additionMethod。
  8. 单击Finish。
  9. 5. 选择要测试的方法

编写失败的单元测试

现在已准备好编写测试代码了。打开CalculatorLogicTester.as,注意已经创建了additionMethod的测试方法。在FlexUnit 1中,您创建的每个方法都必须以“test”开头,以使测试运行器能够识别该方法。因此,方法名称会更改为testAdditionMethod。在FlexUnit 4中,方法名称不需要以“test”开头,它们通过[test]元数据来识别,所以您可以自由地重构方法名称。下面是生成的代码:

package flexUnitTests
{
     import com.elad.calculator.utils.CalculatorLogicHelper;

     import flexunit.framework.Assert;

     public class CalculatorLogicTester
     {
          // Reference declaration for class to test
          private var classToTestRef : 
                com.elad.calculator.utils.CalculatorLogicHelper;
                    public function CalculatorLogicTester()
          {
          }

          [Test]
          public function testAdditionMethod():void
          {
              // Add your test logic here
              Assert.fail("Test method Not yet implemented");
          }
     }
}

最后记得把你想测试的测试用例加到CalculatorTestSuite测试组件中。把下面这行加粗的代码加到CalculatorTestSuit.as里:

package flexUnitTests
{
    [Suite]
    [RunWith("org.flexunit.runners.Suite")]
    public class CalculatorTestSuite
    {
        public var calculatorLogic:CalculatorLogicTester;
    }
}

编译项目。要运行应用程序,执行以下步骤:

  1. 单击编译图标并选择FlexUnit Tests(参见图6),或者选择Run > Run > FlexUnit Tests。
  2. 6. 运行FlexUnit测试

  3. 在Run FlexUnit Tests对话框中,选择所有可用的Test Suites和测试用例(参见图7)。
  4. 单击OK。
  5. 7. 选择所有可用的TestCases和TestSuites

  6. 当应用程序完成时,在浏览器中检查测试状态结果。(参见图8)。
  7. 8. 浏览器中的FlexUnit测试结果

  8. 关闭浏览器窗口。
  9. 在FlexUnit Results视图中检查测试结果(参见图9)。

可以看到,测试失败了,因为CalculatorLogicTester.as中包含以下代码:

Assert.fail("Test method Not yet implemented");

9. FlexUnit Results视图

编辑additionMethod()以返回0,因为我们还没有编写代码。将方法设置为静态,最终的类如下所示:

package com.elad.calculator.utils
{
  public final class CalculatorLogicHelper
  {
    public static function additionMethod(value1:Number, value2:Number):Number
    {
      return 0;
    }
  }
}

此外,更新testAdditionMethod村更以生成失败结果:

var result:Number = CalculatorLogicHelper.additionMethod(5,5); 
Assert.assertEquals(result,10);

assertEquals方法将会失败,因为方法additionMethod的代码还没有实现。运行应用程序并查看失败结果(参见图10)。一条消息显示了存在的问题(Error: expected: <10> but was <0>)和失败的方法(testAdditionMethod)。

10. FlexUnit Results视图显示了失败的方法

后台发生了什么?

在应用程序文件夹结构下,您可以找到文件CalculatorLogicTester.as、CalculatorTestSuite.as和FlexUnitCompilerApplication.mxml(参见图11)。

11. CalculatorApplication文件夹结构

看一下FlexUnitApplication.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/halo"
    minWidth="1024" minHeight="768" 
    xmlns:flexunit="flexunit.flexui.*"   
    creationComplete="onCreationComplete()" > 
<fx:Script>
     <![CDATA[

          import org.flexunit.runner.Request;
          import flexUnitTests.CalculatorTestSuite;
          import flexUnitTests.CalculatorLogicTester;

          public function currentRunTestSuite():Array
          {
              var testsToRun:Array = new Array();
              testsToRun.push(flexUnitTests.CalculatorTestSuite);
              testsToRun.push(flexUnitTests.CalculatorLogicTester);
              return testsToRun;
          }
          private function onCreationComplete():void
          {
              testRunner.runWithFlexUnit4Runner(currentRunTestSuite(), "CalculatorApplication");
          }
]]>
</fx:Script> 
<flexunit:FlexUnitTestRunnerUI id="testRunner"/> </s:Application>

可以看到,有一个名为FlexUnitTestRunnerUI的GUI,它在功能上类似于FlexUnit 0.9中的FlexUnit TestRunner类。在本质上,应用程序添加了整个测试并在UI中运行测试。

private function onCreationComplete():void
{
    testRunner.runWithFlexUnit4Runner(currentRunTestSuite(), "CalculatorApplication");
}

但是,这个框架非常灵活,开发人员可以创建和使用他们自己的运行器,但仍然使用相同的UI。实际上,目前已经有针对FlexUnit 1、FlexUnit 4、Fluint和SLT的运行器。

FlexUnit中的测试运行器是一个UI组建,它将创建Test Suite的一个实例,允许您添加希望运行的所有测试。测试运行器还将在浏览器中显示测试信息。

注意:目前有一个针对Flex应用程序的测试运行器,但没有针对纯ActionScript应用程序的测试运行器。但是,您可以创建一个Flex项目来测试纯ActionScript代码,或者使用Ant任务。参见http://opensource.adobe.com/wiki/display/flexunit/CI+ReadMe了解更多信息。

除了在Project Navigator中看到的文件,在底层还有更多文件,包括:

  • _FlexUnitApplication_FlexInit-generated.as
  • _FlexUnitApplication_mx_managers_SystemManager-generated.as
  • _FlexUnitApplication-binding-generated.as
  • _FlexUnitCompilerApplication_FlexInit-generated.as
  • _FlexUnitCompilerApplication_mx_managers_SystemManager-generated.as
  • FlexUnitApplication-generated.as
  • FlexUnitApplication-interface.as
  • FlexUnitCompilerApplication-generated.astem
  • FlexUnitCompilerApplication-interface.as
  • FlexUnitTestRunner_properties.as

这些类为FlexUnit处理绑定、样式和定义等任务。

注意:bin-debug/生成的包包含MXMLC编译器创建的所有文件,你通常看不到它们。要查看它们,选择项目,然后右键单击并选择Properties。在Flex Compiler下,在Additional Compiler Arguments中添加以下选项:-keep-generated-actionscript或-keep-generated-actionscript=true。

使用Flash Builder 4实现TDD技术

现在可以进入TDD流程的第三步了。

编写代码

测试失败之后,您可以编写代码来通过测试。编写的代码应该是让测试通过所需的最少的代码。添加additionMethod()来返回两个数字的和:

执行以下步骤创建实用程序类:

  1. 选择File > New > Package。
  2. 键入com.elad.calculator.utils作为名称。
  3. 单击Finish。
  4. 在Package Explorer中选择新的com.elad.calculator.utils包。
  5. 选择File > New > ActionScript Class。
  6. 键入CalculatorLogicHelper作为名称。
  7. 单击Finish。
package com.elad.calculator.utils
{
  public final class CalculatorLogicHelper
  {
    public static function additionMethod(value1:Number, value2:Number):Number
    {
 	  var retVal:Number = value1+value2;
      return retVal;
    }
  }
}

测试通过

现在不用对通过的testAdditionMethod测试方法进行任何更改,您将看到一个绿灯,表示测试已成功通过(参见图12)。

12. FlexUnit Results视图显示了成功的测试

重构代码

测试通过之后,您可以重构代码,以为生产做准备。例如,您可以添加一个设计模式来替换if..else语句部分。

在本例中,没有需要重构的代码,因为代码非常简单。

完善并在需要时重复

您可以为减、乘和除方法继续创建单元测试。完整的代码如下所示:

package com.elad.calculator.utils
{
   public final class CalculatorLogicHelper
   {
      public static function additionMethod(value1:Number, 
           value2:Number):Number
      {
         var retVal:Number = value1+value2;
         return retVal;
      }

      public static function subtractionMethod(value1:Number, 
          value2:Number):Number
      {
         var retVal:Number = value1-value2;
         return retVal;
      }

      public static function multiplicationMethod(value1:Number,
          value2:Number):Number
      {
         var retVal:Number = value1*value2;
         return retVal;
      }

      public static function divisionMethod(value1:Number,
          value2:Number):Number
      {
         var retVal:Number = value1/value2;
         return retVal;
      }
   }
}

完整的单元测试类代码位于本文的示例文件中包含的CalculatorLogicTester.as文件中。

断言方法

目前为止,您在测试用例中仅使用了assertEquals断言方法。但还有其他许多断言方法(参见表1)。

断言方法 含义
assertEquals 断言两个值相等。
assertContained 断言第一个字符串包含在第二个字符串中。
assertNotContained 断言第一个字符串未包含在第二个字符串中。
assertFalse 断言一个条件为假。
assertTrue 断言一个条件为真。
assertMatch 断言一个字符串与一个正则表达式(regexp)匹配。
assertNoMatch 断言一个字符串与一个正则表达式(regexp)不匹配。
assertNull 断言一个对象为空。
assertNotNull 断言一个对象不为空。
assertNotUndefined 断言一个对象已定义。
assertUndefined 断言一个对象未定义。
assertStrictlyEquals 断言两个对象完全相同。
assertObjectEquals 断言两个对象相等。

 

1. FlexUnit 1和FlexUnit 4中可用的断言方法。

要使用断言方法,传入一个字符串消息和两个要比较的参数。该字符串是在测试失败时将使用的消息。

例如:

assertEquals("Error testing the application state", state, 1);

如果忽略消息字符串,将得到默认的消息。

在编辑器中,键入Assert来查看可用断言方法的代码提示。

Hamcrest断言方法

除了标准的断言,FlexUnit 4还支持Hamcrest库中包含的新断言方法,该库基于匹配器的理念。可以设置每个匹配器来匹配您的断言的条件。

下面是一个来自Drew Bourne项目的示例,测试一个数是否与另一个数接近(在指定的阈值内):

package org.hamcrest.number
{
   import org.hamcrest.AbstractMatcherTestCase;
   public class CloseToTest extends AbstractMatcherTestCase
   {
        [Test]
        public function comparesValuesWithinThreshold():void
        {
           assertMatches("close enough", closeTo(1, 0.5), 1.5);
           assertDoesNotMatch("too far", closeTo(1, 0.5), 1.6);
        }

       [Test]
       public function hasAReadableDescription():void
       {
          assertDescription("a Number within <0.1> of <3>", closeTo(3, 0.1));
       }
   }
}

组装各部分

现在您有了一个可以处理所有基本的计算器操作的类,还有了针对这些方法的测试用例,您可以实现一个简单的计算器应用程序了(参见图13)。看一下CalculatorApplication.mxml中的示例代码,该文件使用了实用程序类。

13. 计算器应用程序

FlexUnit 4元数据

FlexUnit 4框架以元数据标记为基础。目前为止您已经看到了[Suite]、[Test]和[RunWith]。下面是其他一些常见的元数据标记:

  • [Ignore] – 导致方法被忽略。可以使用此标记来代替将方法注释掉。
  • [Before] – 替换FlexUnit 1中的setup()方法,支持多种方法。
  • [After] – 替换FlexUnit 1中的teardown()方法,支持多种方法。
  • [BeforeClass] – 允许在一个测试类之前运行方法。
  • [AfterClass] – 允许在一个测试类之后运行方法。

可以在测试案例中使用的有用的元数据

计算器示例只是为了帮助您快速熟悉并使用TDD。本节将从实际角度概述可以在更复杂的项目中使用的FlexUnit元数据。

首先,创建一个新FlexUnit 4 Test Case类并将其命名为FlexUnitTester。将FlexUnitTester.as示例文件中的代码复制到新类中。

Before元数据之后的方法将在每次测试之前运行,After标记之后的方法将在每次测试之后运行:

[Before]
public function runBeforeEveryTest():void 
{
     // implement
}

[After]
public function runAfterEveryTest():void 
{
     // implement
}

下面的示例演示了Test元数据的预期属性。rangeCheck方法创建一个新的Sprite对象。代码将生成一个成功的测试,因为索引1上的子元素并不存在,因此代码在运行时将导致一个异常。

[Test(expected="RangeError")]
public function rangeCheck():void
{
     var child:Sprite = new Sprite();
     child.getChildAt(1);
}

下面这个例子展示了一个预期的断言错误。testAssertNullNotEqualsNull Test期望得到一个AssertionFailedError错误。测试将失败,因为assertEquals方法将成功(因为null等于null)。

[Test(expected="flexunit.framework.AssertionFailedError")]
public function testAssertNullNotEqualsNull():void 
{
     Assert.assertEquals( null, null );
}

在FlexUnit 1中,您必须注释掉代码来忽略不再希望测试的方法。Ignore元数据标记使跳过一个方法变得非常简单。

[Ignore("Not Ready to Run")]
[Test]
public function methodNotReadyToTest():void 
{
     Assert.assertFalse( true );
}

如果您希望设置Test、Before或After方法的顺序,可以添加order属性,比如:

[Test(order=1)] 
public function checkMethod():void
{
     Assert.assertTrue( true );
}

异步测试

如果您过去使用过FlexUnit 1,那么您一定知道,创建异步测试和测试事件驱动代码并不总是那么简单。我常常发现自己在修改现有类来适应FlexUnit,或者以一种非常复杂的方式创建测试。Fluint的一个最大的优势就是,它能够容纳多个异步事件。FlexUnit 4整合了Fluint功能,以支持增强的异步测试,包括异步安装和卸载。此特性可供每个测试存根使用。要查看此特性的实际应用,可以创建一个新Test Case Class,将其命名为AsynchronousTester,然后复制入AsynchronousTester.as示例文件的代码。

此示例测试一个服务调用。testServiceRequest()函数进行一次服务调用来检索包含在项目中的一个XML文件。测试设置超时来制定在失败前等待的时间量。如果在超时之前触发了ResultEvent,那么测试将会成功。在第二个测试testFailedServiceRequest()中,服务请求要求获取一个不存在的文件。因为这里的检查时针对故障事件的,所以测试将会通过,就跟我们预期的一样。

最后一个测试针对的是发出了多个异步调用的场景。

理论

FlexUnit 4引入了理论(theory)的概念。顾名思义,理论允许您创建一个测试来检查关于测试行为的假设。在必须测试一个可能返回很大或者甚至无穷大的值的方法时,这种测试类型非常有用。这种测试接受一些数据点作为参数,这些数据点可以与每个测试结合使用。您可以使用此功能来检查结果是否在指定范围内。

要查看理论的工作原理,创建一个新Test Suite Class,将其命名为FlexUnit4TheorySuite,复制入FlexUnit4TheorySuite.as的代码,其中包括:

[Theory]
public function testNumber( number:Number ):void 
{
   assumeThat( number, greaterThan( 0 ) );
   assertThat( number, instanceOf(Number) );
}

在本例中,理论检查一个数字是否大于0,并验证变量类型。

测试用户界面

尽管对于UI测试是否是TDD的一部分可能存在争议,但是在FlexUnit 4中,您可以创建能够检查用户界面和MXML组件的测试。

FlexUnit 4包含序列的概念,您可以创建序列来包含希望在UI上执行的所有操作。

FlexUnit4CheckUITester.as示例文件给出了此功能的一个示例。

setUp方法创建一个组件来持有一个按钮。接下来,无需向视图添加该组件,它调用UIImpersonator.addChild()

testButtonClick方法是一个简单的异步测试,它设置一个处理程序并指派一个鼠标事件。处理程序handleClickEvent仅用于检查事件字符串类型。

第二个测试testButtonClickSequence包含一个序列,该序列设置按钮的标签名称。接下来,SequenceWaiter指示序列等待指派按钮单击事件。在指派该事件之前,代码会调用addAssertHandler( handleButtonClickSqEvent, passThroughData )

handleButtonClickSqEvent方法处理该事件并将测试的按钮标签与传入的数据进行比较。

结束语

本文介绍了单元测试,以及使用Flash Builder 4和FlexUnit进行测试驱动开发,包括FlexUnit 4框架中的一些新特性。最近,TDD(以及通常所说的单元测试)引起了广泛的关注,因为它催生了更容易扩展和维护,但更不容易出现错误的应用程序。

在了解了如何创建FlexUnit Test Suites和测试用例之后,希望您能够将TDD的应用延伸到移动、Web和桌面Flash应用程序中,编写更好、更加可扩展且更加可重用的代码。

关于TDD和FlexUnit的更多信息,请参阅AdvancED Flash on Devices: Mobile Development with Flash Lite and Flash 10的第14章和AdvancED Flex 4的第2章。关于将FlexUnit与持续集成(Continuous Integration,CI)服务器集成的更多信息,请参阅FlexUnit4AntTasks

还可以查看我在InsideRIA上发表的文章FlexUnit 4特性概述。

关于作者

Elad Elrom是一名技术作家、技术领导和高级Flash工程师。作为一名技术作家,Elad编写了与Flash有关的书籍。它维护着一个活跃的博客,经常在与Flash平台相关的多种大会上发言。它帮助过多家公司按照XP和Scrum方法来实现流行的框架,优化和自动化编译处理器和代码审核,以及遵从最佳实践。Elad为不同领域、不同规模的各种客户提供过咨询,从大型企业(比如Viacom、NBC Universal和Weight Watchers)到新兴企业(比如MotionBox.com和KickApps.com)。您可以在Twitter上找到Elad

 

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: