Run FlexMonkey Tests from ANT

flexmonkey Like FlexUnit tests I am going to assume a few things:
1) You already have a working understanding of FlexMonkey.
2) You already have a build script set up (or have read the previous posts in this series.
3) You already have a properties file you are using (or setting all the properties directly into the build script.

If you do not know about FlexMonkey, FlexMonkey is:
FlexMonkey is a testing framework for Flex apps that provides for the capture, replay and verification of Flex UI functionality. FlexMonkey can record and playback Flex UI interactions, and generates ActionScript-based testing scripts that can easily be included within a continuous integration process. It uses the Flex Automation API and was created by extending Adobe’s sample automation adapter, AutoQuick.

For more information visit the Flex Monkey Project Home Site.

Unlike FlexUnit where it is run from a pretty little project, FlexMonkey has a lot of moving parts and requires quite a bit of setup. If you are running the automated tests from their AIR application then the process is pretty simple and all you have to do is hit the run button and you get all the information you need immediately.

However, setting up your application to run with FlexMonkey via ANT be prepared for a lot of setup and making sure everything fits just right. What I am really going to highlight here is what files to make sure to have and at what version.

The SDK version that your Application is built with is very important with FlexMonkey. You MUST be building with at least Flex 3.3 or you will be unable to run your application.

Keep Things In Order
The order of the previous steps didn’t really matter. Unit Test before building the application? Sure. Build your wrapper at the end? Why not. But now we do need to make sure that the application is made prior to running the automation test. I know this seems overly obvious, but I felt that it needed to be said that you had to have a build application to test on. This isn’t so with FlexUnit tests as the application required to run and the code are separate from the main application. Now with the automated tests we need to run against the main compiled application.

Gather the Parts
You can always pull the required parts from my main app, but if you are going to look for them, this is the list that you will need to put together. I would recommend including all this under one folder in your main project so that again the code for your FlexMonkey test isn’t cluttering up the main application.
flexmonkeyfolder
For most of these files I just went straight to their current source and pulled them from a project titled MonkeyAccessories. This is where you can get the MonkeyTestLauncher (html/swf), AC_OETags, AirMonkeyLibrary (for AIR builds), fluint, monkey-ant-task.jar, and MonkeyFlexUnitLibrary.

The remainder of the files are created either by the FlexMonkey AIR Application or by you. When you create a new FlexMonkey project you can select the location for the project to be hosted. This give you the monkeyTestProject and monkeyTestSuites. Then as you make your tests you will be adding in snapshot files into your snapshots folder. Also, the testSuites folder and it’s contents are created when you select to generate AS3 in the FlexMonkey App. The generated code you “can” edit, but you probably should. More than likely you will never have to go into these folders. Finally there s the test module for your project. This is used if you are running under targeting the specific swf or monkey agent mode (in your project properties).

You can name this module however you like and is used to run the automated test in the MonkeyTestLauncher provided by FlexMonkey.

Here is the code for my module, ANTBuildProjectTestModule.mxml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<mx:Module implements="net.digitalprimates.fluint.modules.ITestSuiteModule" xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            import testSuites.mainTestSuite.mainTestSuite;
           
            public function getTestSuites():Array
            {
                var suiteArray:Array = [];
                suiteArray.push(new mainTestSuite());
                return suiteArray;
            }
        ]]>
    </mx:Script>
</mx:Module>

You’ll notice that the module implements an interface provided for you in the MonkeyFlexUnitLibrary and then set the array of testSuites to run from your generated AS3 tests.

With your flexMonkey folder all set up we can now start working with our ANT build file.

The FlexMonkey Steps
To run the FlexMonkey ANT build tasks we will need to add these additional steps after the application has been build.

  • Clean and Create the FlexMonkey Report Folder
  • Compile the FlexMonkey Tester Module
  • Copy Launcher Files into Test Folder
  • Run Automated Test

Defining The Monkey Launcher ANT Task
In the earlier steps we were able to use a simple set of jar files to get all the tasks we need added to our build script. Not so with FlexMonkey. Below is the code necessary to run FlexMonkey specific tasks.

