41
Functional UI testing of Adobe Flex RIA Viktor Gamov [email protected] August, 12 2011

Functional UI testing of Adobe Flex RIA

Embed Size (px)

Citation preview

  1. 1. Functional UI testing of Adobe Flex RIAViktor [email protected] August, 12 2011
  2. 2. Agenda Why to test? How to test? What the automated testing means? Automated testing tools Automated testing architecture Loading automation classes Creating test-friendly applications Bunch of Demos
  3. 3. Software has to satisfy theuser!
  4. 4. Demo: Killer RIA
  5. 5. How to test? Unit Testing Functional (UAT, QA) Testing Integration Testing Load Testing
  6. 6. Metaphor: building the house think of unit tests as having the building inspectorat the constructions site think of functional testing as having thehomeowner visiting the house and beinginterested in how the house looks, if the roomshave the desired size
  7. 7. What automated testing means?Automated testing is the use of software to control theexecution of tests, the comparison of actual outcomes topredicted outcomes, and other test control and testreporting functions.
  8. 8. General approaches Code-Driven Testing - the public (usually) interfaces toclasses, modules, or libraries are tested with a variety of inputarguments to validate that the returned results are correct. GUI Testing - a testing framework generates and recordsthe UI events keystrokes and mouse clicks. The tester observesthe changes reected via the user interface to validatethe observable behavior of the program.
  9. 9. Some AutomatedTesting tools HP QuickTest Professional (QTP) Selenium Ranorex FlexMonkey
  10. 10. HP QTP All-in-one suite for automation testingenterprise applications Supports the large pool of softwaredevelopment environments like SAP , Web ,Oracle etc. Support libraries out-of-the-box with Flex(qtp.swc, qtp_air.swc) VBScript as scripting language
  11. 11. Selenium Web applications testing Open source and large community Cross platform (Selenium IDE - browserextension) Uses JavaScript as scripting language
  12. 12. Ranorex Similar to QTP, but easier to use Support various technologies: .NET, WPF,Silverlight, Qt, Win32, WFC, Java SWT, Flash/Flex Script languages C#,VB.NET, IronPython Integrates with Visual Studio 2010 Platform: Windows only
  13. 13. Flex Monkey Open Source (commercial support available) Flex apps testing centric tool Cross platform (console - AIR application) Generated FlexUnit 4 test code Supports testing only Flex applications (no Flash) Integration with Selenium IDE (FlexMonkiumproject)
  14. 14. Demo
  15. 15. and the QTP testing tool. Automated Testing automation tool Automation tools are applications that use the data that is dinclude QTP, Omniture, and Segue. delegates Flex framework components are instrumented by attaching a de Architecturetime. The delegate class defines the methods and properties required to perfoThe following illustration shows the relationship between an application, an age AutomationTool automation tool are applications that use the data that provided by the agent. automation agent facilitates communications between an application and an automationAgenttool. delegates are Flex framework components are instrumented by attaching a delegate class to each component at run time. The delegate class Application denes the methods and properties requiredbuilt with Flexto perform automation.As this illustration shows, the automation tool uses an agent to communicate wit
  16. 16. Automation APICore Flex APISystemManager Automation DelegatesAutomation APIAutomationManager DelegatesDelegatesQTPFlexMonkeySeleniumAgent Classes AgentAgent AgentAutomation Tools QTP FlexMonkeySelenium
  17. 17. You are not required to create an instance of your adapter in the init() method. You can also create this instance inthe APPLICATION_COMPLETE event handler if your agent requires that the application must be initialized before it isinstantiated. Automation owUnderstanding the automation flowWhen the application is initialized, the AutomationManager object is created. In its init() method, it adds a listenerfor Event.ADDED events.The following image shows the order of events when the application is initialized and the AutomationManager classconstructs the delegate map.1. Creates the display list. 3. Listens for ADDED event. SystemManagerAutomationManager Display List HGroupAutomation AccordionButton 4. Maintains map of componentTextAreaclass to delegate class. {} HGroup map[Button] = map[spark.components.Button] TextInput map[HGroup] = map[spark.components.HGroup] TextInput ... Button2. Dispatches the ADDED Delegate event for each UIComponent. 5. Handles component events.Records and plays back eventson component instances. { map[spark.components.Button] = SparkButtonAutomationImpl map[spark.components.HGroup] = SparkGroupAutomationImpl ...}1 The SystemManager class creates the display list, a tree of visible objects that make up your application.
  18. 18. 5 When it is created, the delegate class adds a reference to its instance in the delegate class map. The de then handles events during record and play-back sequences. The delegate is now considered registered with the component. It adds event listeners for the compon Automation ow and calls the AutomationManager when the component triggers those events.After the components in the display list are instantiated and mapped to instances of their delegate classeAutomationManager is ready to listen for events and forward them to the agent for processing.The following image shows the flow of operation when a user performs an action that is a recordable eventthe user clicks a Button control in the application.1. User clicks on a component. Application 3. recordAutomationEvent() called.built with Flex Automation-AgentManagerDelegate 4. Dispatches RECORD event.5. Handles RECORD events. Button2. Listens for component events such as CLICK.1 The user clicks the Button control in the application. The SystemManager dispatches a MouseEvent.2 The SparkButtonAutomationImpl class, the Button controls automation delegate, listens for click e delegates click event handler, the delegate calls the AutomationManager recordAutomationEvent
  19. 19. Loading automationclasses Compile time -To compile an application that includes theautomation classes, include automation libraries at compile time byusing the compilers include-libraries option. Run time - Compile your app without any additions. At runtime, load your application into a wrapper SWF le that has built inautomation libraries. This wrapper SWF le uses SWFLoader toload your application SWF le to be tested.
  20. 20. Creating test-friendlyapplications providing meaningful identication of objectssubmitPanel rather than myPanel or p1 avoiding renaming objectsif (!automationName) return label; adding and removing containers from theautomation hierarchyshowInAutomationHierarchy = false; instrumenting events instrumenting custom components
  21. 21. Instrumenting events instrumenting existing events - the tools are notgenerally interested in recording all the events : MOUSE_OVER instrumenting custom events -when you extendcomponents, you often add events that are triggered by newfunctionality of that component blocking and overriding events - in some cases,you might want to block or override the default events that arerecorded for a component
  22. 22. Instrumenting existing events override the replayAutomatableEvent()method of the IAutomationObject interface call the AutomationManagers method when arecordAutomatableEvent()button dispatch MOUSE_MOVE event dene the new event for the agent
  23. 23. Instrumenting custom events call the Automation.automationManager2 classsrecordCustomAutomationEvent() method dene the new event for the agent listen for the AutomationCustomReplayEvent,get the details about it and replay the event
  24. 24. What is a custom component A component extending from a standard component(No additional events, no additional properties) A component extending from a standard component Additional events/ additional properties A component extending from a non container class, butthe current class is a container.
  25. 25. Instrumenting custom components create a delegate class that implements the requiredinterfaces (IAutomationObject) add testing-related code to the component (notrecommended)
  26. 26. Create a delegate class use a pattern for delegate class name[ComponentClassName]AutomationImpl extend the UIComponentAutomationImplor implement IAutomationObject interface mark the delegate class as a mixin by usingthe [Mixin] metadata keyword register the delegate with theAutomationManager by calling theAutomation.registerDelegateClass()
  27. 27. Instrument componentwith a delegate class override the getters of the automationName and theautomationValue properties add listeners for events that the automation toolrecords override the replayAutomatableEvent() method add the new component to custom class denitionXML le (FlexMonkeyEnv.xml)
  28. 28. Instrument compositecomponent override the getter of the numAutomationChildrenproperty and the methods to expose children:getAutomationChildren()getAutomationChildrenAt()
  29. 29. And one more thing...
  30. 30. PROBLEM Unless tests are run automatically, testing isineffective
  31. 31. Solution: Use Jenkins Will automatically run tests for you Will tell you if they fail Provide you reports, result and metrics Can be downloaded from http://jenkins-ci.org/ Very easy to setup and congure
  32. 32. Demo
  33. 33. Instead of an epilogue
  34. 34. 90% of coding is debugging. The other 10% is writing bugs Bram Cohen, author of the BitTorrent protocolIf debugging is the process of removing bugs thenprogramming must be the process of putting them in Edsger Dijkstra
  35. 35. Be brave!Just test and no more bugs!
  36. 36. Resources GorillaLogic http://goo.gl/Ly6dd FlexMonkey resources page http://goo.gl/eKKaZ Ranorex Flex Testing http://goo.gl/sJI1L Automation Docs http://goo.gl/PwuZc Blog on Flex Automation http://goo.gl/CCQ80
  37. 37. p.s. Sample codehttps://github.com/gAmUssA/ex_exmonkey_exunit_ci http://myex.org/presentations/symposium4/Viktor.zip