This week we will create the scripting component of our TestOptimal model-based testing project. But before we do, I need to refer back to last week's article and point out that my initial model contained a "bad state" - one that was inaccessible from any other state. I found this out by importing my model into TestOptimal and having it check out the many states and transitions of my model. You can do a dry run using TestOptimal, which will generate a test sequence that covers all transitions in your model. If you have any isolated states or states that are not reachable (as was the case for me), an error popup will be displayed, which indicates you have missed some transitions thus making some states not reachable. TestOptimal found my "bad state" and I quickly fixed it. It turns out that a typo contributed to this error. The new (and correct) model has been posted to last week's article (Model-Based Testing For Web Applications With TestOptimal - (Part 1) Preparing The Model).
TestOptimal uses a scripting format called mScript. mScript is a simple, XML based scripting to drive your web applications. It has only 14 tags and is very easy to learn and use for writing your testing scripts. It's also very powerful. Here's a list of the 14 tags:
To write your mScript, you'll need an XML editor. I use Notepad++ (Windows) or TextWrangler (Mac OS). Here are the steps I used to create my mScript:
1. Generate a skeleton mScript. To do so, just click on mScriptTab, the mScript displayed is the mScript we will use. Right-mouse click on the script content and select "View Source" option, copy and paste the code into your XML editor.
2. Gather UI identifiers from the target web interface (google maps). I used the FireFox Selenium IDE to do this. By recording each action from my model, e.g. click Search maps, the Selenium IDE captured the identifiers I needed.
3. Add the specific script actions that pertain to each transition in the model. There were 11 transitions in my model, so I had 11 scripts to write. Within the skeleton script generated in Step #1 above, there are 2 sets of function stubs under each state and 3 sets of function stubs under each transition. To keep things simple, I did not use any of the state functions, instead concentrating on the transition function actions. The transitions for my model involved only two actions: clicking on objects (e.g. buttons) or selecting from a pop-down menu. Hence I needed to write two action scripts:
"element_locator" is a string to locate the link on the page. Again, I used the Selenium IDE FireFox plug-in to find the identifiers for each element locator. To refresh our memory on what we are testing, here's a screenshot of the limited UI we selected for these articles: <action code="$click(element_locator)"/>
<action code="$selectOption(element_locator,label)"/>
Referring to the above graphic, here are the mScript action codes I used for the transitions in my model:
Click Show options
Click Remove options<action code="$click('id=showss')"/>
Select option 'All Results'<action code="$click('id=hidess')"/>
Select option 'Locations'<action code="$selectOption('id=mrtbox','label=All results')"/>
Select option 'Businesses'<action code="$selectOption('id=mrtbox','label=Locations')"/>
Select option 'User-created content'<action code="$selectOption('id=mrtbox','label=Businesses')"/>
Select option 'Related maps'<action code="$selectOption('id=mrtbox','label=User-created content')"/>
Select option 'Mapped web pages'<action code="$selectOption('id=mrtbox','label=Related maps')"/>
Select option 'Real estate'<action code="$selectOption('id=mrtbox','label=Mapped web pages')"/>
Click Search Maps<action code="$selectOption('id=mrtbox','label=Real estate')"/>
Click Google maps logo<action code="$click('id=q-sub')"/>
<action code="$click('id=logo')"/>
4. Modify the skeleton mScript code with the action codes from above (and remove any unneeded tags as desired).
5. Deploy your mScript code. To do so, copy or save to the /script/ folder in the TestOptimal home directory using the same name as the model name, e.g. "google_maps.xml".
We're now ready to exercise our model using the mScript that has been tailored to our test target (I've included the script below). Next week we'll generate test sequences and start testing.
<xml version="1.0">
<mscript>
<state id="n1">
<transition event="show_options">
<script type="action">
<action code="$click('id=showss')" />
</script>
</transition>
</state>
<state id="n2">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n3">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n4">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n5">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n6">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n7">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
<state id="n8">
<transition event="remove_options">
<script type="action">
<action code="$click('id=hidess')" />
</script>
</transition>
<transition event="select_all">
<script type="action">
<action code="$selectOption('id=mrtbox','label=All results')" />
</script>
</transition>
<transition event="select_locations">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Locations')" />
</script>
</transition>
<transition event="select_bus">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Businesses')" />
</script>
</transition>
<transition event="select_user">
<script type="action">
<action code="$selectOption('id=mrtbox','label=User-created content')" />
</script>
</transition>
<transition event="select_related">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Related maps')" />
</script>
</transition>
<transition event="select_mapped">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Mapped web pages')" />
</script>
</transition>
<transition event="select_real">
<script type="action">
<action code="$selectOption('id=mrtbox','label=Real estate')" />
</script>
</transition>
<transition event="search_maps">
<script type="action">
<action code="$click('id=q-sub')" />
</script>
</transition>
<transition event="click_google_maps">
<script type="action">
<action code="$click('id=logo')" />
</script>
</transition>
</state>
</mscript>
</xml>
Friday, November 6, 2009
Model-Based Testing For Web Applications With TestOptimal - (Part 2) mScript
Subscribe to:
Post Comments (Atom)








0 comments. Add Comment.:
Post a Comment