1
2
3
4
5
6
7
8
9
10
11
    <!-- Location of the Monkey ant tasks -->
    <path id="libraries">
       <fileset dir="${FlexMonkey.dir}/${FlexMonkeyLibs.dir}">
          <include name="**/*.jar"/>
       </fileset>
    </path>
   
    <!-- Define the Monkey launcher ant task -->
    <taskdef name="monkey-test-launcher"
       classname="com.gorillalogic.flexmonkey.anttask.MonkeyTestLauncherAntTask"
       classpathref="libraries" />

And the additional properties added in build.properties

1
2
3
4
#flexmonkey jar location
FlexMonkey.dir=${basedir}/flexMonkey
#flexmonkey jar location
FlexMonkeyLibs.dir=${FlexMonkey.dir}/libs

Now we can access the monkey-test-launcher task later in our build script.

Clean and Create the FlexMonkey Report Folder
Again, we are creating a new folder, only after deleting it to make sure the contents are new…

1
2
3
4
5
6
7
8
9
    <target name="cleanFlexMonkeyReport" description="Cleans the Report file">
        <echo>Deleting FlexMonkey Report Directory...</echo>
        <delete dir="${FlexMonkeyReport.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted FlexMonkey Report Directory</echo>
        <echo>Creating FlexMonkey Report Directory...</echo>
        <mkdir dir="${FlexMonkeyReport.dir}" />
        <echo>Created FlexMonkey Report Directory</echo>
    </target>

And the additional properties added in build.properties

1
2
#report output file
FlexMonkeyReport.dir=${basedir}/flexMonkeyReport

Compile the FlexMonkey Tester Module
Just as if we were building the application we need to build the module that includes our generated AS3 code provided to us from the FlexMonkey application.
We output this file to our test folder so that it is cleaned up after the build is complete.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <target name="compileFlexMonkeyTester">
        <echo>Compiling FlexMonkey Tester To Test</echo>
        <mxmlc file="${FlexMonkeySrc.dir}/${FlexMonkeyModule.name}.mxml"
            incremental="false"
            actionscript-file-encoding="UTF-8"
            output="${FlexMonkeyModule.file}"
            debug="${Debug.Boolean}"
            keep-generated-actionscript="false">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <compiler.source-path path-element="${FlexMonkeySrc.dir}" />
            <compiler.library-path dir="${FlexMonkeyLibs.dir}" append="true">
                <include name="*.swc"/>
            </compiler.library-path>
        </mxmlc>
        <echo>Compiled FlexMonkey Tester To Test</echo>
    </target>

And the additional properties added in build.properties

1
2
3
4
5
6
#flexmonkey module
FlexMonkeyModule.name=ANTBuildProjectTestModule
#flexmonkey module
FlexMonkeyModule.file=${Test.dir}/${FlexMonkeyModule.name}.swf
#flexmonkey src location
FlexMonkeySrc.dir=${FlexMonkey.dir}/src

Copy Launcher Files into Test Folder
Now we need to do some moving around of files to get ready for the final build. We wouldn’t want our version of the MonkeyTestLauncher to get corrupted in any way, so we move a copy into the test folder – again, this will be cleaned at the end of the build. While researching this I also found that some users experienced bugs/hangs/strange behavior when the swf file to test was located in a folder different from the compiled module and the MonkeyTestLauncher. So in this step we will also create a copy of this application and move it into our test folder. Now with all the ingredients assembled we are ready to shake & bake.

1
2
3
4
5
6
7
8
9
10
    <target name="copyLauncherToTestFolder">
        <echo>Copy Launcher to Test</echo>
        <copy todir="${Test.dir}" includeemptydirs="false" overwrite="true">
            <fileset dir="${FlexMonkeyLauncher.dir}"/>
        </copy>
        <echo>Copied Launcher to Test</echo>
        <echo>Copy App to Test</echo>
        <copy todir="${Test.dir}" overwrite="true" file="${Deploy.dir}/${Application.name}${timestamp}.swf"/>
        <echo>Copied App to Test</echo>
    </target>

And the additional properties added in build.properties

1
2
#flexmonkey launch
FlexMonkeyLauncher.dir=${FlexMonkey.dir}/launcher

Run Automated Test
We have now assembled all of our files into the test folder, which when the build is complete will be wiped and not take any room on our drives.
Now we get to use the monkey-test-launcher task that we defined earlier, all we need to tell it is where to find the launcher application, the target swf (the main app that we are testing), the module that includes our generated AS3 test suite instructions, our snapshot directory with any necessary snapshots required to check against, the toDir (output directory) for the junit reports, and finally a flag to stop the build script if a failure is discovered – haltonfailure.

Once the monkey-test-launcher task is complete we again take the junit formatted reports and build a pretty human readable report by using the junitreport task.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <target name="runAutomatedTest">
        <monkey-test-launcher
            timeout="0"
            launcher="${FlexMonkeyLauncher.file}"
            targetSwf="${Test.dir}/${Application.name}${timestamp}.swf"
            testModuleSwf="${FlexMonkeyModule.file}"
            snapshotDir="${Snapshots.dir}"
            toDir="${FlexMonkeyReport.dir}"
            haltonfailure="false"/>
       
        <junitreport todir="${FlexMonkeyReport.dir}">
            <fileset dir="${FlexMonkeyReport.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${FlexMonkeyReport.dir}/html"/>
        </junitreport>
    </target>

And the additional properties added in build.properties

1
2
3
4
#snapshots
Snapshots.dir=${FlexMonkey.dir}/snapshots
#flexmonkey launcher app
FlexMonkeyLauncher.file=${Test.dir}/MonkeyTestLauncher.html

Do It!
Go on! Put it all together and try it out. You’ll be tickled pink to watch the build script open and close windows and run your test applications.

Current File
We are now done putting together our entire build script with all the bells and whistles. There is still on more post with all the source code, make sure to check it out in case you don’t like typing or copying & pasting.

Currently your build script should look similar to this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
<?xml version="1.0" encoding="UTF-8"?>
<project name="Build File" basedir="." default="compileProject">
   
    <!-- Set Up ================================================= -->
   
    <!-- file description -->
    <description>Build Script</description>
   
    <!--location of property file -->
    <property file="./build.properties"
        description="properities for builds" />
   
    <!-- timestamp -->
    <tstamp>
        <format property="timestamp" pattern="yyyyMMdd" />
    </tstamp>
   
    <!-- additional tasks -->
    <taskdef resource="flexTasks.tasks" classpath="${FlexTasks.file}"/>
    <taskdef resource="flexUnitTasks.tasks" classpath="${FlexUnitTasks.file}"/>
   
    <!-- ======================================================== -->
   
   
    <!-- Compile Project ======================================== -->
    <target name="compileProject"
        depends="cleanDeploy,buildWrapper,buildCustomWrapper,copyNonEmbeddedFiles,compileLibraries,runFlexUnitTests,compileApplication,runFlexMonkeyTests,asDocs,cleanTempDirectories"
        description="compiles application"/>
   
    <!-- Build Wrappers ========================================= -->
    <target name="buildWrapper">
        <echo>Building Wrapper...</echo>
        <html-wrapper title="${Application.name}"
            height="100%" width="100%"
            bgcolor="#FFFFFF" file="${Application.name}.html"
            application="${Application.name}"
            swf="${Application.name}${timestamp}"
            version-major="${Major.version}"
            version-minor="${Minor.version}"
            version-revision="${Revision.version}"
            history="true"
            template="express-installation"
            output="${Deploy.dir}" />
        <echo>Built Wrapper</echo>
    </target>
   
    <target name="buildCustomWrapper">
        <echo>Building Custom Wrapper...</echo>
        <copy file="${Template.file}" tofile="${Deploy.dir}/${Output.file}" overwrite="true">
            <filterchain>
                <replacetokens>
                    <token key="version_major" value="${Major.version}"/>
                    <token key="version_minor" value="${Minor.version}"/>
                    <token key="version_revision" value="${Revision.version}"/>
                    <token key="application" value="${Application.name}"/>
                    <token key="width" value="100%"/>
                    <token key="height" value="100%"/>
                    <token key="bgcolor" value="#FFFFFF"/>
                    <token key="swf" value="${Application.name}${timestamp}"/>
                </replacetokens>
            </filterchain>
        </copy>
        <echo>Built Custom Wrapper</echo>
    </target>
    <!-- ======================================================== -->
   
    <!-- Compile Application ==================================== -->
    <target name="compileApplication">
        <echo>Compiling SWF To Deploy</echo>
        <mxmlc file="${Src.dir}/${Application.name}.mxml"
            incremental="false"
            actionscript-file-encoding="UTF-8"
            output="${Deploy.dir}/${Application.name}${timestamp}.swf"
            debug="${Debug.Boolean}"
            keep-generated-actionscript="false">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <default-background-color>0xFFFFFF</default-background-color>
            <metadata>
                <creator>Jonathan Campos</creator>
                <publisher>UnitedMindset</publisher>
                <language>EN</language>
            </metadata>
            <compiler.source-path path-element="${Src.dir}" />
            <compiler.library-path dir="${basedir}/${DeploySWC.dir}" append="true">
                <include name="*.swc"/>
            </compiler.library-path>
        </mxmlc>
        <echo>Compiled SWF To Deploy</echo>
    </target>
    <!-- ======================================================== -->
   
    <!-- NONEMBEDDED FILES ====================================== -->
    <target name="copyNonEmbeddedFiles">
        <echo>Deleting Deploy Assets Directory...</echo>
        <delete dir="${DeployAssets.dir}" failOnError="false" includeEmptyDirs="true" />
        <echo>Deleted Deploy Assets Directory</echo>
        <echo>Creating Assets Folder</echo>
        <mkdir dir="${DeployAssets.dir}"/>
        <echo>Created Assets Folder</echo>
        <echo>Copy Nonembedded Resources To Deploy</echo>
        <copy todir="${DeployAssets.dir}" includeemptydirs="false" overwrite="true">
            <fileset dir="${Assets.dir}"/>
        </copy>
        <echo>Copied Nonembedded Resources To Deploy</echo>
    </target>
    <!-- ======================================================== -->
   
    <!-- COMPILE LIBRARIES ====================================== -->
    <target name="compileLibraries" depends="cleanDeploySWCs,copyPrecompiledSWCs,compileLibrary" />

    <target name="cleanDeploySWCs">
        <echo>Deleting Deploy SWC Directory...</echo>
        <delete dir="${DeploySWC.dir}" failOnError="false" includeEmptyDirs="true"/>
        <echo>Deleted Deploy SWC Directory</echo>
        <echo>Creating Deploy SWC Directory...</echo>
        <mkdir dir="${DeploySWC.dir}"/>
        <echo>Created Deploy SWC Directory</echo>
    </target>

    <target name="copyPrecompiledSWCs">
        <echo>Copying to Deploy SWC Directory...</echo>
        <copy todir="${DeploySWC.dir}" includeemptydirs="false" overwrite="true">
            <fileset dir="${ApplicationLibs.dir}"/>
        </copy>
        <echo>Copied to Deploy SWC Directory...</echo>
    </target>
   
    <target name="compileLibrary" description="compiles the Library">
        <echo>Compiling Library SWC To Deploy SWC Folder</echo>
        <compc debug="${Debug.Boolean}" output="${DeploySWC.dir}/${Library.name}.swc">
            <source-path path-element="${LibrarySrc.dir}"/>
            <include-sources dir="${LibrarySrc.dir}" includes="*"/>
            <compiler.library-path dir="${LibraryLibs.dir}" append="true">
                <include name="*.swc"/>
            </compiler.library-path>
            <metadata>
                <creator>Jonathan Campos</creator>
                <publisher>UnitedMindset</publisher>
                <language>EN</language>
            </metadata>
        </compc>
        <echo>Compiled Library SWC To Deploy SWC Folder</echo>
    </target>
   
    <!-- Clean Up =============================================== -->
    <target name="cleanDeploy" description="Cleans the deploy file">
        <echo>Deleting Deploy Directory...</echo>
        <delete dir="${Deploy.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted Deploy Directory</echo>
        <echo>Creating Deploy Directory...</echo>
        <mkdir dir="${Deploy.dir}" />
        <echo>Created Deploy Directory</echo>
    </target>
   
    <target name="cleanTempDirectories">
        <echo>Deleting Deploy SWC Directory...</echo>
        <delete dir="${DeploySWC.dir}" failOnError="false" includeEmptyDirs="true"/>
        <echo>Deleted Deploy SWC Directory</echo>
       
        <echo>Deleting Test Directory...</echo>
        <delete dir="${Test.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted Test Directory</echo>
    </target>

    <!-- ======================================================== -->
   
    <!-- ASDOC ================================================== -->
    <target name="asDocs" depends="cleanASDoc,compileASDoc" description="build of asdocs" />

    <!-- Delete the existing output folder and files and then regenerate the output folder -->
    <target name="cleanASDoc">
        <echo>Deleting ASDoc Directory...</echo>
        <delete dir="${Asdoc.dir}" failOnError="false" includeEmptyDirs="true" />
        <echo>Deleted ASDoc Directory</echo>
        <echo>Creating ASDoc Directory...</echo>
        <mkdir dir="${Asdoc.dir}" />
        <echo>Created ASDoc Directory</echo>
    </target>

    <!-- Run the ASDoc executable and generate the ASDocs to the new output folder -->
    <target name="compileASDoc">
        <echo>ASDoc Compiling...</echo>
        <exec executable="${AsDocs.executable}" failonerror="true">
            <arg line="-doc-sources '${AppClasses.dir}'" />
            <arg line="-doc-sources '${LibrarySrc.dir}'" />
            <arg line="-external-library-path '${LibrarySrc.dir}'" />
            <arg line="-external-library-path '${Library.dir}/${LibraryLibs.dir}'" />
            <arg line="-main-title '${Main.title}'" />
            <arg line="-window-title '${Window.title}'" />
            <arg line="-output '${Asdoc.dir}'" />
            <arg line="-footer '${Footer.text}'" />
        </exec>
        <echo>ASDoc Compile Complete</echo>
    </target>
    <!-- ======================================================== -->
   
    <!-- FlexUnit =============================================== -->
    <target name="runFlexUnitTests"
        description="run flexunit tests"
        depends="cleanFlexUnitReport,cleanTest,compileTestRunner,executeTestRunner"/>
   
    <target name="cleanFlexUnitReport" description="Cleans the Report file">
        <echo>Deleting FlexUnit Report Directory...</echo>
        <delete dir="${FlexUnitReport.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted FlexUnit Report Directory</echo>
        <echo>Creating FlexUnit Report Directory...</echo>
        <mkdir dir="${FlexUnitReport.dir}" />
        <echo>Created FlexUnit Report Directory</echo>
    </target>
   
    <target name="cleanTest" description="Cleans the Test file">
        <echo>Deleting Test Directory...</echo>
        <delete dir="${Test.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted Test Directory</echo>
        <echo>Creating Test Directory...</echo>
        <mkdir dir="${Test.dir}" />
        <echo>Created Test Directory</echo>
    </target>
   
    <target name="compileTestRunner">
        <echo>Compiling Test Runner SWF To Test</echo>
        <mxmlc file="${TestRunnerSrc.dir}/${TestRunner.name}.mxml"
            output="${Test.dir}/${TestRunner.name}.swf">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <compiler.source-path path-element="${Src.dir}" />
            <compiler.library-path dir="${basedir}/" append="true">
                <include name="${DeploySWC.dir}"/>
            </compiler.library-path>
            <compiler.library-path dir="${TestRunnerLib.dir}" append="true">
                <include name="*.swc"/>
            </compiler.library-path>
            <compiler.verbose-stacktraces>true</compiler.verbose-stacktraces>
            <compiler.headless-server>true</compiler.headless-server>
        </mxmlc>
        <echo>Compiled Test Runner SWF To Test</echo>
    </target>
   
    <target name="executeTestRunner" description="executes the test runner app">
        <echo>Running Test Runner SWF</echo>
        <flexunit swf="${Test.dir}/${TestRunner.name}.swf"
            toDir="${FlexUnitReport.dir}"
            haltonfailure="false"
            verbose="true"
            localTrusted="true"/>
        <echo>Ran Test Runner SWF</echo>
       
        <echo>Generate Readable Tests</echo>
        <junitreport todir="${FlexUnitReport.dir}">
            <fileset dir="${FlexUnitReport.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${FlexUnitReport.dir}/html"/>
        </junitreport>
        <echo>Generated Readable Tests</echo>
    </target>
   
    <!-- ======================================================== -->
   
    <!-- FlexMonkey ============================================= -->
    <target name="runFlexMonkeyTests"
            description="run flexmonkey tests"
            depends="cleanFlexMonkeyReport,
        compileFlexMonkeyTester,
        copyLauncherToTestFolder,runAutomatedTest"/>

   
    <!-- Location of the Monkey ant tasks -->
    <path id="libraries">
       <fileset dir="${FlexMonkey.dir}/${FlexMonkeyLibs.dir}">
          <include name="**/*.jar"/>
       </fileset>
    </path>
   
    <!-- Define the Monkey launcher ant task -->
    <taskdef name="monkey-test-launcher"
       classname="com.gorillalogic.flexmonkey.anttask.MonkeyTestLauncherAntTask"
       classpathref="libraries" />
   
    <target name="cleanFlexMonkeyReport" description="Cleans the Report file">
        <echo>Deleting FlexMonkey Report Directory...</echo>
        <delete dir="${FlexMonkeyReport.dir}" failOnError="false"
            includeEmptyDirs="true" />
        <echo>Deleted FlexMonkey Report Directory</echo>
        <echo>Creating FlexMonkey Report Directory...</echo>
        <mkdir dir="${FlexMonkeyReport.dir}" />
        <echo>Created FlexMonkey Report Directory</echo>
    </target>
   
    <target name="compileFlexMonkeyTester">
        <echo>Compiling FlexMonkey Tester To Test</echo>
        <mxmlc file="${FlexMonkeySrc.dir}/${FlexMonkeyModule.name}.mxml"
            incremental="false"
            actionscript-file-encoding="UTF-8"
            output="${FlexMonkeyModule.file}"
            debug="${Debug.Boolean}"
            keep-generated-actionscript="false">
            <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
            <compiler.source-path path-element="${FlexMonkeySrc.dir}" />
            <compiler.library-path dir="${FlexMonkeyLibs.dir}" append="true">
                <include name="*.swc"/>
            </compiler.library-path>
        </mxmlc>
        <echo>Compiled FlexMonkey Tester To Test</echo>
    </target>
   
    <target name="copyLauncherToTestFolder">
        <echo>Copy Launcher to Test</echo>
        <copy todir="${Test.dir}" includeemptydirs="false" overwrite="true">
            <fileset dir="${FlexMonkeyLauncher.dir}"/>
        </copy>
        <echo>Copied Launcher to Test</echo>
        <echo>Copy App to Test</echo>
        <copy todir="${Test.dir}" overwrite="true" file="${Deploy.dir}/${Application.name}${timestamp}.swf"/>
        <echo>Copied App to Test</echo>
    </target>

    <target name="runAutomatedTest">
        <monkey-test-launcher
            timeout="0"
            launcher="${FlexMonkeyLauncher.file}"
            targetSwf="${Test.dir}/${Application.name}${timestamp}.swf"
            testModuleSwf="${FlexMonkeyModule.file}"
            snapshotDir="${Snapshots.dir}"
            toDir="${FlexMonkeyReport.dir}"
            haltonfailure="false"/>
       
        <junitreport todir="${FlexMonkeyReport.dir}">
            <fileset dir="${FlexMonkeyReport.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="frames" todir="${FlexMonkeyReport.dir}/html"/>
        </junitreport>
    </target>
    <!-- ======================================================== -->
   
</project>

And your properties:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#####################################################################
#
#  Compiler Properties
#
#####################################################################

# Flex SDK File Location
FLEX_HOME=C:/Program Files/Adobe/Flex Builder 3 Plug-in/sdks/3.3
#flextasks jar location
FlexTasks.file=flexTasks/flexTasks.jar
#deploy directory
Deploy.dir=deploy
#source directory
Src.dir=src
#debug flag
Debug.Boolean=false
#application name
Application.name=ANTBuildProject
#version major
Major.version=9
#version minor
Minor.version=0
#version revision
Revision.version=124
#Template File
Template.file=index.template.html
#Output HTML File
Output.file=index.html
#Assets
Assets.dir=${Src.dir}/assets
#Assets
DeployAssets.dir=${Deploy.dir}/assets
#Deploy SWC Directory
DeploySWC.dir=deploySWC
#Library Directory
Library.dir=C:/workspace/ANTBuildLibrary
#Library Libs
LibraryLibs.dir=${Library.dir}/libs
#Library Src
LibrarySrc.dir=${Library.dir}/src
#library name
Library.name=ANTBuildLibrary
#Application Libs
ApplicationLibs.dir=${basedir}/libs

#####################################################################
#
#  ASDoc Properties
#
#####################################################################
#asdoc output
Asdoc.dir=asdoc
#the location of asdocs on your computer
AsDocs.executable=${FLEX_HOME}/bin/asdoc.exe
#Asdoc Footer Text
Footer.text=Some legal jargon
#window title
Window.title=Window Title
#main title
Main.title=Main Title
#the location of your application classes on your computer
AppClasses.dir=${basedir}/src

#####################################################################
#
#  FlexUnit Properties
#
#####################################################################
#report output file
FlexUnitReport.dir=${basedir}/flexUnitReport
#test dir
Test.dir=${basedir}/test
#flextasks jar location
FlexUnitTasks.file=flexTasks/flexUnitTasks-4.0.0.jar
#Test Runner Dir
TestRunner.dir=C:/workspace/AntBuildUnitTest
TestRunnerSrc.dir=${TestRunner.dir}/src
TestRunnerLib.dir=${TestRunner.dir}/libs
#Test Runner Dir
TestRunner.name=ANTBuildUnitTest

#####################################################################
#
#  FlexMonkey Properties
#
#####################################################################
#flexmonkey jar location
FlexMonkey.dir=${basedir}/flexMonkey
#flexmonkey jar location
FlexMonkeyLibs.dir=${FlexMonkey.dir}/libs
#flexmonkey src location
FlexMonkeySrc.dir=${FlexMonkey.dir}/src
#report output file
FlexMonkeyReport.dir=${basedir}/flexMonkeyReport
#flexmonkey launch
FlexMonkeyLauncher.dir=${FlexMonkey.dir}/launcher
#flexmonkey launcher app
FlexMonkeyLauncher.file=${Test.dir}/MonkeyTestLauncher.html
#flexmonkey module
FlexMonkeyModule.name=ANTBuildProjectTestModule
#flexmonkey module
FlexMonkeyModule.file=${Test.dir}/${FlexMonkeyModule.name}.swf
#snapshots
Snapshots.dir=${FlexMonkey.dir}/snapshots
  • Share/Bookmark

Comments (13)

julienFebruary 9th, 2010 at 12:26 pm

excellent article, thanks for sharing!

gurpreetMay 3rd, 2010 at 4:09 am

My Flex app uses RESTFul web services. To support all methods I am using javascript in the wrapper HTML to interact with the services. My assumption is that tartgetting my app SWF will stop interaction with javascript. Can I target the wrapper HTML in the continuous integration testing environment as mentioned on this post?

Jonathan CamposMay 3rd, 2010 at 9:41 am

Yes, you definitely can run your app in the “Monkey Link” mode. This way you will use the original wrapper and connect via LocalConnection.

Sabyasachi MukherjeeMay 7th, 2010 at 1:15 am

Where i can set the settings related “Monkey Link” mode i.e. i need more information against the comments posted by Gurpreet on May 3rd, 2010 at 4:09 am
Please have a look on the wrapper section of the build file:

Building Wrapper…

Built Wrapper

Building Custom Wrapper…

Built Custom Wrapper

Sabyasachi MukherjeeMay 7th, 2010 at 1:17 am


target name=”buildWrapper”>
echo>Building Wrapper…
html-wrapper
title=”RMSultra”
file=”index.html”
height=”300″
width=”400″
bgcolor=”red”
application=”RMSultra”
swf=”E:/Apache-ANT/RMS_ultra/bin-debug/Test/RMSultra”
version-major=”9″
version-minor=”0″
version-revision=”0″
history=”false”
template=”express-installation”
output=”E:/Apache-ANT/RMS_ultra/bin-debug/DeploySWC” />
echo>Built Wrapper
target>

target name=”buildCustomWrapper”>
echo>Building Custom Wrapper…
copy file=”E:/Apache-ANT/RMS_ultra/RMSultra/launcher/index.template.html” tofile=”E:/Apache-ANT/RMS_ultra/bin-debug/DeploySWC/index.html” overwrite=”true”>
filterchain>
replacetokens>
token key=”version_major” value=”9″/>
token key=”version_minor” value=”0″/>
token key=”version_revision” value=”0″/>
token key=”application” value=”RMSultra”/>
token key=”width” value=”100%”/>
token key=”height” value=”100%”/>
token key=”bgcolor” value=”#FFFFFF”/>
token key=”swf” value=”E:/Apache-ANT/RMS_ultra/bin-debug/test/”/>
replacetokens>
filterchain>
copy>
Built Custom Wrapper

Jonathan CamposMay 7th, 2010 at 8:57 am

When you are using the FlexMonkey application to set up your testing, just select in the properties “MonkeyLink”. To get this to work you will need to compile the application with the automation swcs and the flexmonkey automation swcs. Then the MonkeyLink can be established.

After that, to automate it you just need to build a module that runs your automated tests and can run from the flexmonkey jar. Then you can tie it into ant just the way you did before.

I know this seems like a lot of steps but you can easily take care of this in just a few hours.

At some point I should stop and write out instructions as to how to do all of this. :)

Sabyasachi MukherjeeMay 7th, 2010 at 10:34 pm

Thanks for your inputs… :)

saralaMay 14th, 2010 at 3:52 am

hi all,
as per jonathan’s words, i have used the monkeylink option , compiled my application with the required swcs and also the connection is established. Now, while automating, my module complies fine and when i run my app from ANT i see the following

D:\>ant -buildfile d:/projects/antproject/build.xml run_functional_test
Buildfile: d:\projects\antproject\build.xml

init:
[delete] Deleting directory d:\projects\antproject\bin-debug
[mkdir] Created dir: d:\projects\antproject\bin-debug

compile_test_module:
[java] Loading configuration file D:\Program Files\Adobe\Flex Builder 3\sdk
s\3.5\frameworks\air-config.xml
[java] D:\projects\antproject\bin-debug\monkeyTester.swf (1383886 bytes)

compile_functional_test:
[java] Loading configuration file D:\Program Files\Adobe\Flex Builder 3\sdk
s\3.5\frameworks\air-config.xml
[java] D:\projects\antproject\bin-debug\antproject.swf (1947791 bytes)
[copy] Copying 1 file to d:\projects\antproject\bin-debug

run_functional_test:
[monkey-test-launcher] Invoking runner with command: rundll32 url.dll,FileProtoc
olHandler d:\Program Files\Adobe\Flex Builder 3\sdks\3.5\bin\adl.exe .\bin-debug
\antproject-app.xml
[monkey-test-launcher] Opened server socket

and nothing happens after this. I am eager to know what it means and additional information about the launcher and tester would be appreciated

Jonathan CamposMay 14th, 2010 at 8:42 am

When you compiled your application, did you make sure to compile in the monkey link swcs? This is what allows the two to talk. I’ll work up a monkeylink specific blog post shortly, sadly they do take some time ;)

saralaMay 17th, 2010 at 2:16 am

thanks for your reply,
but i did not make out whats compiling in the monkey link swcs. While establishing connection with the flex monkey i added the following swcs in the project libs folder , AirMonkeyLibrary.swc, automation_monkey.swc, Easy2BuildMonkeyLink.swc, FlexAutomationLibrary.swc, fluint.swc, MonkeyFlexUnitLibrary.swc.. with these been included along with monkey-ant-task.jar in my library i could establish the connection to flex monkey. I also generated the tests and the module required to automate testing is also ready.
Am i missing anything till here? Please let me know jonanthan

Jonathan CamposMay 17th, 2010 at 10:22 pm

No, those are the correct swcs. Let me play with it and see if I can come up with a better explaination.

saralaMay 17th, 2010 at 11:24 pm

thanks for your reply,
Just to make it easy for you to debug the error, i want to tell few things about my project. I am building an AIR application which has very simple button controls and label and nothing complicated. Is it necessary that we have to have monkeyTest launcher ( i.e MonkeyTestLauncher (html/swf), AC_OETags, ) as i am not using any HTML component. is this what is the reason for the opened srever socket problem? This info might help for you to understand my problem better.

Jonathan CamposMay 18th, 2010 at 8:44 am

Nope, none of that is necessary to run the monkey link. The socket server is made so that the external app can talk to your application. If you are trying for immediate resolution I’d say to hit up the FlexMonkey support system. Anything I do will still be a ways out between the day job and side work.

Leave a comment

Your comment