tag:blogger.com,1999:blog-57946971490140083392024-02-20T14:57:48.593+02:00Selenium Testing WorldSelenium automation testing tipsGeorgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-5794697149014008339.post-16282297883257586322018-09-04T13:24:00.000+03:002020-12-14T18:16:29.558+02:00TestNG Transformations - A real life case study<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="p1">
<span class="s1">In one of the projects I am involved with, common functionality applies to various communication channels such as Sms, Email, Ad-words and Web banners. Naturally in a situation like this the question comes in mind is: "Do we repeat the test cases for every communication channel?" The answer I am always giving is: "It depends on the qualification method used".</span><br />
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">For qualification methods such as Manual or Exploratory testing it’s a matter of time and manpower to execute as many times as our communication channels or use pair wise to optimize testing effort while minimizing risk of missing defects. For qualification methods such as Automation testing in order to achieve the the highest coverage we execute as many times as our communication channels.</span></div>
<div class="p1">
<span class="s1">Automating the test cases can be done in two different ways. The first way is to have four different test scripts differing the channel. This is bad practice because of maintainability issues. The second way of automating is to use a predefined TestNG annotation to execute x times a predefined test script.</span><br />
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">My initial approach in using predefined TestNG annotations was to use data providers. The problem in this approach was that I needed to set up the communication channel in the @BeforeClass section and the data providers should be used in @Test section of the test script.</span></div>
<div class="p1">
<span class="s1">The second approach in using predefined TestNG annotations was to use the Factory functionality. The problem with this approach is that TestNG does not respect the dependency of each test step in a single thread. BeforeClass will be executed as many times as specified in the factory then Test Step 1 as many times and so on so forth in a single web session.</span></div>
<div class="p1">
<span class="s1">One fitted solution, out of the predefined TestNG annotations scope, is to create a base class implementing the test. The base test should hold the aforementioned communication channels as a parameter. The parameters should be passed in an TestNG parameter annotation in @BeforeClass section and set before the execution in the testng.xml parameters section.</span></div>
<pre class="prettyprint"><span class="s1">@BeforeClass(alwaysRun = true)</span></pre>
<span class="s1">@Parameters(["test.channel"])</span>
<span class="s1"><parameter name="test.channel" value="Email" /></span>
<span class="s1">For maintainability and traceability purposes I have created 4 different empty test scripts (traceability) extending the base test class (maintainability).</span>
<br />
<div class="p1">
<span class="s1">This scenario is ideal if the functionality of the software is identical for every communication channel, but if there is a slight change in a test step what do we do? One easy solution is to skip the test step. To do this in TestNG use <b>SkipException</b>. Keep in mind in the reporting the skipped test steps shown as skipped, and this can be confusing in cases there are failures in the @BeforeClass section. A more clean approach to skip the test step will be to set the @Test(enabled=false) flag of the annotation, but we need to dynamically change its value in the context of a test suite. This can me accomplished by using the ITestAnnotation provided by TestNG like:</span></div>
<pre class="prettyprint"><div class="p2">
<span class="s1">
</span>
<span class="s1">public void transform(ITestAnnotation annotation, Class arg1, Constructor arg2, Method testMethod) {</span></div>
<div class="p2">
<span class="s1"> if(campaignTestChannel.equals("Email")) {</span></div>
<div class="p2">
<span class="s1"> annotation.setEnabled(true);</span></div>
<div class="p2">
<span class="s1"> }</span></div>
<div class="p2">
<span class="s1">}</span></div>
<div class="p1">
<span class="s1">
</span></div>
</pre>
<br />
<span class="s1">The above piece of code implements a functionality that if the channel is the Email all test steps containing enabled flag should be executed.</span>
<br />
<div class="p1">
<span class="s1">As a conclusion given the aforementioned situation in which multiple script execution is needed the automation is the way to go. To achieve maintainability avoid replicating test scripts and choose one of the methods (data providers, factories or extending a base class) that fits your needs. If you need to exclude test steps from your base class and don’t care about reporting go for the skipExceptiuon method, other wise dynamically on runtime transform your annotations.</span></div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-20426019247135118322014-04-15T15:08:00.000+03:002020-12-14T18:16:29.837+02:00Concurrency testing made easy<div dir="ltr" style="text-align: left;" trbidi="on">
Having a multi tenant application under test, concurrency testing is the next step of the testing cycle. Testing using concurrent users takes a lot of time and usually ends up in defects not fully reproducible because of timing issues (synchronization) thus making automation of these tests a must.<br />
<br />
Automating concurrent tests using selenium / webdriver always brings up one of the most common question in automation testing; Do I need a new window or open a new tab? The correct question should be: how do I open a new session? And here is the tricky part of the tests. If you open a new window or tab you will carry the session from the window you started from. Some sites will suggest, “clearing the cookies” but this involves the whole browser not a specific window thus the newly assigned session id is the same on all existing windows and tabs.<br />
<br />
The solution to the above explained problem is to start two or more selenium / webdriver sessions. To simplify these procedures we use a specific <a href="http://github.com/persado/stevia" target="_blank">Stevia</a> functionality in order to instantiate 2 webdriver controllers. The instantiation is declared in a spring xml file we call test-controllers and includes the following:<br />
<br />
<pre class="prettyprint"><bean class="controllers.ControllerSession1" id="webDriverControllerSession1" scope="prototype"><bean id="webDriverControllerSession1" class="controllers.ControllerSession1" scope="prototype"/>
<bean id="webdriver-s1-driver" class="com.persado.oss.quality.stevia.selenium.core.controllers.registry.Driver"
p:name="webdriver-s1"
p:className="controllers.WebDriverS1WebControllerFactoryImpl"/>
<bean id="webDriverControllerSession2" class="controllers.ControllerSession2" scope="prototype"/>
<bean id="webdriver-s2-driver" class="com.persado.oss.quality.stevia.selenium.core.controllers.registry.Driver"
p:name="webdriver-s2"
p:className="controllers.ControllerFactoryImpl"/>
</bean></pre>
<br />
<b>Note</b>: The spring framework schema p should be included in the xml file, and the controller factory implementation should be created in the appropriate packages.
<br />
<br />
Having the two controllers at hand we can use a Stevia annotation <i>@RunsWithController(controller=controllers.ControllerSession1.class)</i> before any <i>@BeforeClass</i> or <i>@Test</i> annotations.<br />
<br />
The next big problem at hand is how to synchronize the sessions in order to have control of the test execution; synchronization in java is quite advanced, there are a lot of techniques, to mention a few: Cyclic barrier and Count Down Latch. These techniques involve heavy coding and it is an overkill to use them. The most appropriate way to synchronize the execution of tests for different controllers is to use the dependency attribute provided by testNG.<br />
<br />
Lets use a specific example to put things into perspective:<br />
<br />
Lets assume there is a phonebook application where you can create a custom phone book and assign contacts. You can edit or delete the phonebook as long as it is empty. So lets assume that in session 1 a user created a phonebook and in session 2 a second user assigns a contact. In session 1 the user is not aware that an entry has been added to the phonebook and wants to edit the phonebook name. As soon as the user presses the edit button he / she is presented with an error message stating that you are not allowed to edit on non-empty phonebook.<br />
In the aforementioned scenario there are 2 clear preconditions, as follows:<br />
•<span class="Apple-tab-span" style="white-space: pre;"> </span>User in session 1 creates phonebook<br />
•<span class="Apple-tab-span" style="white-space: pre;"> </span>User in session 2 adds a contact in phonebook<br />
And a test step with the following action and expected results<br />
User 1 presses the edit button => User is presented with error message<br />
<br />
The synchronization sequence is shown below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-at1IzYqguv0/U00DXQ5TttI/AAAAAAAAAIs/8ZhwM4KuLPU/s1600/Concurrent+Testing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-at1IzYqguv0/U00DXQ5TttI/AAAAAAAAAIs/8ZhwM4KuLPU/s1600/Concurrent+Testing.png" height="192" width="320" /></a></div>
<br />
<br />
For the two preconditions the synchronization could be done using testNG BeforeClass annotations as follows:<br />
<br />
<pre class="prettyprint">@RunsWithController(controllers.ControllerSession1.class)
public void createPreconditionsSession1(String parallelTestsFlag) {
// User in session 1 creates phonebook
}
@RunsWithController(controllers.ControllerSession2.class)
@BeforeClass(dependsOnMethods = "createPreconditionsSession1")
public void createPreconditionsSession2() throws Exception {
// User in session 2 adds a contact in phonebook
}
@RunsWithController(controllers.ControllerSession1.class)
@Test(alwaysRun = true, description = "Edit phonebook name")
public void testStep_1() {
// User presses the edit button => User is presented with error message
}</pre>
TestNG will execute createPreconditionsSession1 -> createPreconditionsSession2 -> testStep_1<br />
<br />
The next big question that comes to mind with this implementation is how do I run preconditions on different sessions for each step? Lacking a before specific test method and the problem that the usage of a Test annotation is adding noise (step is counted to results as pass even if it is a precondition) we need an extra annotation to execute the precondition.
The latest SNAPSHOT of Stevia solves the above problem by introducing an annotation to allow execution of a series of pre and post conditions on a Test annotated step. Lets use the previous example and add a step to our test verifying the story “ User from session 1 created a new phonebook. User in session2 adds a contact. User in session 1 presses the delete button for created phonebook.
<br />
<br />
<pre class="prettyprint">@Preconditions(controller=controllers.ControllerSession2.class,value={"test3Pre1", "test3Pre2"})
@RunsWithController(controllers. ControllerSession1.class)
@Test(alwaysRun = true, description = "", dependsOnMethods = {"testStep_1"})
public void testStep_2() {
// User presses the delete button => User is presented with error message
}
</pre>
<pre class="prettyprint">public void test3Pre1(){
// User in session 2 adds a contact on created bucket
}</pre>
<br />
<b>Note:</b> The second phonebook (delete action test step) is created in the preconditions section along with the first phonebook (edit action test step).<br />
<br />
So having these powerful annotations in stevia you can manipulate any test script execution without sacrificing any of the testing standards. As a result the quality is amplified to a new level by having test step pre and post conditions independent of your testing framework (Junit or TestNG).
<br />
<br />
<br /></div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-82664782304716890932014-04-04T00:46:00.000+03:002020-12-14T18:16:30.048+02:00Stevia enhancements and documentation<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/persado/stevia" target="_blank"><img alt="Stevia" border="0" height="108" src="https://raw.github.com/persado/stevia/master/doc/stevia-logo.png" title="Stevia" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Lately, we've been using <a href="https://github.com/persado/stevia" target="_blank">Stevia</a> a lot; we're also extending it as much as possible (no promises, but phantomjs is in our crosshairs lately). By talking to the community, it has come to our attention that people are having difficulty to start up a Stevia project. To that extend, we've created some content to give you a boost:<br />
<br />
<ol style="text-align: left;">
<li>Our SNAPSHOT javadoc is regularly published in <a href="http://persado.github.io/stevia/" target="_blank">Github Pages</a>,</li>
<li>We've setup <a href="https://travis-ci.org/persado/stevia" target="_blank">Travis</a> continuous integration and our build is currently<a href="https://travis-ci.org/persado/stevia.svg?branch=master" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://travis-ci.org/persado/stevia.svg?branch=master" /></a></li>
<li>We have a brand-new, all-shining <a href="https://github.com/persado/stevia/wiki/Stevia-10-minute-Quick-Start" target="_blank">Stevia Quick Start Guide</a>.</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
We hope that the above additions will give you a helping hand. If not, feel free to send us your bugs/comments via the <a href="https://github.com/persado/stevia/issues" target="_blank">issue tracker</a> in Github. We're listening.</div>
</div>
asymmetrisimohttp://www.blogger.com/profile/11868065515856086948noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-16252474862697177912014-02-19T10:28:00.000+02:002020-12-14T18:16:30.323+02:00Page Objects are not enough<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: inherit;">The Page Object design pattern is one of the most popular patterns in test automation just because it promotes test maintenance and unifies the way QA teams work. As the pattern dictates, a page object is the representation of an html page using objects. The objects contain the html element addresses (Xpath, Css or DOM) and the user actions on them as methods (press, input, select, etc.).</span><br />
<span style="font-family: inherit;"><br />
Although the page objects pattern is widely accepted, our work experience showed that it is inadequate in fully describing an html page because it lacks the ability to represent the business logic of the page. In order to solve this problem we use a complimentary entity to the page object, the business object.</span><br />
<span style="font-family: Cambria; font-size: 12.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: "MS 明朝"; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ADwUDeYMBcc/UwRnJZYwwzI/AAAAAAAAAG4/nEJwXeII9ro/s1600/Page+Business.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ADwUDeYMBcc/UwRnJZYwwzI/AAAAAAAAAG4/nEJwXeII9ro/s1600/Page+Business.png" height="157" width="320" /></a></div>
<span style="font-family: inherit;">The business object is a class containing the business logic behind the page. An example of html page business logic is the validation of the mandatory fields of a form. The page object by its definition could not contain the aforementioned logic it can only carry the info that pressing the submitting button an error is raised without reasoning. The business object compliments the page object in having a method for trying to submit a form without the mandatory fields completed and an error is raised. The complimenting nature of the business object stands because the business objects uses the page object’s methods to assemble the logic thus its methods are a collection of page object methods.</span><br />
<span style="font-family: inherit;"><br />
The breakthrough of this approach in the representation of the html page is that it keeps a clear separation of the logic from the html elements introducing an abstraction layer for the business object thus separating future changes in the page logic from its locators. In addition it may introduce reusability (a business object may exist in more than one pages hence page objects). Using the previous example a possible subtraction of a mandatory field does not affect the page object only the business one thus the change is marked in a single place.</span><br />
<span style="font-family: inherit;"><br />
In a later post I will try to expand on how to implement our business objects and what we do in special cases such as repeating pages with in the software under test.</span><br />
<div style="mso-element: comment-list;">
<div style="mso-element: comment;">
<div class="msocomtxt" id="_com_4" language="JavaScript">
<!--[if !supportAnnotations]--></div>
<!--[endif]--></div>
</div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-51971725420732162172014-02-11T23:42:00.004+02:002020-12-14T18:16:30.529+02:00Gray box testing is the way to adapt for automation testing <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
When we finished the design of our objects for setting up
the preconditions of an automated test case we showed it to one of our
developers and his first reaction was “it is the same with the app’s domain
model”. This comment made me think that knowing the application internals would
be extremely useful in developing correct test scripts.<span style="mso-spacerun: yes;"> </span>Knowing this had me thinking that the gray box
testing would be more appropriate in our automation tests than black box, thus
a switch to that direction is worth considering. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Why is gray box more appropriate in automation and not
manual testing? Because any automation tester will have the technical skills to
understand the internals of a software application and to prepare the
appropriate testing code to interface with available hooks or services,
something that a manual (non-programming-savvy) tester would not have. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
As a case study I used the current project I was working for.
In this project there was a front end used as an emulator of an external system.
The front-end app is retrieving data from a database. Black box testing ignores
were the front-end app gets its data as long as the displayed data is correct.
While this is acceptable for any functional test case, the big picture is
revealing shady areas of operations. For example for large amount of data we
need pagination (more effort and man hours out of the developers), in parallel
testing there are significant delays due to concurrency issues (front-end was
not designed initially for heavy duty traffic) and in some cases there was data
loss misleading the testing team into opening false defects. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Switching in gray box testing to identify the internals (understanding
how data is written to database and how it is queried by the front-end) was
simple with the usage of some Spring connectors to read the database. The
advantages were the following:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
</div>
<ul style="text-align: left;">
<li><span style="font-family: Symbol; text-indent: -18pt;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -18pt;">No more maintenance for the front end emulator</span></li>
<li><span style="font-family: Symbol; text-indent: -18pt;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -18pt;">Parallel testing speed up</span></li>
<li><span style="font-family: Symbol; text-indent: -18pt;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -18pt;">Single point of failure (database not emulator)</span></li>
</ul>
<!--[if !supportLists]--><o:p></o:p><br />
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<o:p></o:p></div>
<div class="MsoListParagraphCxSpLast" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Switching to gray box testing made our scripts more robust
and lifted the maintenance effort from the development team therefore becoming
more suitable for our needs.<span style="mso-spacerun: yes;"> </span>Expanding
the gray box testing technique allowed us to start using services like JMX to
communicate with the app in more accurate and direct way, leading in testing
various paths inside the app’s code that were not exposed to us initially. This
assisted us in revealing not functional but bottleneck-related bugs of the
software.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Gray box testing is the way to go for any automation tester
because it can reveal potential bottlenecks inside the code before the
performance test does and because it simplifies the way test scripts are
created. Gray box testing pushes you to learn more tools to hook into the app
thus expanding your software development skills thus becoming a better
automation engineer.<o:p></o:p></div>
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<div class="MsoNormal">
<br /></div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-29284961386823199802013-11-05T14:45:00.003+02:002020-12-14T18:16:30.736+02:00Modify ReportNG to show tests with known defects in separate column<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
During the automation regression circles there are some defects that are carried over through the iterations.<br />
So these tests appear as failed to ReportNG. Due to the fact that the new tests may introduce new defects that appear as failed to the report as well, some time is difficult and time consuming to distinguish between the old and the new defects.In this post we will describe a technique to illustrate the tests with the old defects in a separate column in the ReportNG.<br />
<br />
The first step is to 'mark' somehow the test steps in which the known defects appear.There are a lot of ways to do this using features of the TestNG framework.One way to accomplish this is to use the <i><b>expectedExceptions </b></i>attribute of the <b><i>@Test</i></b> class.<br />
<br />
The <i><b>expectedExceptions </b></i>includes the list of exceptions that a test method is expected to throw. If no exception or a different than one on this list is thrown, this test will be marked a failure.Assuming that the testStep with the known defect fails in an assertion point, the code should be like this:<br />
<br />
<pre class="prettyprint">@Test(expectedExceptions=AssertionError.class)
public void testStepX(){
//Code
//Assertion point that fails
}
</pre>
So after this code is executed the testStep with the known defect is considered passed.<br />
<br />
The second step is to collect all these tests through a listener or a setup class.<br />
So if you have a Super class that all your test classes extends from you can include the following code in this class. (This technique is the native dependency injection of the TestNG framework: <a href="http://testng.org/doc/documentation-main.html#native-dependency-injection">http://testng.org/doc/documentation-main.html#native-dependency-injection</a>)<br />
<br />
<pre class="prettyprint">@AfterMethod(alwaysRun = true)
protected void ignoreResultUponExpectedException(ITestResult result) {
if (result.isSuccess() && result.getMethod().getMethod().getDeclaredAnnotations()[0].toString().contains("expectedExceptions=[class")) {
result.getTestContext().getPassedTests().removeResult(result.getMethod());
result.setThrowable(new Throwable("MARKED AS TEST WITH KNOWN DEFECT!!"));
result.getTestContext().getSkippedTests().addResult(result, result.getMethod());
}
}</pre>
An alternative way is to do this through a TestNG Listener:<br />
<br />
<pre class="prettyprint">import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult;
public class MyListener implements IInvokedMethodListener{
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if(method.isTestMethod()){
if (testResult.isSuccess() && testResult.getMethod().getMethod().getDeclaredAnnotations()[0].toString().contains("expectedExceptions=[class"))
{
testResult.getTestContext().getPassedTests().removeResult(testResult.getMethod());
testResult.setThrowable(new Throwable("MARKED AS TEST WITH KNOWN DEFECT!!"));
testResult.getTestContext().getSkippedTests().addResult(testResult, testResult.getMethod());
}
}
}
}
</pre>
<br />
So to the moment the tests with the known defects seems as skipped (yellow color in ReportNG) with a specific exception message.<br />
<br />
One may should stop here since the tests with the known defects are now in the skipped column.Nevertheless this also may be confusing because there are cases that we have additional skipped tests.This is done when a configuration method of the TestNG fails (e.g when <i><b>@BeforeClass</b></i> fails).<br />
<br />
The point here is that if we want to seperate further the tests with the known defects we must make changes to the native ReportNG code and build again the ReportNG.<br />
The code is available under: <a href="https://github.com/dwdyer/ReportNG/downloads">https://github.com/dwdyer/ReportNG/downloads</a><br />
So we must import the ReportNG project in our IDE (<i><b>Eclipse </b></i>or <b><i>NetBeans </i></b>or <b><i>IntelliJ IDEA</i></b>).It is a good idea to convert it to maven project in order to build more easily the jar that we will use.<br />
<br />
The basic ReportNG class that is responsible for gathering and post process the TestNG results is the <b><i>HTMLReporter.java </i></b>class.The changes in this class is in <b><i>createResults </i></b>method in order to put the tests with the known defects in a seperate key for the Velocity Context. ReportNG uses the apache velocity context framework in order to generate the results. For more info about Apache Velocity you can visit: <a href="http://velocity.apache.org/">http://velocity.apache.org/</a><br />
<br />
<pre class="prettyprint">public static final String KNOWN_DEFECTS_TESTS_KEY = "knownDefects";
@SuppressWarnings("deprecation")
private void createResults(List<ISuite> suites, File outputDirectory, boolean onlyShowFailures) throws Exception
{
int index = 1;
for (ISuite suite : suites){
int index2 = 1;
for (ISuiteResult result : suite.getResults().values()){
boolean failuresExist = result.getTestContext().getFailedTests().size() > 0 || result.getTestContext().getFailedConfigurations().size() > 0;
if (!onlyShowFailures || failuresExist){
IResultMap skippedTests = result.getTestContext().getSkippedTests();
IResultMap knownDefects = new ResultMap();
for(ITestResult tr:skippedTests.getAllResults()){
if (tr.getMethod().getMethod().getDeclaredAnnotations()[0].toString().contains("expectedExceptions=[class")) {
skippedTests.removeResult(tr.getMethod());
knownDefects.addResult(tr, tr.getMethod());
}
}
VelocityContext context = createContext();
context.put(RESULT_KEY, result);
context.put(FAILED_CONFIG_KEY, sortByTestClass(result.getTestContext().getFailedConfigurations()));
context.put(SKIPPED_CONFIG_KEY, sortByTestClass(result.getTestContext().getSkippedConfigurations()));
context.put(FAILED_TESTS_KEY, sortByTestClass(result.getTestContext().getFailedTests()));
context.put(KNOWN_DEFECTS_TESTS_KEY, sortByTestClass(knownDefects));
context.put(SKIPPED_TESTS_KEY, sortByTestClass(skippedTests));
context.put(PASSED_TESTS_KEY, sortByTestClass(result.getTestContext().getPassedTests()));
String fileName = String.format("suite%d_test%d_%s", index, index2, RESULTS_FILE);
generateFile(new File(outputDirectory, fileName),RESULTS_FILE + TEMPLATE_EXTENSION,context);
}
++index2;
}
++index;
}
}</pre>
The final changes should be done in <b><i>overview.html.vm</i></b>,<b><i>reportng.properties</i></b> and <b><i>reportng.css</i></b> files:<br />
<br />
In <b><i>reportng.properties</i></b> add the property:<br />
<pre class="prettyprint">knownDefects=Known Defects</pre>
In<b><i> reportng.css</i></b> add the style for the known defects tests.(I have set the color as pink)<br />
<pre class="prettyprint">.knownDefects {background-color: #ff3399;}
.test .knownDefects {background-color: #ff99cc;}</pre>
Finally in the <b><i>overview.html.vm</i></b> we will make the most changes in order to illustrate the tests with the known defects in a separate column.(See the changes and additions underlined).If you perform these changes and build a ReportNG.jar (through <b><i>mvn install</i></b>) and use this jar to your project's classpath in order to generate the results you will have a seperate column with the known defects.We must notice here that when the defect is fixed the test will fail with a message like: <b><i>expected exception was ... but... </i></b><br />
This is an indication that you must remove the <i style="font-weight: bold;">expectedExceptions </i>attribute from this test step.You can below a preview of how the report should be.<br />
<br />
<pre class="prettyprint">#foreach ($suite in $suites)
<table class="overviewTable">
#set ($suiteId = $velocityCount)
#set ($totalTests = 0)
#set ($totalPassed = 0)
#set ($totalSkipped = 0)
#set ($totalFailed = 0)
<b><u> <i> </i><i>#set ($totalKnownDefects = 0)</i></u></b>
#set ($totalFailedConfigurations = 0)
<tr>
<th colspan="8" class="header suite">
<div class="suiteLinks">
#if (!$suite.invokedMethods.empty)
##<a href="suite${suiteId}_chronology.html">$messages.getString("chronology")</a>
#end
#if ($utils.hasGroups($suite))
<a href="suite${suiteId}_groups.html">$messages.getString("groups")</a>
#end
</div>
${suite.name}
</th>
</tr>
<tr class="columnHeadings">
<td>&nbsp;</td>
<th>$messages.getString("duration")</th>
<th>$messages.getString("passed")</th>
<th>$messages.getString("skipped")</th>
<th>$messages.getString("failed")</th>
<b> <i><u><th>$messages.getString("knownDefects")</th></u></i></b>
<th>$messages.getString("failedConfiguration")</th>
<th>$messages.getString("passRate")</th>
</tr>
#foreach ($result in $suite.results)
#set ($notPassedTests = $result.testContext.skippedTests.size() + $result.testContext.failedTests.size())
#set ($total = $result.testContext.passedTests.size() + $notPassedTests)
#set ($totalTests = $totalTests + $total)
#set ($totalPassed = $totalPassed + $result.testContext.passedTests.size())
<u> <i><b> #set ($totalKnownDefects = $totalKnownDefects + $utils.getKnownDefects($result.testContext.skippedTests).size())
#set ($totalSkipped = $totalSkipped + $result.testContext.skippedTests.size() -$utils.getKnownDefects($result.testContext.skippedTests).size())</b></i></u>
#set ($totalFailed = $totalFailed + $result.testContext.failedTests.size())
#set ($totalFailedConfigurations = $totalFailedConfigurations + $result.testContext.failedConfigurations.size())
#set ($failuresExist = $result.testContext.failedTests.size()>0 || $result.testContext.failedConfigurations.size()>0)
#if (($onlyReportFailures && $failuresExist) || (!$onlyReportFailures))
<tr class="test">
<td class="test">
<a href="suite${suiteId}_test${velocityCount}_results.html">${result.testContext.name}</a>
</td>
<td class="duration">
$utils.formatDuration($utils.getDuration($result.testContext))s
</td>
#if ($result.testContext.passedTests.size() > 0)=
<td class="passed number">$result.testContext.passedTests.size()</td>
#else
<td class="zero number">0</td>
#end
<b><i><u> #if ($result.testContext.skippedTests.size() - $utils.getKnownDefects($result.testContext.skippedTests).size() > 0)
#set ($skipped = $result.testContext.skippedTests.size() - $utils.getKnownDefects($result.testContext.skippedTests).size())</u></i></b>
<td class="skipped number">$skipped</td>
#else
<td class="zero number">0</td>
#end
#if ($result.testContext.failedTests.size() > 0)
<td class="failed number">$result.testContext.failedTests.size()</td>
#else
<td class="zero number">0</td>
#end
<b><i><u> #if ($utils.getKnownDefects($result.testContext.skippedTests).size() > 0)
<td class="knownDefects number">$utils.getKnownDefects($result.testContext.skippedTests).size()</td>
#else
<td class="zero number">0</td>
#end</u></i></b>
#if ($result.testContext.failedConfigurations.size() > 0)
<td class="failed number">$result.testContext.failedConfigurations.size()</td>
#else
<td class="zero number">0</td>
#end
<td class="passRate">
#if ($total > 0)
#set ($passRate = (($total - $notPassedTests) * 100 / $total))
$passRate%
#else
$messages.getString("notApplicable")
#end
</td>
</tr>
#end
#end
<tr class="suite">
<td colspan="2" class="totalLabel">$messages.getString("total")</td>
#if ($totalPassed > 0)
<td class="passed number">$totalPassed</td>
#else
<td class="zero number">0</td>
#end
#if ($totalSkipped > 0)
<td class="skipped number">$totalSkipped</td>
#else
<td class="zero number">0</td>
#end
#if ($totalFailed > 0)
<td class="failed number">$totalFailed</td>
#else
<td class="zero number">0</td>
#end
<i><b><u> #if ($totalKnownDefects > 0)
<td class="knownDefects number">$totalKnownDefects</td>
#else
<td class="zero number">0</td>
#end </u></b></i>
#if ($totalFailedConfigurations > 0)
<td class="failed number">$totalFailedConfigurations</td>
#else
<td class="zero number">0</td>
#end
<td class="passRate suite">
#if ($totalTests > 0)
#set ($passRate = (($totalTests - $totalSkipped - $totalFailed -$totalKnownDefects) * 100 / $totalTests))
$passRate%
#else
$messages.getString("notApplicable")
<b><i> #end</i></b>
<b><i> </td></i></b>
</tr>
</table></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-XkuXTciBwQI/UnjlMEjUDfI/AAAAAAAAABQ/7_zcaGclI4k/s1600/knownDefects.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-XkuXTciBwQI/UnjlMEjUDfI/AAAAAAAAABQ/7_zcaGclI4k/s640/knownDefects.jpg" height="81" width="640" /></a></div>
<br />
<br /></div>
</div>
Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-87610904452244407562013-09-17T18:13:00.002+03:002020-12-14T18:16:30.944+02:00Get Table Data<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: inherit;">One of the most common tasks in our project is to retrieve data from a table in order to assert. With this post I will try to describe a unified way to get the required data from any table with a specific format so my assertions are well defined.</span><br />
<span style="font-family: inherit;">The assertion points to be well defined I usually prefer to have my actual data in the form of a Map(key,value) so my assertions are in the form</span><br />
<pre class="prettyprint"><span style="font-family: inherit;">Assert.assertEquals(data.get(key),expected_value)</span></pre>
<span style="font-family: inherit;">I selected the key value for my map to be the value of the first column with value a second map containing as keys the names of the columns and values the values of the columns.</span><br />
<pre class="prettyprint"><span style="font-family: inherit;">Map(column_n_value:Map(column_2_name:column_2_value,…,column_n_name:column_n_value))</span></pre>
The aforementioned implementation for the key value pairs where chosen to be the table values instead of the table indexes for maintainability purposes. Maintainability wise a column addition or an non shorted table the index will return the wrong result while the value not.<br />
<span style="font-family: inherit;">The resulting assertions look like:</span><br />
<pre class="prettyprint"><span style="font-family: inherit;">Assert.assertEquals(data.get(row_1_value).get(column_2_name),expected_value)
Assert.assertEquals(data.get(row_1_value).get(column_3_name),expected_value)</span></pre>
<span style="font-family: inherit;">The first thing we need to do in order to construct our map is to get the number of rows and columns of the table as follows:</span><br />
<pre class="prettyprint"><span style="font-family: inherit;">rows = selenium.getCssCount("css=table tbody tr").intValue()
columns = selenium.getCssCount("css=table tbody tr td").intValue()</span></pre>
<span style="font-family: inherit;">With the number of rows and columns at hand the next step is to retrieve the names of the columns from the table header as follows in groovy:</span><br />
<pre class="prettyprint"><span style="font-size: 9pt;">public List<String> getTableColumnNames(){
def headerNames=[]
(1..selenium.getCssCount("css=table thead tr th").intValue()).each{columns->
if(!selenium.getText("css=table thead tr th" + ":nth-child(" + columns + ")").isEmpty()){
headerNames << selenium.getText("css=table thead tr th" + ":nth-child(" + columns + ")")
}
return headerNames
}</span>
</pre>
<span style="font-family: inherit;">Having the column names the next step is to construct the desired map as follows in groovy:</span><br />
<pre class="prettyprint"><span style="font-size: 9pt;">public HashMap<String, HashMap<String, String>> getTableInfo() {
selenium.waitForElement(componentName);
def TableMap=[:]
def columnNames = getTableColumnNames()
(1..selenium.getCssCount("css=table tbody tr").intValue()).each{row->
def columnMap=[:]
(2..selenium.getCssCount("css=table tbody tr td").intValue()).each{column->
columnMap.put(columnNames[column-1],controller().getText(componentName + ":nth-child("+row+") *:nth-child("+column+")"))
}
TableMap.put(controller().getText(componentName + ":nth-child(" + row + ") td:nth-child(1)"),columnMap)
}
return TableMap;
}</span></pre>
The above implementation can be found embedded in <a href="https://github.com/persado/stevia" target="_blank">Stevia</a>, enriched with code detecting your locator style (Xpath, Css or Id).<br />
<br />
The above implementation of the table scan could be altered to accept only td as columns by altering the column map to get<br />
<pre class="prettyprint">td:nth-child("+column+")</pre>
instead of <br />
<pre class="prettyprint">*nth-child("+column+")</pre>
<div style="text-align: left;">
<a href="https://github.com/persado/stevia" target="_blank">Stevia</a> includes similar methods such as: </div>
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>getTableInfoAsList </li>
<li>getTableElements2DArray</li>
<li>getTableElementTextUnderHeader</li>
</ul>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-49780983774855542812013-08-29T11:10:00.001+03:002020-12-14T18:16:31.149+02:00Regression Suites<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
In our agile project we utilized regression testing with
test automation and continuous executions of our automated test scripts. This
process served us well while the test execution lasted less than 4 hours but
started to create major problems when the total number of test scripts
increased and the execution time exceeded 1 day. A quick relief to our problem
came with introduction of parallel execution of test scripts but still in cases
were the management wanted a quick answer to “Do we deploy on production or
not?” it wasn’t enough. <o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
One way to design effective regression suites, to ensure the
continuation of business functions, is to follow the rule:</div>
<div align="center" class="MsoNormal" style="text-align: center;">
<pre class="prettyprint">Regression test suite!= sum(Functional test cases)<o:p></o:p></pre>
</div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
The purpose of the functional tests is to explore the
behavior of specific business functions and highlight corner cases while the
purpose of regression tests is to give an overall overview of the entire
system. In this way the design of the regression suite should include test scripts
inspecting the end-to-end business functions that a system encapsulates.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
For the purpose of our project (agile environment) the
regression suites were designed with the hypothesis that the GUI, boundary and GUI
negative tests should be separated from the runtime tests because:<o:p></o:p></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo1; text-indent: -18.0pt;">
</div>
<ol style="text-align: left;">
<li><span style="text-indent: -18pt;"> Changes in the code in boundaries are rare</span></li>
<li><span style="text-indent: -18pt;"> GUI is indirectly tested (application its self
is used for the preconditions of each test case)</span></li>
</ol>
<div class="MsoListParagraphCxSpLast" style="text-align: left; text-indent: -18pt;">
<o:p></o:p></div>
<div class="MsoNormal">
<a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=5794697149014008339" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a>This separation leads us automatically in designing
different regression suites containing these special categories.</div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Br2x9Ymfzac/UhxeS44Gy5I/AAAAAAAAAEY/VG8kdlFeGaM/s1600/RegressionComponents.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="http://2.bp.blogspot.com/-Br2x9Ymfzac/UhxeS44Gy5I/AAAAAAAAAEY/VG8kdlFeGaM/s320/RegressionComponents.png" width="320" /></a></div>
<br /></div>
<div class="MsoNormal">
More over, a vertical separation according to execution
frequency is needed. In an agile environment in a 2 weeks sprint, 4 sprints
release circle, effective execution regression times could be at the end of
each sprint, in every other sprint and at the end of the release. The schedule
of each regression suite could be decided according to how often this part of
the code is changed. For example a boundary test is highly unusual to change
thus a planned execution time could be only once per release and preferably one
sprint before the release sprint (latest <!--[if gte vml 1]><v:rect id="Rectangle_x0020_15"
o:spid="_x0000_s1035" style='position:absolute;margin-left:351pt;margin-top:99pt;
width:126pt;height:27pt;z-index:251667456;visibility:visible;mso-wrap-style:square;
mso-width-percent:0;mso-height-percent:0;mso-wrap-distance-left:9pt;
mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;
mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;
mso-position-horizontal-relative:text;mso-position-vertical:absolute;
mso-position-vertical-relative:text;mso-width-percent:0;mso-height-percent:0;
mso-width-relative:margin;mso-height-relative:margin;v-text-anchor:middle'
o:gfxdata="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
OEvHLAlx2i310UxWcRZu+kmug3krqAe2lepujDu/KbriL8qUYhr/z0zR0wEcHtQnOgI+nNMKjHSl
dDwuVMihCyUh9QcC5n3TOyBb4HgWPoPz4VDZ/ApyqH9tzVkepqxhD6j2aYAEhelEhYKQPWhLJvtO
YVZNpx7LkqWMTEYV1JWJVXtMDgkb6R7Y0j3YQyGkuukmaRswuJP5576nFTQO9BqlWG9OJ8unTlsD
//TCxRYzGHViLaHzN/N/rmI+uy9mPzveDM/myKIh+sNildTIqsKZ/NrtVNRfVOEsE3BhrrUda8ni
WjNTDqK4bDEQ8/VMAkdASP+D+Y8Kn9kLCD2hjvg+9FYEdw/Wfwiy+pLuapBBukHapzGseyzRJpNm
ZV2brny017LJ+oIXqrncE87Wmp0l3ud0dr6IcsU5tXiRzk497Pja0la6GiJ7skSBNM32ISYwZRdR
uzhB46Da8eAyCA7RHsATXCd5QKtpWk3T4AnuiGCxZC92Ol76kFHgu6XkmHpGqWeYRkZpZJRmRoHF
WXqFklFa0Kn0rQfcuukfD2UXHLCCSy9Esqbq3NZt/gEAAP//AwBQSwMEFAAGAAgAAAAhAJxmRkG7
AAAAJAEAACoAAABjbGlwYm9hcmQvZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHOEj80K
wjAQhO+C7xD2btJ6EJEmvYjQq9QHCMk2LTY/JFHs2xvoRUHwsjCz7DezTfuyM3liTJN3HGpaAUGn
vJ6c4XDrL7sjkJSl03L2DjksmKAV201zxVnmcpTGKSRSKC5xGHMOJ8aSGtHKRH1AVzaDj1bmIqNh
Qaq7NMj2VXVg8ZMB4otJOs0hdroG0i+hJP9n+2GYFJ69elh0+UcEy6UXFqCMBjMHSldnnTUtXYGJ
hn39Jt4AAAD//wMAUEsBAi0AFAAGAAgAAAAhACmb+0YEAQAAHgIAABMAAAAAAAAAAAAAAAAAAAAA
AFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAAAAAAAA
AAAAAAA1AQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAgNxTSPoCAAC3BgAAHwAAAAAAAAAA
AAAAAAAfAgAAY2xpcGJvYXJkL2RyYXdpbmdzL2RyYXdpbmcxLnhtbFBLAQItABQABgAIAAAAIQAr
al2V1wYAAPkbAAAaAAAAAAAAAAAAAAAAAFYFAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBL
AQItABQABgAIAAAAIQCcZkZBuwAAACQBAAAqAAAAAAAAAAAAAAAAAGUMAABjbGlwYm9hcmQvZHJh
d2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHNQSwUGAAAAAAUABQBnAQAAaA0AAAAA
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 4<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:rect><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:rect
id="Rectangle_x0020_17" o:spid="_x0000_s1034" style='position:absolute;
margin-left:225pt;margin-top:99pt;width:126pt;height:27pt;z-index:251671552;
visibility:visible;mso-wrap-style:square;mso-width-percent:0;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-width-percent:0;mso-height-percent:0;mso-width-relative:margin;
mso-height-relative:margin;v-text-anchor:middle' o:gfxdata="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
0DI4S8csCXHaLfXRTFZxFm76Sa6DeSuoB7aV6m6MO78puuIvypRiGv/PTNHTARwe1Cc6Aj6c0wqM
dKV0PC5UyKELJSH1BwLmfdM7IFvgeBY+g/PhUNn8CnKof23NWR6mrGEPqPZpgASF6USFgpA9aEsm
+05hVk2nHsuSpYxMRhXUlYlVe0wOCRvpHtjSPdhDIaS66SZpGzC4k/nnvqcVNA70GqVYb04ny6dO
WwP/9MLFFjMYdWItofM383+uYj67L2Y/O94Mz+bIoiH6w2KV1Miqwpn82u1U1F9U4SwTcGGutR1r
yeJaM1MOorhsMRDz9UwCR0BI/4P5jwqf2QsIPaGO+D70VgR3D9Z/CLL6ku5qkEG6QdqnMax7LNEm
k2ZlXZuufLTXssn6ghequdwTztaanSXe53R2vohyxTm1eJHOTj3s+NrSVroaInuyRIE0zfYhJjBl
F1G7OEHjoNrx4DIIDtEewBNcJ3lAq2laTdPgCe6IYLFkL3Y6XvqQUeC7peSYekapZ5hGRmlklGZG
gcVZeoWSUVrQqfStB9y66R8PZRccsIJLL0Sypurc1m3+AQAA//8DAFBLAwQUAAYACAAAACEAnGZG
QbsAAAAkAQAAKgAAAGNsaXBib2FyZC9kcmF3aW5ncy9fcmVscy9kcmF3aW5nMS54bWwucmVsc4SP
zQrCMBCE74LvEPZu0noQkSa9iNCr1AcIyTYtNj8kUezbG+hFQfCyMLPsN7NN+7IzeWJMk3ccaloB
Qae8npzhcOsvuyOQlKXTcvYOOSyYoBXbTXPFWeZylMYpJFIoLnEYcw4nxpIa0cpEfUBXNoOPVuYi
o2FBqrs0yPZVdWDxkwHii0k6zSF2ugbSL6Ek/2f7YZgUnr16WHT5RwTLpRcWoIwGMwdKV2edNS1d
gYmGff0m3gAAAP//AwBQSwECLQAUAAYACAAAACEAKZv7RgQBAAAeAgAAEwAAAAAAAAAAAAAAAAAA
AAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQCtMD/xwQAAADIBAAALAAAAAAAA
AAAAAAAAADUBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQC383Bk/AIAALcGAAAfAAAAAAAA
AAAAAAAAAB8CAABjbGlwYm9hcmQvZHJhd2luZ3MvZHJhd2luZzEueG1sUEsBAi0AFAAGAAgAAAAh
ACtqXZXXBgAA+RsAABoAAAAAAAAAAAAAAAAAWAUAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1s
UEsBAi0AFAAGAAgAAAAhAJxmRkG7AAAAJAEAACoAAAAAAAAAAAAAAAAAZwwAAGNsaXBib2FyZC9k
cmF3aW5ncy9fcmVscy9kcmF3aW5nMS54bWwucmVsc1BLBQYAAAAABQAFAGcBAABqDQAAAAA=
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 3<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:rect><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:rect
id="Rectangle_x0020_16" o:spid="_x0000_s1033" style='position:absolute;
margin-left:99pt;margin-top:99pt;width:126pt;height:27pt;z-index:251669504;
visibility:visible;mso-wrap-style:square;mso-width-percent:0;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-width-percent:0;mso-height-percent:0;mso-width-relative:margin;
mso-height-relative:margin;v-text-anchor:middle' o:gfxdata="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
MjhLxywJcdot9dFMVnEWbvpJroN5K6gHtpXqbow7vym64i/KlGIa/89M0dMBHB7UJzoCPpzTCox0
pXQ8LlTIoQslIfUHAuZ90zsgW+B4Fj6D8+FQ2fwKcqh/bc1ZHqasYQ+o9mmABIXpRIWCkD1oSyb7
TmFWTacey5KljExGFdSViVV7TA4JG+ke2NI92EMhpLrpJmkbMLiT+ee+pxU0DvQapVhvTifLp05b
A//0wsUWMxh1Yi2h8zfzf65iPrsvZj873gzP5siiIfrDYpXUyKrCmfza7VTUX1ThLBNwYa61HWvJ
4lozUw6iuGwxEPP1TAJHQEj/g/mPCp/ZCwg9oY74PvRWBHcP1n8IsvqS7mqQQbpB2qcxrHss0SaT
ZmVdm658tNeyyfqCF6q53BPO1pqdJd7ndHa+iHLFObV4kc5OPez42tJWuhoie7JEgTTN9iEmMGUX
Ubs4QeOg2vHgMggO0R7AE1wneUCraVpN0+AJ7ohgsWQvdjpe+pBR4Lul5Jh6RqlnmEZGaWSUZkaB
xVl6hZJRWtCp9K0H3LrpHw9lFxywgksvRLKm6tzWbf4BAAD//wMAUEsDBBQABgAIAAAAIQCcZkZB
uwAAACQBAAAqAAAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzhI/N
CsIwEITvgu8Q9m7SehCRJr2I0KvUBwjJNi02PyRR7Nsb6EVB8LIws+w3s037sjN5YkyTdxxqWgFB
p7yenOFw6y+7I5CUpdNy9g45LJigFdtNc8VZ5nKUxikkUigucRhzDifGkhrRykR9QFc2g49W5iKj
YUGquzTI9lV1YPGTAeKLSTrNIXa6BtIvoST/Z/thmBSevXpYdPlHBMulFxagjAYzB0pXZ501LV2B
iYZ9/SbeAAAA//8DAFBLAQItABQABgAIAAAAIQApm/tGBAEAAB4CAAATAAAAAAAAAAAAAAAAAAAA
AABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAA
AAAAAAAANQEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAH91VkH7AgAAtwYAAB8AAAAAAAAA
AAAAAAAAHwIAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEA
K2pdldcGAAD5GwAAGgAAAAAAAAAAAAAAAABXBQAAY2xpcGJvYXJkL3RoZW1lL3RoZW1lMS54bWxQ
SwECLQAUAAYACAAAACEAnGZGQbsAAAAkAQAAKgAAAAAAAAAAAAAAAABmDAAAY2xpcGJvYXJkL2Ry
YXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsFBgAAAAAFAAUAZwEAAGkNAAAAAA==
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 2<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:rect><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:rect
id="Rectangle_x0020_14" o:spid="_x0000_s1032" style='position:absolute;
margin-left:-26.95pt;margin-top:99pt;width:126pt;height:27pt;z-index:251665408;
visibility:visible;mso-wrap-style:square;mso-width-percent:0;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-width-percent:0;mso-height-percent:0;mso-width-relative:margin;
mso-height-relative:margin;v-text-anchor:middle' o:gfxdata="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
MjhLxywJcdot9dFMVnEWbvpJroN5K6gHtpXqbow7vym64i/KlGIa/89M0dMBHB7UJzoCPpzTCox0
pXQ8LlTIoQslIfUHAuZ90zsgW+B4Fj6D8+FQ2fwKcqh/bc1ZHqasYQ+o9mmABIXpRIWCkD1oSyb7
TmFWTacey5KljExGFdSViVV7TA4JG+ke2NI92EMhpLrpJmkbMLiT+ee+pxU0DvQapVhvTifLp05b
A//0wsUWMxh1Yi2h8zfzf65iPrsvZj873gzP5siiIfrDYpXUyKrCmfza7VTUX1ThLBNwYa61HWvJ
4lozUw6iuGwxEPP1TAJHQEj/g/mPCp/ZCwg9oY74PvRWBHcP1n8IsvqS7mqQQbpB2qcxrHss0SaT
ZmVdm658tNeyyfqCF6q53BPO1pqdJd7ndHa+iHLFObV4kc5OPez42tJWuhoie7JEgTTN9iEmMGUX
Ubs4QeOg2vHgMggO0R7AE1wneUCraVpN0+AJ7ohgsWQvdjpe+pBR4Lul5Jh6RqlnmEZGaWSUZkaB
xVl6hZJRWtCp9K0H3LrpHw9lFxywgksvRLKm6tzWbf4BAAD//wMAUEsDBBQABgAIAAAAIQCcZkZB
uwAAACQBAAAqAAAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzhI/N
CsIwEITvgu8Q9m7SehCRJr2I0KvUBwjJNi02PyRR7Nsb6EVB8LIws+w3s037sjN5YkyTdxxqWgFB
p7yenOFw6y+7I5CUpdNy9g45LJigFdtNc8VZ5nKUxikkUigucRhzDifGkhrRykR9QFc2g49W5iKj
YUGquzTI9lV1YPGTAeKLSTrNIXa6BtIvoST/Z/thmBSevXpYdPlHBMulFxagjAYzB0pXZ501LV2B
iYZ9/SbeAAAA//8DAFBLAQItABQABgAIAAAAIQApm/tGBAEAAB4CAAATAAAAAAAAAAAAAAAAAAAA
AABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAA
AAAAAAAANQEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAHApVBv7AgAAtAYAAB8AAAAAAAAA
AAAAAAAAHwIAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEA
K2pdldcGAAD5GwAAGgAAAAAAAAAAAAAAAABXBQAAY2xpcGJvYXJkL3RoZW1lL3RoZW1lMS54bWxQ
SwECLQAUAAYACAAAACEAnGZGQbsAAAAkAQAAKgAAAAAAAAAAAAAAAABmDAAAY2xpcGJvYXJkL2Ry
YXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsFBgAAAAAFAAUAZwEAAGkNAAAAAA==
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 1<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:rect><![endif]--><!--[if !vml]--><!--[endif]-->spring
usually reserved for sprint new features).<o:p></o:p></div>
<div class="MsoNormal">
<!--[if gte vml 1]><v:shapetype id="_x0000_t79" coordsize="21600,21600"
o:spt="79" adj="7200,5400,3600,8100" path="m0@0l@3@0@3@2@1@2,10800,0@4@2@5@2@5@0,21600@0,21600,21600,,21600xe">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="val #0"/>
<v:f eqn="val #1"/>
<v:f eqn="val #2"/>
<v:f eqn="val #3"/>
<v:f eqn="sum 21600 0 #1"/>
<v:f eqn="sum 21600 0 #3"/>
<v:f eqn="sum #0 21600 0"/>
<v:f eqn="prod @6 1 2"/>
</v:formulas>
<v:path o:connecttype="custom" o:connectlocs="10800,0;0,@7;10800,21600;21600,@7"
o:connectangles="270,180,90,0" textboxrect="0,@0,21600,21600"/>
<v:handles>
<v:h position="topLeft,#0" yrange="@2,21600"/>
<v:h position="#1,topLeft" xrange="0,@3"/>
<v:h position="#3,#2" xrange="@1,10800" yrange="0,@0"/>
</v:handles>
</v:shapetype><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_24" o:spid="_x0000_s1031"
type="#_x0000_t79" style='position:absolute;margin-left:252pt;margin-top:-14.65pt;
width:64.8pt;height:99.4pt;z-index:251683840;visibility:visible;
mso-wrap-style:square;mso-height-percent:0;mso-wrap-distance-left:9pt;
mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;
mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;
mso-position-horizontal-relative:text;mso-position-vertical:absolute;
mso-position-vertical-relative:text;mso-height-percent:0;
mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAABQAFAGcBAAANDQAAAAA=
" adj="10607,,3520" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R3<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<!--[endif]--><!--[if gte vml 1]><v:shape
id="Up_x0020_Arrow_x0020_Callout_x0020_23" o:spid="_x0000_s1030" type="#_x0000_t79"
style='position:absolute;margin-left:4in;margin-top:-15.05pt;width:64.8pt;
height:63.4pt;z-index:251681792;visibility:visible;mso-wrap-style:square;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-height-percent:0;mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAABQAFAGcBAADUDAAAAAA=
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R2<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape
id="Up_x0020_Arrow_x0020_Callout_x0020_22" o:spid="_x0000_s1029" type="#_x0000_t79"
style='position:absolute;margin-left:225pt;margin-top:-14.65pt;width:64.8pt;
height:63.4pt;z-index:251679744;visibility:visible;mso-wrap-style:square;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-height-percent:0;mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAABQAFAGcBAADUDAAAAAA=
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape
id="Up_x0020_Arrow_x0020_Callout_x0020_20" o:spid="_x0000_s1028" type="#_x0000_t79"
style='position:absolute;margin-left:162pt;margin-top:-14.65pt;width:64.8pt;
height:63.4pt;z-index:251677696;visibility:visible;mso-wrap-style:square;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-height-percent:0;mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAFAAUAZwEAANMMAAAAAA==
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R2<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape
id="Up_x0020_Arrow_x0020_Callout_x0020_18" o:spid="_x0000_s1027" type="#_x0000_t79"
style='position:absolute;margin-left:99pt;margin-top:-14.65pt;width:64.8pt;
height:63.4pt;z-index:251675648;visibility:visible;mso-wrap-style:square;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-height-percent:0;mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAAAAUABQBnAQAA1QwAAAAA
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><!--[if gte vml 1]><v:shape
id="Up_x0020_Arrow_x0020_Callout_x0020_1" o:spid="_x0000_s1026" type="#_x0000_t79"
style='position:absolute;margin-left:-29.35pt;margin-top:-15.05pt;width:64.8pt;
height:63.4pt;z-index:251673600;visibility:visible;mso-wrap-style:square;
mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;
mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;
mso-position-horizontal:absolute;mso-position-horizontal-relative:text;
mso-position-vertical:absolute;mso-position-vertical-relative:text;
mso-height-percent:0;mso-height-relative:margin;v-text-anchor:top' o:gfxdata="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
AAAFAAUAZwEAANMMAAAAAA==
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1<o:p></o:p></p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
<w:wrap type="through"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><o:p></o:p></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves>false</w:TrackMoves>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1037"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
<!--StartFragment--><!--[if gte vml 1]><v:group id="Group_x0020_2" o:spid="_x0000_s1026"
style='position:absolute;margin-left:60.6pt;margin-top:171pt;width:506.4pt;
height:126.4pt;z-index:251659264' coordsize="6431280,1605280" o:gfxdata="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
Sy9Esqbq3NZt/gEAAP//AwBQSwMEFAAGAAgAAAAhAJxmRkG7AAAAJAEAACoAAABjbGlwYm9hcmQv
ZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHOEj80KwjAQhO+C7xD2btJ6EJEmvYjQq9QH
CMk2LTY/JFHs2xvoRUHwsjCz7DezTfuyM3liTJN3HGpaAUGnvJ6c4XDrL7sjkJSl03L2DjksmKAV
201zxVnmcpTGKSRSKC5xGHMOJ8aSGtHKRH1AVzaDj1bmIqNhQaq7NMj2VXVg8ZMB4otJOs0hdroG
0i+hJP9n+2GYFJ69elh0+UcEy6UXFqCMBjMHSldnnTUtXYGJhn39Jt4AAAD//wMAUEsBAi0AFAAG
AAgAAAAhACmb+0YEAQAAHgIAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQ
SwECLQAUAAYACAAAACEArTA/8cEAAAAyAQAACwAAAAAAAAAAAAAAAAA1AQAAX3JlbHMvLnJlbHNQ
SwECLQAUAAYACAAAACEAvD9fx+YEAADOKAAAHwAAAAAAAAAAAAAAAAAfAgAAY2xpcGJvYXJkL2Ry
YXdpbmdzL2RyYXdpbmcxLnhtbFBLAQItABQABgAIAAAAIQAral2V1wYAAPkbAAAaAAAAAAAAAAAA
AAAAAEIHAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQCcZkZBuwAA
ACQBAAAqAAAAAAAAAAAAAAAAAFEOAABjbGlwYm9hcmQvZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEu
eG1sLnJlbHNQSwUGAAAAAAUABQBnAQAAVA8AAAAA
">
<v:rect id="Rectangle_x0020_14" o:spid="_x0000_s1027" style='position:absolute;
left:30480;width:1600200;height:342900;visibility:visible;mso-wrap-style:square;
v-text-anchor:middle' o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQCUl7npwAAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE/NisIwEL4v+A5hBG9rqriLdE2LCIoeFtH1AYZmbKrN
pDSx1rc3grC3+fh+Z5H3thYdtb5yrGAyTkAQF05XXCo4/a0/5yB8QNZYOyYFD/KQZ4OPBaba3flA
3TGUIoawT1GBCaFJpfSFIYt+7BriyJ1dazFE2JZSt3iP4baW0yT5lhYrjg0GG1oZKq7Hm1VgL5uO
5/58mu2/wr7f1YfV7tcoNRr2yx8QgfrwL367tzrOn8Hrl3iAzJ4AAAD//wMAUEsBAi0AFAAGAAgA
AAAhADI8vT77AAAA4gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwEC
LQAUAAYACAAAACEAqotdDdMAAACPAQAACwAAAAAAAAAAAAAAAAAsAQAAX3JlbHMvLnJlbHNQSwEC
LQAUAAYACAAAACEAMy8FnkEAAAA5AAAAEAAAAAAAAAAAAAAAAAAoAgAAZHJzL3NoYXBleG1sLnht
bFBLAQItABQABgAIAAAAIQCUl7npwAAAANsAAAAPAAAAAAAAAAAAAAAAAJcCAABkcnMvZG93bnJl
di54bWxQSwUGAAAAAAQABAD1AAAAhAMAAAAA
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 1</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:rect><v:rect id="Rectangle_x0020_15" o:spid="_x0000_s1028" style='position:absolute;
left:4831080;width:1600200;height:342900;visibility:visible;mso-wrap-style:square;
v-text-anchor:middle' o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQD72xxywQAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE/NasJAEL4XfIdlBG91U2lEUlcpAUtzENH6AEN2zEaz
syG7TeLbu4WCt/n4fme9HW0jeup87VjB2zwBQVw6XXOl4Pyze12B8AFZY+OYFNzJw3YzeVljpt3A
R+pPoRIxhH2GCkwIbSalLw1Z9HPXEkfu4jqLIcKukrrDIYbbRi6SZCkt1hwbDLaUGypvp1+rwF6/
el75y/n9kIbDWDTHvNgbpWbT8fMDRKAxPMX/7m8d56fw90s8QG4eAAAA//8DAFBLAQItABQABgAI
AAAAIQAyPL0++wAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsB
Ai0AFAAGAAgAAAAhAKqLXQ3TAAAAjwEAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxzUEsB
Ai0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKAIAAGRycy9zaGFwZXhtbC54
bWxQSwECLQAUAAYACAAAACEA+9sccsEAAADbAAAADwAAAAAAAAAAAAAAAACXAgAAZHJzL2Rvd25y
ZXYueG1sUEsFBgAAAAAEAAQA9QAAAIUDAAAAAA==
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 4</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:rect><v:rect id="Rectangle_x0020_16" o:spid="_x0000_s1029" style='position:absolute;
left:1630680;width:1600200;height:342900;visibility:visible;mso-wrap-style:square;
v-text-anchor:middle' o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQALCYIFwQAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE/NasJAEL4XfIdlBG91U2lFUlcpAUtzkKD1AYbsmI1m
Z0N2m8S3dwuCt/n4fme9HW0jeup87VjB2zwBQVw6XXOl4PS7e12B8AFZY+OYFNzIw3YzeVljqt3A
B+qPoRIxhH2KCkwIbSqlLw1Z9HPXEkfu7DqLIcKukrrDIYbbRi6SZCkt1hwbDLaUGSqvxz+rwF6+
e1758+m9+AjFmDeHLN8bpWbT8esTRKAxPMUP94+O85fw/0s8QG7uAAAA//8DAFBLAQItABQABgAI
AAAAIQAyPL0++wAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsB
Ai0AFAAGAAgAAAAhAKqLXQ3TAAAAjwEAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxzUEsB
Ai0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKAIAAGRycy9zaGFwZXhtbC54
bWxQSwECLQAUAAYACAAAACEACwmCBcEAAADbAAAADwAAAAAAAAAAAAAAAACXAgAAZHJzL2Rvd25y
ZXYueG1sUEsFBgAAAAAEAAQA9QAAAIUDAAAAAA==
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 2</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:rect><v:rect id="Rectangle_x0020_17" o:spid="_x0000_s1030" style='position:absolute;
left:3230880;width:1600200;height:342900;visibility:visible;mso-wrap-style:square;
v-text-anchor:middle' o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQBkRSeewAAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE/bisIwEH0X/Icwwr5puuKNrlFEUNYHkaofMDRj091m
UppYu3+/EQTf5nCus1x3thItNb50rOBzlIAgzp0uuVBwveyGCxA+IGusHJOCP/KwXvV7S0y1e3BG
7TkUIoawT1GBCaFOpfS5IYt+5GriyN1cYzFE2BRSN/iI4baS4ySZSYslxwaDNW0N5b/nu1Vgf/Yt
L/ztOjlNw6k7VNn2cDRKfQy6zReIQF14i1/ubx3nz+H5SzxArv4BAAD//wMAUEsBAi0AFAAGAAgA
AAAhADI8vT77AAAA4gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwEC
LQAUAAYACAAAACEAqotdDdMAAACPAQAACwAAAAAAAAAAAAAAAAAsAQAAX3JlbHMvLnJlbHNQSwEC
LQAUAAYACAAAACEAMy8FnkEAAAA5AAAAEAAAAAAAAAAAAAAAAAAoAgAAZHJzL3NoYXBleG1sLnht
bFBLAQItABQABgAIAAAAIQBkRSeewAAAANsAAAAPAAAAAAAAAAAAAAAAAJcCAABkcnMvZG93bnJl
di54bWxQSwUGAAAAAAQABAD1AAAAhAMAAAAA
" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
Sprint 3</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:rect><v:shapetype id="_x0000_t79" coordsize="21600,21600" o:spt="79"
adj="7200,5400,3600,8100" path="m0@0l@3@0@3@2@1@2,10800,0@4@2@5@2@5@0,21600@0,21600,21600,,21600xe">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="val #0"/>
<v:f eqn="val #1"/>
<v:f eqn="val #2"/>
<v:f eqn="val #3"/>
<v:f eqn="sum 21600 0 #1"/>
<v:f eqn="sum 21600 0 #3"/>
<v:f eqn="sum #0 21600 0"/>
<v:f eqn="prod @6 1 2"/>
</v:formulas>
<v:path o:connecttype="custom" o:connectlocs="10800,0;0,@7;10800,21600;21600,@7"
o:connectangles="270,180,90,0" textboxrect="0,@0,21600,21600"/>
<v:handles>
<v:h position="topLeft,#0" yrange="@2,21600"/>
<v:h position="#1,topLeft" xrange="0,@3"/>
<v:h position="#3,#2" xrange="@1,10800" yrange="0,@0"/>
</v:handles>
</v:shapetype><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_1" o:spid="_x0000_s1031"
type="#_x0000_t79" style='position:absolute;top:337820;width:822960;height:805180;
visibility:visible;mso-wrap-style:square;v-text-anchor:top' o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQAngVWewQAA
ANoAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE9Na8JAEL0X/A/LCF7EbKogkrqGIljqsbEl12l2mqTN
zi7ZbYz99a4g9DQ83uds89F0YqDet5YVPCYpCOLK6pZrBe+nw2IDwgdkjZ1lUnAhD/lu8rDFTNsz
v9FQhFrEEPYZKmhCcJmUvmrIoE+sI47cl+0Nhgj7WuoezzHcdHKZpmtpsOXY0KCjfUPVT/FrFHwU
zn3q49/65bvsAqV1OT+VK6Vm0/H5CUSgMfyL7+5XHefD7ZXblbsrAAAA//8DAFBLAQItABQABgAI
AAAAIQAyPL0++wAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsB
Ai0AFAAGAAgAAAAhAKqLXQ3TAAAAjwEAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxzUEsB
Ai0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKAIAAGRycy9zaGFwZXhtbC54
bWxQSwECLQAUAAYACAAAACEAJ4FVnsEAAADaAAAADwAAAAAAAAAAAAAAAACXAgAAZHJzL2Rvd25y
ZXYueG1sUEsFBgAAAAAEAAQA9QAAAIUDAAAAAA==
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_18" o:spid="_x0000_s1032"
type="#_x0000_t79" style='position:absolute;left:1630680;top:342900;width:822960;
height:805180;visibility:visible;mso-wrap-style:square;v-text-anchor:top'
o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQCnDqMhxAAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9Ba8JAEIXvBf/DMkIvRTdtQSS6iggWe2xsyXXMjkk0
O7tkV0376zuHQm8zvDfvfbNcD65TN+pj69nA8zQDRVx523Jt4POwm8xBxYRssfNMBr4pwno1elhi
bv2dP+hWpFpJCMccDTQphVzrWDXkME59IBbt5HuHSda+1rbHu4S7Tr9k2Uw7bFkaGgy0bai6FFdn
4KsI4Wjff2Zv57JLlNXl06F8NeZxPGwWoBIN6d/8d723gi+w8osMoFe/AAAA//8DAFBLAQItABQA
BgAIAAAAIQAyPL0++wAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1s
UEsBAi0AFAAGAAgAAAAhAKqLXQ3TAAAAjwEAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxz
UEsBAi0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKAIAAGRycy9zaGFwZXht
bC54bWxQSwECLQAUAAYACAAAACEApw6jIcQAAADbAAAADwAAAAAAAAAAAAAAAACXAgAAZHJzL2Rv
d25yZXYueG1sUEsFBgAAAAAEAAQA9QAAAIgDAAAAAA==
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_20" o:spid="_x0000_s1033"
type="#_x0000_t79" style='position:absolute;left:2430780;top:342900;width:822960;
height:805180;visibility:visible;mso-wrap-style:square;v-text-anchor:top'
o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQCXFGWavwAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRE9Ni8IwEL0L/ocwghdZ01UQ6RpFhBU9blV6nW1m22oz
CU3Uur/eHASPj/e9WHWmETdqfW1Zwec4AUFcWF1zqeB4+P6Yg/ABWWNjmRQ8yMNq2e8tMNX2zj90
y0IpYgj7FBVUIbhUSl9UZNCPrSOO3J9tDYYI21LqFu8x3DRykiQzabDm2FCho01FxSW7GgWnzLlf
vf+fbc95Eygp89Ehnyo1HHTrLxCBuvAWv9w7rWAS18cv8QfI5RMAAP//AwBQSwECLQAUAAYACAAA
ACEAMjy9PvsAAADiAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQIt
ABQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAAAAAAAAAAAAAACwBAABfcmVscy8ucmVsc1BLAQIt
ABQABgAIAAAAIQAzLwWeQQAAADkAAAAQAAAAAAAAAAAAAAAAACgCAABkcnMvc2hhcGV4bWwueG1s
UEsBAi0AFAAGAAgAAAAhAJcUZZq/AAAA2wAAAA8AAAAAAAAAAAAAAAAAlwIAAGRycy9kb3ducmV2
LnhtbFBLBQYAAAAABAAEAPUAAACDAwAAAAA=
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R2</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_22" o:spid="_x0000_s1034"
type="#_x0000_t79" style='position:absolute;left:3230880;top:342900;width:822960;
height:805180;visibility:visible;mso-wrap-style:square;v-text-anchor:top'
o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQAIil52wwAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9Ba8JAFITvBf/D8gQvUjdGkJK6ihQqejS25PqafSbR
7Nslu2raX+8KQo/DzHzDLFa9acWVOt9YVjCdJCCIS6sbrhR8HT5f30D4gKyxtUwKfsnDajl4WWCm
7Y33dM1DJSKEfYYK6hBcJqUvazLoJ9YRR+9oO4Mhyq6SusNbhJtWpkkylwYbjgs1OvqoqTznF6Pg
O3fuR+/+5ptT0QZKqmJ8KGZKjYb9+h1EoD78h5/trVaQpvD4En+AXN4BAAD//wMAUEsBAi0AFAAG
AAgAAAAhADI8vT77AAAA4gEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQ
SwECLQAUAAYACAAAACEAqotdDdMAAACPAQAACwAAAAAAAAAAAAAAAAAsAQAAX3JlbHMvLnJlbHNQ
SwECLQAUAAYACAAAACEAMy8FnkEAAAA5AAAAEAAAAAAAAAAAAAAAAAAoAgAAZHJzL3NoYXBleG1s
LnhtbFBLAQItABQABgAIAAAAIQAIil52wwAAANsAAAAPAAAAAAAAAAAAAAAAAJcCAABkcnMvZG93
bnJldi54bWxQSwUGAAAAAAQABAD1AAAAhwMAAAAA
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R1</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_23" o:spid="_x0000_s1035"
type="#_x0000_t79" style='position:absolute;left:4030980;top:337820;width:822960;
height:805180;visibility:visible;mso-wrap-style:square;v-text-anchor:top'
o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQBnxvvtxAAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9Ba8JAFITvhf6H5QleSrMxgkh0DVJQ7LFRyfU1+0zS
Zt8u2VXT/vpuodDjMDPfMOtiNL240eA7ywpmSQqCuLa640bB6bh7XoLwAVljb5kUfJGHYvP4sMZc
2zu/0a0MjYgQ9jkqaENwuZS+bsmgT6wjjt7FDgZDlEMj9YD3CDe9zNJ0IQ12HBdadPTSUv1ZXo2C
c+ncu379Xuw/qj5Q2lRPx2qu1HQyblcgAo3hP/zXPmgF2Rx+v8QfIDc/AAAA//8DAFBLAQItABQA
BgAIAAAAIQAyPL0++wAAAOIBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1s
UEsBAi0AFAAGAAgAAAAhAKqLXQ3TAAAAjwEAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxz
UEsBAi0AFAAGAAgAAAAhADMvBZ5BAAAAOQAAABAAAAAAAAAAAAAAAAAAKAIAAGRycy9zaGFwZXht
bC54bWxQSwECLQAUAAYACAAAACEAZ8b77cQAAADbAAAADwAAAAAAAAAAAAAAAACXAgAAZHJzL2Rv
d25yZXYueG1sUEsFBgAAAAAEAAQA9QAAAIgDAAAAAA==
" adj="7565,5517,5400,8158" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R2</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><v:shape id="Up_x0020_Arrow_x0020_Callout_x0020_24" o:spid="_x0000_s1036"
type="#_x0000_t79" style='position:absolute;left:3573780;top:342900;width:822960;
height:1262380;visibility:visible;mso-wrap-style:square;v-text-anchor:top'
o:gfxdata="UEsDBBQABgAIAAAAIQAyPL0++wAAAOIBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJQ4sEEJNuiCwBATlACN7klgkY8tjQnt7Jm3ZIFTE0p55/z/Zq/V2GtWMiX2gWl+WlVZI
NjhPfa3fNg/FjVacgRyMgbDWO2S9bs7PVptdRFZCE9d6yDneGsN2wAm4DBFJJl1IE2Q5pt5EsO/Q
o7mqqmtjA2WkXOQlQzerFjv4GLO638r1wURwre4Oe0tVrSHG0VvIImqWqfmVSzjyCXAm98OuOJqV
Qu7DefCRL44NT/I0yTtUz5DyI0ziYVxiwwNElJ3ytOdSN3ERus5bLNvErwv3V7gLn5Rw/m92K9gL
zt/pZv9DzRcAAAD//wMAUEsDBBQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAX3JlbHMvLnJlbHOk
kLFqAzEMhvdA38Fo7/mSoZQQX7ZC1pBCV2Hr7kzOlrHMNXn7uJRCL2TLoEG/0PcJ7faXMKmZsniO
BtZNC4qiZefjYODz9PH6DkoKRocTRzJwJYF997LaHWnCUpdk9ElUpUQxMJaStlqLHSmgNJwo1knP
OWCpbR50QnvGgfSmbd90/s+AbsFUB2cgH9wa1OmaqvmOHbzNLNyXxnLQ3PfePqJqGTHRV5gqBvNA
xYDL8pvW05paoB+bN0+aHX/HI81L8U+Yaf7z6sUbuxsAAAD//wMAUEsDBBQABgAIAAAAIQAzLwWe
QQAAADkAAAAQAAAAZHJzL3NoYXBleG1sLnhtbLKxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3
VQoNcdO1UFIoLknMS0nMyc9LtVWqTC1Wsrfj5QIAAAD//wMAUEsDBBQABgAIAAAAIQD71+fQxQAA
ANsAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9Ba8JAFITvgv9heYXezKZSJKbZSBFaehCkKpTcXrOv
SWj2bZpdTfTXuwXB4zAz3zDZajStOFHvGssKnqIYBHFpdcOVgsP+bZaAcB5ZY2uZFJzJwSqfTjJM
tR34k047X4kAYZeigtr7LpXSlTUZdJHtiIP3Y3uDPsi+krrHIcBNK+dxvJAGGw4LNXa0rqn83R2N
gu3Qfhl5WSTH4m9jtsV7ufTfiVKPD+PrCwhPo7+Hb+0PrWD+DP9fwg+Q+RUAAP//AwBQSwECLQAU
AAYACAAAACEAMjy9PvsAAADiAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnht
bFBLAQItABQABgAIAAAAIQCqi10N0wAAAI8BAAALAAAAAAAAAAAAAAAAACwBAABfcmVscy8ucmVs
c1BLAQItABQABgAIAAAAIQAzLwWeQQAAADkAAAAQAAAAAAAAAAAAAAAAACgCAABkcnMvc2hhcGV4
bWwueG1sUEsBAi0AFAAGAAgAAAAhAPvX59DFAAAA2wAAAA8AAAAAAAAAAAAAAAAAlwIAAGRycy9k
b3ducmV2LnhtbFBLBQYAAAAABAAEAPUAAACJAwAAAAA=
" adj="10607,,3520" fillcolor="#4f81bd [3204]" strokecolor="#4579b8 [3044]">
<v:fill color2="#a7bfde [1620]" rotate="t" type="gradient">
<o:fill v:ext="view" type="gradientUnscaled"/>
</v:fill>
<v:shadow on="t" opacity="22937f" mv:blur="40000f" origin=",.5" offset="0,23000emu"/>
<v:textbox>
<![if !mso]>
<table cellpadding=0 cellspacing=0 width="100%">
<tr>
<td><![endif]>
<div>
<p class=MsoNormal align=center style='text-align:center'>
R3</p>
</div>
<![if !mso]></td>
</tr>
</table>
<![endif]></v:textbox>
</v:shape><w:wrap type="through"/>
</v:group><![endif]--><!--[if !vml]--><!--[endif]--><!--EndFragment--></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-YVuCBKaj0CM/Uhxk6yRqhqI/AAAAAAAAAEo/1_GRAHyXtRY/s1600/RegressionSprint.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="126" src="http://1.bp.blogspot.com/-YVuCBKaj0CM/Uhxk6yRqhqI/AAAAAAAAAEo/1_GRAHyXtRY/s400/RegressionSprint.png" width="400" /></a></div>
</div>
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves>false</w:TrackMoves>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1036"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<div class="MsoNormal">
As mentioned before at the end of each sprint the new
features suite should executed additively. For example in sprint 1 we have 5
features and in sprint 2 we have 3 features. The regression suite should have
cases testing the 5 features (end of sprint 1) and cases 8 features (end of
sprint 2) <o:p></o:p></div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-30665604679803807472013-07-03T16:22:00.000+03:002020-12-14T18:16:31.370+02:00How to perform multiple mouse and keyboard actions in Selenium RC and Web Driver<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
Many applications allow or require a user, to perform multiple
or complicated actions, like drag and drop.</div>
<div class="MsoNormal">
In this post we will describe how we can implement, such
actions with the use of <i>SeleniumRC</i><span style="background: white; color: #555555; font-family: "Arial","sans-serif"; font-size: 10.0pt; line-height: 115%;"> </span>and the <i>Web Driver</i>.</div>
<div class="MsoNormal">
<b><i><br /></i></b>
<b><i>Selenium RC</i></b></div>
<div class="MsoNormal">
In the <i>Selenium RC</i> case, a user can perform all the actions
upon a selenium instance.</div>
<div class="MsoNormal">
All user interactions are performed sequentially. Some
examples are the following:</div>
<pre class="prettyprint"><i><b>selenium.dragAndDropToObject(locatorFrom, locatorTo);</b></i>
<i><b>selenium.keyDownNative (thekey.getEvent());</b></i></pre>
<div class="MsoNormal">
<b><i style="mso-bidi-font-style: normal;"><br /></i></b>
<b><i style="mso-bidi-font-style: normal;">Web Driver</i></b></div>
<div class="MsoNormal">
In <i>Web Driver</i>, things are a little more complicating, thus
interesting. First of all we will introduce class Ac<span style="font-family: inherit;">tions of the selenium
(package org.openqa.selenium.interactions).</span></div>
<div class="MsoNormal">
<span style="font-family: inherit;">The Actions class is user-facing API for emulating complex
user gestures. <i>Web Driver</i> users can use this class to simulate </span>usage of
keyboard or mouse events. </div>
<div class="MsoNormal">
The Actions class contains the keyboard and mouse related
actions. For example:</div>
<pre class="prettyprint"><b><i><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span>click(WebElement onElement)<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"> <span style="font-size: 7pt;"> </span></span></span></i></b>
<b><i><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span>clickAndHold(WebElement onElement)</i></b>
<b><i>doubleClick()<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"> <span style="font-size: 7pt;"> </span></span></span></i></b>
<b><i><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span>doubleClick(WebElement onElement)<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"></span></span></i></b>
<b><i>dragAndDropBy(WebElement source, int xOffset,int yOffset)<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span></i></b>
<b><i><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span>keyDown(Keys theKey)<span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span></i></b>
<b><i><span style="font-family: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;"><span style="font-size: 7pt;"> </span></span></span>keyDown(WebElement element, Keys theKey)</i></b>
<b><i>keyUp(Keys theKey)</i></b>
<b><i>keyUp(WebElement element, Keys theKey)</i></b>
<b><i>moveByOffset(int xOffset, int yOffset)</i></b></pre>
<b><i>
</i></b>
<span style="font-family: inherit;">In order to use the above mentioned actions the user should
do the following</span>
<br />
<div class="MsoNormal">
F<span style="font-family: inherit;">irst of all, the us</span>er must create an instance <i>Actions class
</i></div>
<div class="MsoNormal">
<pre class="prettyprint"><b><i>Actions builder = new Actions(driver);</i></b></pre>
<div>
</div>
<div>
<span style="font-family: inherit;">where
<i><b>driver </b></i>is a <i>Web Driver</i> instance.</span></div>
</div>
<div class="MsoNormal">
<br />
Let us explain all the above, a little...</div>
<div class="MsoNormal">
In the <i><b>Actions class</b>,</i> the user, can perform one action, by
simply calling it into the driver instance, followed by the method <i><b>perform()</b></i>.</div>
<div class="MsoNormal">
For example, if I wanted to double click somewhere:</div>
<pre class="prettyprint"><b><i>Actions builder = new Actions(driver);</i></b>
<b><i>driver.doubleclick().perform();</i></b>
</pre>
<div class="MsoNormal">
<span style="color: black; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;">This is ok, in the case that the user wants to perform
only one action at a time.</span></div>
<div class="MsoNormal">
<span style="color: black; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;">But what happens when a user wants to perform many
actions? The obvious way to do it, is to perform these actions sequentially.
This is made easier, by the fact that all Actions methods return an Actions
object.</span><span style="color: black; font-family: "Lucida Console"; font-size: 9.0pt; line-height: 115%;"></span></div>
<pre class="prettyprint"><b><i>builder.clickAndHold(ElementA)</i></b>
<b><i> .moveToElement(ElementB)</i></b>
<b><i> .release(ElementA)</i></b>
<b><i> .keyUp(Keys.CONTROL).perform();</i></b></pre>
<div class="MsoNormal">
<span style="color: black; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;">A smoother and cooler way to do the above, would be to
wrap all these actions in one method, and just call it.</span></div>
<div class="MsoNormal">
<span style="color: black; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;">This can be done with the use of the interface Action.
The Action interface only has one action -</span><span style="font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;"><i> <b>perform()</b></i><span style="color: black;">.</span></span></div>
<div class="MsoNormal">
<div class="MsoNormal">
<pre class="prettyprint"><b><i>Action dropAToB= builder.build();</i></b>
<b><i><b><i><b><i>dropAToB</i></b></i></b>.perform()</i></b>;</pre>
<span style="color: black; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: Consolas;">In the above example, we dragged ElementA and dropped it to ElementB, using multiple actions.</span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hCVVi9sXnbo/UdQTGcnftcI/AAAAAAAAAAc/vIdFosrzDoU/s555/dragdrop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://1.bp.blogspot.com/-hCVVi9sXnbo/UdQTGcnftcI/AAAAAAAAAAc/vIdFosrzDoU/s320/dragdrop.jpg" width="320" /></a></div>
As a conclusion, Web Driver wins on points Selenium RC, in terms of simplicity. A selenium user will have to execute all actions separately, and sequentially, whereas, a Web Driver user, will just create an actions-chain, upon the driver instance, and execute all the actions in one line.</div>
</div>
</div>
Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-31528811705114444722013-06-21T12:07:00.000+03:002020-12-14T18:16:31.576+02:00Handling pop ups/alert/confirmations/prompts in Selenium RC / WebDriver<div dir="ltr" style="text-align: left;" trbidi="on">
In most web applications the handling of pop ups/alert/confirmations/prompts during the automation testing is a common issue.<br />
In this post we will describe how we can use the SeleniumRC and the Webdriver in order to manage them.<br />
<br />
<i><b>Selenium RC</b></i><br />
<br />
Selenium RC provides the 3 following methods in order to handle alert-confirmation and prompt pop-ups.<br />
<br />
<pre class="prettyprint"><i><b>void </b>chooseOkOnNextConfirmation();</i>
<i><b>void</b> chooseCancelOnNextConfirmation();</i>
<i><b>void </b>answerOnNextPrompt(answer);</i></pre>
<br />
The first two are used for hanling of alert-confirmation pop-ups and the third for prompt pop-ups<br />
The tricky part with these methods is that they must called BEFORE the action that fires the pop-up.<br />
<br />
Consider for example the following scenario:<br />
<br />
Select a object from the page, Click on Delete button. It triggers a alert saying "Object is going to be deleted, Click OK to Confirm or Cancel to Cancel the Operation".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-XObB5Ti6lQA/UcMSFKv-nLI/AAAAAAAAAAg/uycQx6Zgu64/s1600/confirmation.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="http://2.bp.blogspot.com/-XObB5Ti6lQA/UcMSFKv-nLI/AAAAAAAAAAg/uycQx6Zgu64/s320/confirmation.jpg" width="320" /></a></div>
<br />
<br />
So if selenium is a Selenium instance, in order to Delete the object, the code snippet in out test automation script should be as follows:<br />
<pre class="prettyprint"><i>selenium.chooseOkOnNextConfirmation();</i>
<i>selenium.click('locator of Delete button');</i></pre>
<br />
In order to Cancel the deletion of the object, the code snippet in out test automation script should be as follows:<br />
<pre class="prettyprint"><i>selenium.chooseCancelOnNextConfirmation();</i>
<i>selenium.click('locator of Delete button');</i></pre>
<br />
Keep in mind that in both cases during the execution of the test automation script, the user WILL NOT SEE the actual alert pop-up but the action is done 'behind the scenes';<br />
<br />
The code is similar in the case the action fires a prompt pop-up(the user is prompted to enter a text inside the pop-up)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-h7pjMJgC3GQ/UcMS_pI7KwI/AAAAAAAAAAs/hmMSa2V_9io/s1600/prompt.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-h7pjMJgC3GQ/UcMS_pI7KwI/AAAAAAAAAAs/hmMSa2V_9io/s1600/prompt.jpg" /></a></div>
<br />
<pre class="prettyprint"><i>selenium.answerOnNextPrompt('text');</i>
<i>selenium.click('locator of element that triggered the prompt');</i></pre>
<br />
<b><i>Web Driver</i></b><br />
<br />
Web Driver provides a more efficient manner to handle all these events through the Alert interface, using the following methods:<br />
<i><br />
</i> <br />
<pre class="prettyprint"><i><b>void </b>dismiss();</i>
<i><b>void </b>accept();</i>
<i><b>String </b>getText();</i>
<i><b>void </b>sendKeys(String keysToSend);</i></pre>
<br />
So if driver is a WebDriver instance, regarding the scenarios we mentioned earlier the code snippet in out test automation script should be as follows:<br />
<br />
<u>1st case</u><br />
<pre class="prettyprint"><i>driver.findElement(By.id('id of Delete button')).click();</i>
<i>Alert myAlert = driver.switchTo().alert(); </i>//Switch to alert pop-up
<i>myAlert.accept(); </i>//accept the alert - equivalent of pressing OK</pre>
<br />
<u>2nd case</u><br />
<pre class="prettyprint"><i>driver.findElement(By.id('id of Delete button')).click(); </i>
<i>Alert myAlert = driver.switchTo().alert(); </i>
<i>myAlert.dismiss();</i> //cancel the alert - equivalent of pressing CANCEL</pre>
<br />
<u>3rd case</u><br />
<pre class="prettyprint"><i>driver.findElement(By.id('id of web element')).click(); </i>
<i>Alert myAlert = driver.switchTo().alert(); </i>
<i>alert.sendkeys('text');</i> //Write text inside the prompt
<i>myAlert.accept();</i></pre>
<br />
If you need to wait until the Alert present you can use the following code:<br />
<pre class="prettyprint"><i>WebDriverWait driver = new WebDriverWait(driver, 10);</i>
<i>Alert myAlert = driver.until(ExpectedConditions.alertIsPresent());</i></pre>
<br />
It is important to notice two things here:<br />
<br />
<ol style="text-align: left;">
<li>In the case of WebDriver the methods are called AFTER the action that fires the pop-up(which is the real case scenario), and </li>
<li>During the execution of the test automation script, the user WILL BE ABLE TO SEE the actual alert pop-up (Web Driver simulates exactly the user case scenario).</li>
</ol>
<br />
Have fun...<br />
<br /></div>
Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-46375198862855618622013-04-06T09:25:00.000+03:002020-12-14T18:16:31.783+02:00Stevia is Released<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/persado/stevia" target="_blank"><img border="0" src="http://2.bp.blogspot.com/-Rac3Vp9uMEY/UV-1o_eAhpI/AAAAAAAAADY/m1FKUgsHIh4/s320/stevia-logo.png" width="160" /></a></div>
<br />
<span style="background-color: white; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;">Stevia 0.6.0 has been released to Maven Central! fetch the latest artifact directly from the Central Repository. To use Stevia, add this to your pom.xml:</span><br />
<pre class="prettyprint"><span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif;"><dependency></span>
<span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif;"> <groupId>com.persado.oss.quality.stevia</groupId></span>
<span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif;"> <artifactId>stevia-core</artifactId></span>
<span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif;"> <version>0.6.0</version></span>
<span style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif;"></dependency></span></pre>
<span style="background-color: white; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; white-space: normal;">
</span>
<span style="background-color: white; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; white-space: normal;">Discover how easy is made to create and execute tests. Run the example script and see how a test can be run in Selenium and WebDriver using Firefox, Chrome, InternetExplorer, Safari and Opera.</span><br />
<span style="background-color: white; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; white-space: normal;"><br /></span>
<span style="background-color: white; color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; white-space: normal;">Happy hunting!</span></div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-77441310205437887022013-04-04T16:52:00.002+03:002020-12-14T18:16:31.989+02:00Stevia is coming ...<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="background-color: white; color: #222222;">
<a href="http://4.bp.blogspot.com/-yC9ABLTG_0Y/UV8amselC4I/AAAAAAAAADA/IkL_4sGE46Y/s1600/stevia-logo.png" imageanchor="1"><img border="0" src="http://4.bp.blogspot.com/-yC9ABLTG_0Y/UV8amselC4I/AAAAAAAAADA/IkL_4sGE46Y/s320/stevia-logo.png" width="160" /></a>
<span style="font-family: Arial, Helvetica, sans-serif;">Back in 2011 while implementing the page object maintainability technique in our test code the idea of creating a framework for testing web apps using java and selenium was created. Couple of years later and after some back and forth the framework became to realization and the name of it is: STEVIA.</span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;">Stevia is a Java-based framework created by the encapsulation of three major technologies</span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;">· TestNG (a well-known unit testing framework)</span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;">· Selenium (a well-known framework for automation of user actions via browsers)</span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;">· Spring (the most commonplace user library in Java).</span></div>
<div style="background-color: white; color: #222222;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div style="background-color: white;">
<span style="color: #222222; font-family: Arial, Helvetica, sans-serif;">While the release of Stevia is imminent to Github and in the open source community, a first release of our technical document is uploaded in the following link: </span><span style="background-color: transparent;"><span style="color: #222222; font-family: Arial, Helvetica, sans-serif;"><a href="http://goo.gl/Is3lA">http://goo.gl/Is3lA</a></span></span><span style="color: #222222; font-family: Arial, Helvetica, sans-serif;"> for user reactions gathering. Please have a good read through and/or comment if you think more details are needed.</span></div>
<div style="background-color: white;">
<span style="color: #222222; font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div style="background-color: white;">
<span style="color: #222222; font-family: Arial, Helvetica, sans-serif;">The document will stay for a week uploaded for everyone who wishes to comment and all constructive reviews are more than welcome. F</span><span style="color: #222222; font-family: arial, sans-serif;">or any technical inquiries and details of the release, feel free to ping as at stevia-release [at] </span><a href="http://persado.com/" style="color: #1155cc; font-family: arial, sans-serif;" target="_blank">persado.com</a></div>
<div style="background-color: white; color: #222222;">
<span style="line-height: 17px;"><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></span></div>
<div style="background-color: white; color: #222222;">
<span style="line-height: 17px;"><span style="font-family: Arial, Helvetica, sans-serif;">Stay tuned for the upcoming release early next week.</span></span></div>
<br />
<u style="font-weight: bold;">UPDATE:</u> We have released it! Check <a href="http://seleniumtestingworld.blogspot.com/2013/04/stevia-is-released.html" target="_blank">here</a> and <a href="https://github.com/persado/stevia" target="_blank">on GitHub!</a></div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-34806331973194482002013-03-22T13:27:00.000+02:002020-12-14T18:16:32.196+02:00ReportNG Enrichment With Screenshots<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Having a vast number of regression tests it became obvious to our QA team that a good reporting tool for reporting the execution results was of great essence. Our first approach in reporting was to use a simple HTML reporting plug-in for TestNG, known as <a href="http://reportng.uncommons.org/">ReportNG</a>. ReportNG was the obvious way to go just because of its simplicity and easiness in integration with TestNG which is our testing framework. ReportNG provided us with a html report presenting each @Test with a pass / fail state.<br />
<br />
Although ReportNG presented an excellent solution to our reporting problems it became apparent that for debugging purposes as well as for defect evidence purposes an extension to include screenshots was needed. These screenshots should be attached to every <a href="http://testng.org/doc/index.html">@Test</a> annotation which fails along with the assertion failure.<br />
<br />
In this post I will present you how we implemented the enrichment of ReportNG with screenshots taken by using the Selenium RC api.<br />
<br />
ReportNG was used simply by included the dependency tag in the pom.xml of our Project, as:<br />
<br />
<pre class="prettyprint"><dependencies>
<dependency>
<groupId>org.uncommons</groupId>
<artifactId>reportng</artifactId>
<version>${reportngVersion}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
<dependency>
</dependencies></pre>
<br />
Selenium provides a function which capture a screenshot of the current window of the browser. We depend on this and we implement a function in Java which captures the screenshot and places it in the corresponding path in the filesystem as:<br />
<br />
<pre class="prettyprint">public void createScreenshot(ITestResult tr) {
String testName=parseTestCaseName(tr.getTestClass().getRealClass().getName());
String imagePath="screenshot-" + testName + "-"
+ (new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())) + ".png";
try {
Selenium sel = (Selenium) tr.getAttribute("selenium");
log.info("Parameter selenium is set to :" + sel);
if (sel != null) {
String base64Screenshot = sel.captureEntirePageScreenshotToString("");
byte[] decodedScreenshot = Base64.decodeBase64(base64Screenshot.getBytes());
FileOutputStream fos = null;
try {
File screenShotFname = new File(currentPath,imagePath);
fos = new FileOutputStream(screenShotFname);
fos.write(decodedScreenshot);
log.info("Stored screenshot in file "+screenShotFname.getAbsolutePath());
reportLogScreenshot(screenShotFname);
} finally {
if (null != fos) {
fos.close();
}
} else {
log.warn("selenium object is not set, cannot get screenshot");
log.warn(new Exception("STACKTRACE"));
}
} catch (Exception e) {
e.printStackTrace();
}
</pre>
Ok, now with this function we have the screenshot stored in the corresponding path then we need to draw it into the reportNG log,the implementation is the following:
<br />
<pre class="prettyprint">protected void reportLogScreenshot(File file) {
System.setProperty("org.uncommons.reportng.escape-output", "false");
String absolute = file.getAbsolutePath();
int beginIndex = absolute.indexOf(".");
String relative = absolute.substring(beginIndex).replace(".\\","");
String screenShot = relative.replace('\\','/');
Reporter.log("<a href=\"" + screenShot + "\"><p align=\"left\">Error screenshot at " + new Date()+ "</p>");
Reporter.log("<p><img width=\"1024\" src=\"" + file.getAbsoluteFile() + "\" alt=\"screenshot at " + new Date()+ "\"/></p></a><br />");
}</pre>
<b style="background-color: white; color: #555555; font-family: 'Helevtica Neue', Arial, 'Century gothic', sans-serif; font-size: 13px; line-height: 20px; white-space: normal;">HINT:</b><span style="background-color: white; color: #555555; font-family: 'Helevtica Neue', Arial, 'Century gothic', sans-serif; font-size: 13px; line-height: 20px; white-space: normal;"> By default ReportNG escape the special characters, so in order not to see the href link in the reported log instead of your screenshot you will need to disable this escaping as:</span>
<span style="background-color: white; color: #555555; font-family: 'Helevtica Neue', Arial, 'Century gothic', sans-serif; font-size: 13px; line-height: 20px; white-space: normal;">
</span>
<span style="background-color: white; color: #555555; font-family: 'Helevtica Neue', Arial, 'Century gothic', sans-serif; font-size: 13px; line-height: 20px; white-space: normal;">
</span>
<br />
<pre class="prettyprint">System.setProperty("org.uncommons.reportng.escape-output", "false");</pre>
<span style="font-family: inherit;"><i style="background-color: white; color: #333333; line-height: 18px; white-space: normal;">Voilà, </i><span style="background-color: white; color: #333333; line-height: 18px; white-space: normal;">and now the report log print the capture screenshot and display it as:</span></span>
<span style="background-color: white; color: #333333; font-family: Verdana; font-size: 12px; line-height: 18px; white-space: normal;">
</span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-Dsq7AHPdrUs/UUrzZ7PacJI/AAAAAAAAADI/YMDYhWAH-wM/s1600/ReportNG.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="184" src="http://3.bp.blogspot.com/-Dsq7AHPdrUs/UUrzZ7PacJI/AAAAAAAAADI/YMDYhWAH-wM/s320/ReportNG.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ReportNG</td></tr>
</tbody></table>
<span style="font-family: inherit;"><span style="color: #333333;"><span style="line-height: 18px;">For the above implementation to work one should encapsulate it in a TestNG listener </span></span></span><span style="color: #333333; line-height: 18px;">which calls these functions when the Test fails</span><span style="color: #333333; font-family: inherit; line-height: 18px;">. We intent to release the aforementioned implementation along with the listener, as part of an upcoming open source release of our testing framework called Stevia. This framework will </span><span style="color: #333333; line-height: 18px;">provide</span><br />
<br />
<ul style="text-align: left;">
<li><span style="color: #333333; line-height: 18px;">Selenium and WebDriver API unification: common API methods used for UI Testing, working for both Selenium and WebDriver!, with a flick of a switch </span></li>
<li><span style="color: #333333; line-height: 18px;">Enhanced verification methods providing element highlighting both in execution and reporting phases</span></li>
<li><span style="color: #333333; line-height: 18px;">Enhanced ReportNG reporting with element highlighting and screenshot inclusion, both for Remote (Selenium Grid) and Local (Selenium RC, WebDriver) methods.</span></li>
<li><span style="color: #333333; line-height: 18px;">Technical documentation, examples, and a lot more. </span></li>
</ul>
<br />
<span style="color: #333333; line-height: 18px;"><br /></span>
<span style="color: #333333; line-height: 18px;">Stay tuned for the official release and </span><span style="color: #333333; line-height: 18px;">corresponding download link.... </span></div>
</div>
Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-90975373338131012862013-02-25T12:04:00.001+02:002020-12-14T18:16:32.405+02:00Setup Groovy in Eclipse<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="http://groovy.codehaus.org/">Groovy</a> came in my Test Automation life here in <a href="http://persado.com/">Persado </a>in order to make my daily life more easy and also make my coding more exciting. In this post I will present the way Groovy became part of my IDE, in order to start "groovy"ing.<br />
<br />
<b>Firstly</b>, I installed the eclipse Groovy plugin, this was a piece of cake since I was only a few of steps away of it. Via the Marketplace of my Spring Tool Suite (<a href="http://www.springsource.org/sts">STS</a>): <i>Help - Eclipse Marketplace - Search for Groovy -Install</i>
<br />
<span id="goog_545424885"></span><span id="goog_545424886"></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-BRiWAXnXDik/USpWbyHp6XI/AAAAAAAAACA/095srFSySVE/s1600/Groovy+plugin.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="356" src="http://3.bp.blogspot.com/-BRiWAXnXDik/USpWbyHp6XI/AAAAAAAAACA/095srFSySVE/s640/Groovy+plugin.png" title="Intall Groovy Plugin for Eclipse" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Install Groovy plugin</td></tr>
</tbody></table>
<br />
Groovy plugin for eclipse can be also found under the following URL: <a href="http://groovy.codehaus.org/Eclipse+Plugin">Groovy Plugin for Eclipse</a><br />
<br />
Since, the first step was completed, I moved to the <b>second </b>one and I created a new Groovy class by following the path in Eclipse: <i>File - New - Other - Groovy - Groovy Class.</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-lCGVyfxvqt4/USpjzei7UMI/AAAAAAAAACo/iQ5cYh-Uxm8/s1600/New+Groovy+Class.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="356" src="http://2.bp.blogspot.com/-lCGVyfxvqt4/USpjzei7UMI/AAAAAAAAACo/iQ5cYh-Uxm8/s640/New+Groovy+Class.png" title="Add new Groovy Class" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">New Groovy class</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
My java code was already under a Maven project, so I followed the standard maven approach and placed my Groovy classes under src/main/groovy and src/test/groovy and keep my Java classes under src/main/java and src/test/java structure.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-WAWp9WsODDk/USjfXuoK9sI/AAAAAAAAAAw/5AhUT5T2e1M/s1600/Maven+structure.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="356" src="http://4.bp.blogspot.com/-WAWp9WsODDk/USjfXuoK9sI/AAAAAAAAAAw/5AhUT5T2e1M/s640/Maven+structure.png" title="Maven Groovy Folders Structure" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Maven Structure</td></tr>
</tbody></table>
<br />
<b>HINT:</b> In case the Groovy folders /src/test/groovy and /scr/main/groovy are not displayed, select your project and by right clicking select <i>Build Path - Configure Build Path</i> -<i> Add Folder</i> then include the folders on your view as:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-6939vv1yax4/USsl-bnaJ8I/AAAAAAAAAC4/PHqQmAsqgeI/s1600/Groovy+Folders.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="360" src="http://4.bp.blogspot.com/-6939vv1yax4/USsl-bnaJ8I/AAAAAAAAAC4/PHqQmAsqgeI/s640/Groovy+Folders.png" title="How to display Groovy Folder" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Display Groovy Folders</td></tr>
</tbody></table>
<br />
Then, as a <b>third </b>step, I converted my project to a Groovy one by just selecting my project then by right clicking on option <i>Configure - Convert to Groovy Project.</i><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-0fictMaRWwc/USjlQJaREzI/AAAAAAAAABA/MuG3imgLbCM/s1600/Convert+to+Groovy.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="356" src="http://2.bp.blogspot.com/-0fictMaRWwc/USjlQJaREzI/AAAAAAAAABA/MuG3imgLbCM/s640/Convert+to+Groovy.png" title="Convert your project to Groovy" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Convert to Groovy</td></tr>
</tbody></table>
<span id="goog_1256417265"></span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Moving <b>forward</b>, I thought that I need to adapt Groovy in my maven word in order to compile my Groovy classes.<br />
In order to achieve it, in the pom.xml, I included the dependency tag for Groovy:<br />
<pre class="prettyprint"><dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovyVersion}</version>
<dependency>
</dependencies> </pre>
also, i needed a Groovy plugin with the goal <i>“generateStubs”,</i>so included<i> </i>the following tags:
<br />
<pre class="prettyprint"><plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<configuration>
<providerSelection>1.8</providerSelection>
</configuration>
<executions>
<execution>
<goals>
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>generateTestStubs</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin></pre>
<br />
The <span style="background-color: yellow;">goal "generateStubs"</span> was I a surprise for me when I realized that, as its name dedicate,creates java stubs of groovy classes.To understand it, consider a java class which needs a Groovy one to compile with and since maven standard compile process starts with /main and /test java packages and then with the /main and /test Groovy packages, compilation would stop with errors without it.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<b>Finally</b>, on my maven project i run Maven target "clean Install" to install all the dependencies and compile my source Java and Groovy code and i was ready to start rocking with Groovy…..That's all folks!!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-p3gR0w0OjG0/USjszL-_fjI/AAAAAAAAABs/y7Os6DXLUok/s1600/groovy1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="441" src="http://3.bp.blogspot.com/-p3gR0w0OjG0/USjszL-_fjI/AAAAAAAAABs/y7Os6DXLUok/s640/groovy1.jpg" title="Have a groovy day" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
</div>
Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-28861335593690416072013-01-14T14:40:00.000+02:002020-12-14T18:16:32.611+02:00Groovy up your test scripts<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://groovy.codehaus.org/images/groovy-logo-medium.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="102" src="http://groovy.codehaus.org/images/groovy-logo-medium.png" width="200" /></a></div>
<div style="text-align: left;">
After one and a half year of developing test scripts using java a
colleague in <a href="http://www.persado.com/" target="_blank">Persado</a> convinced me to give a shot to groovy. Playing
around for couple of weeks and there you are; I was convinced that
groovy would be the new exciting thing in my testing life. Taming my
excitement I decided to strategically replace blocks of java code
with groovy. The plan was not to replace code in page objects neither
test scripts but rather code in the supporting functions in
abstraction layers between the test scripts and the page objects.<br />
The decision in replacing the particular pieces of code was driven
by the way groovy handles Lists, Arrays and Maps. In addition the
effortless way of creating and using objects in a less wordy way than
java showed the way.<br />
Setting up groovy in my test environment was easy and I will show how in a feature post. With my environment ready and iron maiden in
my youtube I started. First stop an object creation to carry data to
a JMS dispatcher there you are.<br />
<br />
<pre class="prettyprint" style="text-align: left;">import org.joda.time.DateTime
class MyObject {
String myString;
List myList;
Date myDate;
}</pre>
<div align="LEFT" style="margin-bottom: 0in;">
<br /></div>
<div style="text-align: left;">
<div style="text-align: left;">
<span style="font-family: inherit;"><span style="font-size: small;"><span style="color: black;">kaboom
no setters no getters that simple how not to love the simplicity
especially if your are not a developer. </span></span>Now
lets use the object, fill it up with data.</span></div>
</div>
<br />
<pre class="prettyprint" style="text-align: left;">def rangeEvents = (11223300000 .. 11223300500).collect { it.toString()}
ldt = new DateTime()
def myObject = new MyObject(myList:rangeEvents,myString:"Hello",myDate:ldt);</pre>
<span style="color: black;"><br /></span>
<span style="color: black;"><b>Point 1</b>: The list kind was never declared in
the object definition.</span><br />
<div style="text-align: left;">
<span style="color: black;"><b>Point 2</b>: <span style="font-family: inherit;">Assignment is as easy as
</span></span><span style="background-color: yellow; font-family: inherit;">myList<span style="color: black;">:</span><span style="color: black;">rangeEvents</span></span></div>
<span style="font-size: small;"><span style="color: black;"><span style="font-family: inherit;"><b>Point
3</b>:</span><span style="font-family: Liberation Serif, serif;"> Ranges are Lists </span></span><span style="color: black; font-family: 'Liberation Serif', serif;">and each element of
the list can be manipulated by a single statement</span></span><br />
<span style="color: black;">“</span>list<span style="background-color: yellow; font-family: inherit;"><span style="color: black;"><b>.</b></span><span style="color: black;"><i><b>collect</b></i></span><span style="color: #1a1a1a;"><b>
</b></span><span style="color: black;"><b>{</b></span><span style="color: #1a1a1a;"><b>
</b></span><span style="color: #66ccff;"><b>it</b></span></span><span style="color: black;"><b><span style="background-color: yellow; font-family: inherit;">.toString()}</span><span style="font-family: 'Liberation Serif', serif; font-size: x-small;">”</span></b></span><br />
<span style="font-size: small;"><span style="color: black;"><b><span style="font-family: 'Liberation Serif', serif; font-size: x-small;"><br /></span></b></span></span>
<span style="font-family: inherit;"><span style="font-size: small;"><span style="color: black;">Of
course it is expected that there would be people asking why go with
groovy while I can do the same things with java ? Yes using groovy
will not </span><span style="color: black;">add extra arrows in your
quivers but it can simplify your code and save you a lot of extra
lines of code. Let me give you an example. </span></span>
</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">In
one of my tests I wanted to simulate the following scenario</span><br />
<span style="font-family: inherit;"><span style="color: black;"><br /></span></span>
<span style="font-family: inherit;"><span style="color: black;">“<span style="font-size: small;">There
are 200 people owning a cat, 300 owning a dog 140 owning a lion and
230 owning a tiger. From the </span><span style="color: black;">people
owning the cat I want 15 of them to sent a letter and likewise 63
letters from the dog owners 22 from the lion owners and 33 from the
tiger owners.” </span></span>
</span><br />
<span style="font-family: inherit;"><span style="color: black;"><span style="color: black;"><br /></span></span></span>
<span style="font-family: inherit;">
</span>
<span style="font-family: inherit;">The
code I had developed with java spanned in several lines</span>
<br />
<span style="font-family: inherit;"><br /></span>
<br />
<pre class="prettyprint" pre="pre">int catLetters=0;
String[] catOwners = new String[15];
int dogLetters=0;
String[] dogOwners = new String[63];
int lionLetters=0;
String[] lionOwners = new String[22];
int tigerLetters=0;
String[] tigerOwners = new String[33];
for (String data : petOwners) {
if (data.getOwner().equals(“cat”) && catLetters<15) {
catOwners[catLetters] = data.getOwnerName()
catLetters = catLetters + 1;
}
if (data.getOwner().equals(“dog”) && dogLetters<63) {
dogOwners[dogLetters] = data.getOwnerName()
dogLetters = dogLetters + 1;
}
if (data.getOwner().equals(“lion”) && lionLetters<22) {
lionOwners[lionLetters] = data.getOwnerName()
lionLetters = lionLetters + 1;
}
if (data.getOwner().equals(“tiger”) && tigerLetters<33) {
tigerOwners[tigetLetters] = data.getOwnerName()
tigetLetters = tigerLetters + 1;
}
}
</pre>
<br />
<div align="LEFT" style="margin-bottom: 0in;">
</div>
<div align="LEFT" style="margin-bottom: 0in;">
<span style="font-family: inherit;">Now
with groovy we can create a Map with owners and expected number of
letters lettersOwnersMap</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<pre class="prettyprint" pre="pre">def petOwnersList = []
requestedMessageResponses.each {
for(String data : petOwners){
if(lettersOwnersMap(it.key) && it.value>0){
petOwnersList.add(data.ownerName)
it.value--
}
}
}</pre>
</div>
<div align="LEFT" style="margin-bottom: 0in;">
<span style="font-family: inherit;"><br /></span></div>
<div align="LEFT" style="margin-bottom: 0in;">
</div>
<div align="LEFT" style="margin-bottom: 0in;">
<span style="font-family: inherit;"><b>Point
1:</b> With the java implementation the code is static meaning that if we
want to add a pet owner we need to add extra if statements. In the
groovy implementation we only need to add an extra map entry that
simple.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><b>Update: </b>In this post, check <a href="http://seleniumtestingworld.blogspot.com/2013/02/set-up-groovy-in-eclipse.html" target="_blank">how to integrate Groovy in your tests</a> while working with Eclipse.</span></div>
</div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-67449158910269500522013-01-11T10:50:00.000+02:002020-12-14T18:16:32.817+02:00Adding the Sizzle CSS Selector library in Webdriver<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://saucelabs.com/blog/wp-content/uploads/2011/01/sizzle.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="102" src="http://saucelabs.com/blog/wp-content/uploads/2011/01/sizzle.png" width="200" /></a></div>
Selenium Webdriver has a weird opinion on Sizzle. Although (correct me if wrong) in the older Selenium-RC Sizzle was extensively used, in Webdriver it is only injected if the browser does not support native css selectors (<a href="http://seleniumhq.org/docs/03_webdriver.jsp#by-css" rel="nofollow" target="_blank">see here</a>). This is a pain if you've learned to love Sizzle's ability to "extend" the normal CSS selector lingo with more advanced spices, and you're mainly working with Firefox, for which Webdriver uses native css.<br />
<br />
<h4 style="text-align: left;">
History</h4>
Some background: In our little "ecosystem", we have lots of Selenium-RC code. And when saying lots, we mean LOTS. We are actively thinking to (at some point) take most of it and write it using Webdriver API, but the Sizzle-Webdriver saga is getting in the way. Or better said, was getting in the way.<br />
<h4 style="text-align: left;">
Overriding Webdriver API</h4>
Webdriver uses the "By" class to encapsulate all possible ways of locating an element. This shows nice in your code, because you can have nice little snippets that make sense, e.g.
<br />
<pre class="prettyprint"><span style="font-size: small;">
ExpectedConditions
.visibilityOfElementLocated(
By.cssSelector(
"css=a.confirmation_link:not(.hidden)")) ;
</span></pre>
Of course, the above is a Sizzle CSS locator so it would not work in native CSS. Bummer.
Studying the Webdriver API for "By" (are you not? check <a href="http://code.google.com/p/selenium/source/browse/webdriver/trunk/common/src/java/org/openqa/selenium/By.java?r=7654" rel="nofollow" target="_blank">here</a>), we see the class itself is a holder for implementing classes of itself - a nice escape from the typical programming practices. We decided that this class should support Sizzle, and to do so, we extend it, initially to add our hook in it's <span style="font-family: Courier New, Courier, monospace;">cssSelector</span> method:<br />
<br />
<pre class="prettyprint"><span style="font-size: small;">public abstract class ByExtended extends By {
public static By cssSelector(final String selector) {
if (selector == null)
throw new IllegalArgumentException(
"Cannot find elements when the selector is null");
return new ByCssSelectorExtended(selector);
}
</span></pre>
</div>
<br />
See our <span style="font-family: Courier New, Courier, monospace;">ByCssSelectorExtended</span> ? (Yes, we're fond of large class names). We've basically extended the inner class inside <span style="font-family: Courier New, Courier, monospace;">By</span>, named <span style="font-family: Courier New, Courier, monospace;">ByCssSelector</span>, to do our magic. How? Well, basically we used the existing code, only to check if it actually matches something. The code has a nice "habit" of throwing an exception if it does not, so we cleverly "wrapped" it to do our biddings (for brevity, I only give you the code for the 1st method ;):<br />
<span style="font-size: x-small;">
</span><br />
<pre class="prettyprint"><span style="font-size: small;">public static class ByCssSelectorExtended extends ByCssSelector {
private String ownSelector;
public ByCssSelectorExtended(String selector) {
super(selector);
ownSelector = selector;
}
@Override
public WebElement findElement(SearchContext context) {
try {
if (context instanceof FindsByCssSelector) {
return ((FindsByCssSelector) context)
.findElementByCssSelector(ownSelector);
}
} catch (InvalidElementStateException e) {
return findElementBySizzleCss(ownSelector);
}
throw new WebDriverException(
"Driver does not support finding an element by selector: "
+ ownSelector);
}
// ... ommitted code ...
}</span></pre>
<br />
<div style="text-align: left;">
Key here is our use of <span style="font-family: Courier New, Courier, monospace;">InvalidElementStateException</span> - it is the exception thrown by Webdriver if the CSS cannot be located. We're not dealing with the other possibilities thus trying to make this extension function as the original in all other cases.<br />
<h4 style="text-align: left;">
Our solution</h4>
Hope you're not tired so far... here go the juicy parts:</div>
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>we want to try the <em>failed css locator</em> with Sizzle (you may want the opposite, <em>Sizzle first then native CSS</em>)</li>
<li>we want to check if Sizzle exists in the page, if not inject Sizzle so this may work</li>
<li>finally, we want to try via Sizzle the failed css locator.</li>
</ul>
<div>
To do so, we want two helpers: <span style="font-family: Courier New, Courier, monospace;">isSizzleLoaded()</span> and <span style="font-family: Courier New, Courier, monospace;">injectSizzleIfNeeded()</span>, both using the Webdriver API to execute stuff via the JavascriptExecutor. I leave these to the readers' imagination and <a href="https://www.google.com/search?q=injectsizzleifneeded" rel="nofollow" target="_blank">Google Search</a>. Having those, the method <span style="font-family: Courier New, Courier, monospace;">findElementBySizzleCss</span> is as simple as:</div>
<div>
<span style="font-size: x-small;">
</span>
<br />
<pre class="prettyprint"><span style="font-size: small;">public WebElement findElementBySizzleCss(String cssLocator) {
injectSizzleIfNeeded();
String javascriptExpression = "return Sizzle(\"" +cssLocator + "\")";
List<webelement> elements = (List<webelement>)
((JavascriptExecutor) getDriver())
.executeScript(javascriptExpression);
if (elements.size() > 0)
return (WebElement) elements.get(0);
return null;
}
</webelement></webelement></span></pre>
</div>
<div>
<br /></div>
<div>
In conclusion, going back to our original example, here it is using our "Extended" version of By:<br />
<pre class="prettyprint"><span style="font-size: small;">
ExpectedConditions
.visibilityOfElementLocated(
ByExtended.cssSelector(
"css=a.confirmation_link:not(.hidden)")) ;
</span>
</pre>
And that's it. Voila!
<br />
<h4 style="text-align: left;">
Afterthoughts</h4>
We have given an example of how to override the default Webdriver behaviour towards locators - we are using this as part of our greater API that unifies Webdriver and Selenium-RC to produce a global/common access API for our QA/developers. For the specific "extension", we have created a "wrapper" function that hides our extending of <span style="font-family: Courier New, Courier, monospace;">By</span>; all our locators go through that. This is another pattern we generally use - more on that on a subsequent post. Off for now...<br />
<br />
<u style="background-color: white; font-weight: bold; line-height: 20px;">UPDATE:</u><span style="background-color: white; line-height: 20px;"> We have released our API as open source! Check </span><a href="http://seleniumtestingworld.blogspot.com/2013/04/stevia-is-released.html" style="background-color: white; border: 0px; line-height: 20px; margin: 0px; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">here</a><span style="background-color: white; line-height: 20px;"> and </span><a href="https://github.com/persado/stevia" style="background-color: white; border: 0px; line-height: 20px; margin: 0px; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">on GitHub!</a> The full solution is there for you to find!<br />
<br />
<b><u>UPDATE #2:</u> </b>The By* extensibility for Sizzle seems very popular! To keep you up to date, our current 0.61.0-SNAPSHOT of <a href="https://github.com/persado/stevia" target="_blank">Stevia</a> now contains a very important fix for our method:<br />
It was discovered by our users that when a wrong Sizzle selector is provided (one that is syntactically wrong) the Sizzle engine returns <i>null</i>. However, when trying to log this via an exception logger, Webdriver receives an NPE trying to output which selector and type was used; we never did set this up! The exception logged is the NPE and not the actual exception about the missing/deformed selector, causing confusion. To fix this, we went as true commandos, since the API was protected.<br />
<pre class="prettyprint"><span style="font-size: small;">
private void fixLocator(SearchContext context, String cssLocator,
WebElement element) {
if (element instanceof RemoteWebElement)
try {
Class[] parameterTypes = new Class[] { SearchContext.class,
String.class, String.class };
Method m = element.getClass().getDeclaredMethod(
"setFoundBy", parameterTypes);
m.setAccessible(true);
Object[] parameters = new Object[] { context,
"css selector", cssLocator };
m.invoke(element, parameters);
} catch (Exception fail) {
//NOOP Would like to log here?
}
}
</span></pre>
<br />
As you can see from the extract of code above, we have to modify the accessibility of "setFoundBy" so we can invoke it. After we do that, the call (using the <a href="http://docs.oracle.com/javase/tutorial/reflect/" rel="nofollow" target="_blank">Reflection API</a>) will succeed and hence, no NPE anymore. Enjoy!!! - The actual commit is over <a href="https://github.com/persado/stevia/commit/918ebc75b64c671efeb54e53d24ebbecda9e2fa7" target="_blank">here</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://smashmaterials.com/wp-content/uploads/2012/12/Merry-Christmas-Happy-New-Year-2013-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="http://smashmaterials.com/wp-content/uploads/2012/12/Merry-Christmas-Happy-New-Year-2013-1.png" width="400" /></a></div>
<br />
<br /></div>
</div>
asymmetrisimohttp://www.blogger.com/profile/11868065515856086948noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-7954281199161124852013-01-01T23:56:00.000+02:002020-12-14T18:16:33.023+02:00Missing Page Factories in Selenium RC ? Autowire<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://saucelabs.com/blog/wp-content/uploads/2011/01/sizzle.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="102" src="data:image/jpeg;base64,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" width="200" /></a></div>
<div style="text-align: left;">
One of the new features introduced in selenium 2 was the usage of the <b><a href="http://code.google.com/p/selenium/wiki/PageFactory" target="_blank">page factories</a></b> to easily instantiate a page object. For those who still use selenium and want to have a feature as the aforementioned one the solution is to use the spring source autowire functionality.</div>
<div style="text-align: left;">
<br /></div>
<div>
Although spring is a powerful framework for java enterprise development, testers that are usually not familiar with the dependency injection model seem to avoid it. The usage of the <a href="http://www.springsource.org/">spring source</a> Autowire feature can help to instantiate your page objects in an easy and efficient way.
<br />
<br /></div>
<div>
In order to start Autowire you need to declare the instantiated a bean (page object) to <span style="font-family: inherit;">src/test/resources/applicationContext-test.xml as follows:</span></div>
<div>
<span style="background-color: white; color: #242021; font-family: Georgia, 'Adobe Garamond Pro', 'Apple Garamond', 'ITC Garamond', 'Times New Roman', Times, serif;"><br /></span></div>
<pre class="prettyprint"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<span class="Apple-tab-span" style="white-space: pre;"> </span><context:annotation-config />
<span class="Apple-tab-span" style="white-space: pre;"> </span><context:property-placeholder location="classpath:mcs-config.properties" ignore-resource-not-found="true" system-properties-mode="OVERRIDE" />
<span class="Apple-tab-span" style="white-space: pre;"> </span><bean id="firstPageObject" class="com.mycompany.FirstPageObject"/>
</beans></span>
</pre>
After the bean has been declared just use the Autowire annotation inside the script to instantiate the page object<br />
<pre class="prettyprint">@Autowire
FirstPageObject firstPageObject
</pre>
Likewise for actions resulting to new page objects (click, select) introduce a method returning the resulting page object and Autowire the resulting page object
<br />
<pre class="prettyprint">public FirstPageObject myMethod(){
return firstPageObject;
}
</pre>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-38744906734947207062011-10-29T00:34:00.000+03:002020-12-14T18:16:33.230+02:00Maintainability 101<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">
</span>
<br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">
One of the biggest problem in the
automation script development is the script maintenance. Even that
there are a lot of widely accepted development methods for improving
script maintenance, there are misconceptions that can easily direct
testers in writing unmaintainable scripts.</span>
<br />
<br />
The most popular methods in
developing maintainable test code is the Page Objects pattern.
Although using the Page Objects pattern will lead in a more
maintainable code, the misuse of the pattern will only result in no
more than adding an abstraction layer between the page under test and
the test script each self. The misunderstandings in applying the
pattern in order to create more maintainable test scripts come in the
usage of the objects locators. The proper usage of the objects
locators would result in the preferred maintainability and not the
usage of the pattern. Taking into account that our object locators
are locally declared (I totally agree with the analysis of <a href="http://element34.ca/about/adam">Adam
Goucher</a> in his post
<a href="http://element34.ca/blog/the-great-locator-location-debate">http://element34.ca/blog/the-great-locator-location-debate</a>)
a poorly implementation of the pattern could result in using the page
locator in more than one place inside the page object. For example
having an input field for which we need to implement an object method
to type in a value and an object method to read the inputed value we
should use a locally declared locator as a static string instead of
having a locator declaration in each method.
<pre class="prettyprint">public void typeInputValue(Stringvalue){ <br/> selenium.type(“//input[@name='x']”);<br/>} <br/><br/>public void readInputValue(){ <br/> selenium.getValue(“//input[@name='x']”); <br/>}
</pre>
<pre class="prettyprint">
public static final MY_LOCATOR=”//input[@name='x']”;<br/><br/>public void typeInputValue(String value){ <br/> selenium.type(MY_LOCATOR); <br/>} <br/><br/>public void readInputValue(){ <br/> selenium.getValue(MY_LOCATOR); <br/>}
</pre>
In the first example a change in the
objects locator would result in updating the object in to two places
inside the page object rather than in one place as shown in the
second example.
<br />
One of the goals in test script
development is to make our test code more robust in locator
breakages. As easily understood the single appearance of object
locators in the page objects leads us toward this goal.
<br />
At this point I would like to thank
Adam Goucher for his wonderful and extremely useful posts regarding
test automation. For all it worth I would like to say that his posts
lead the way in changing our test scripts to a more robust more
maintainable test scripts.
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-44138601055320798472011-10-01T23:59:00.000+03:002020-12-14T18:16:33.436+02:00Selenium WaitFor ...<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: inherit;">One of the most difficult problems to overcome when developing automated test scripts is time synchronization. Black box testing is based on expecting specific results upon a specific user actions irrespectively of time. Thus the big question that comes in mind is “when to expect the results?” are the results produced instantly or it takes some time depending on the system load?</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">One of the solutions presented, is using the time delay available to the programming language used for the test script development. Using Selenium with Java Thread.sleep(“3000”); will do the job. But is this effective? If you are developing automated test scripts for small scale projects and time is not an issue maybe this is your solution; but its advisable to use time delays large enough to account for system slow downs under load.</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">In large scale projects static time delays are inefficient. Think the amount of time wasted when hundreds of scripts, having static time delays, are executed. For these cases the solution to time waiting problem is to use a dynamic waiting period. Dynamic waiting period is the time duration until the system reacts. Testing a web application the reaction of the system would be a page loading. For these cases selenium.WaitForPageToLoad(“3000”); comes in handy. Using WaitForPageToLoad command insures that the system reacts before results verification. Again in this process it is critical to allow large amount of delays to account for system slow downs due to overloading. In our tests it was observed that sometimes a page would load in 10 seconds and under load the page loading could take up to 1 minute, so we adjusted time delays to the observed maximum. The debate in using the WaitForPageToLoad method is what is an acceptable waiting period for a page to load? Is it 1 ,2 ,3 minutes? In debates like that I always like to consider the criticality of the system and the defined requirements for the time responses. In non critical systems with no time requirements defined, it is acceptable to use large delay times (do what you can for the functional tests to complete and the performance tests will optimize the system to react faster under load). In critical systems usually time reaction requirement are well defined so time delays can be extracted through them.</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">But what happens in systems implemented with Ajax were elements are dynamically refreshed without a page loading? Then the selenium.WaitForPageToLoad(“3000”); it is to no use. In these cases prefer to use the selenium.waitForCondition(); command. When I came up to this situation most of the examples I found to help me were referring me in using JavaScript with the WaitForCondition command. Although this was feasible, using Javascript would have increased the difficulty scale of test script development (taking into account that testers are not required to be experienced programmers) I preferred staying to selenium commands and Xpath references to find dynamically refreshed elements. In some cases I replaced the selenium.WaitForPageToLoad(“3000”); with the WaitForCondition statement in order to have more control into what I am expecting to be loaded.</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">So a selenium.WaitForPageToLoad(“3000”); can be replaced by</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<pre class="prettyprint"><span style="font-family: inherit;">selenium.waitForCondition("selenium.browserbot.getCurrentWindow().document.getElementById('page-heading').innerHTML='New Offer'","10000");</span></pre>
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">In the above example the waiting condition is specifying which page load to expect according to the page heading. Obviously using the WaitForPageToLoad statement could result in navigating to the wrong page something that could be avoided using the WaitForCondition statement.</span><br />
<span style="font-family: inherit;">In the above WaitForCondition example I used the DOM to access the page heading and in the following example I will show how to use the WaitForCondition using the Xpath</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<pre class="prettyprint"><span style="font-family: inherit;">selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='cboxContent']\");", "10000");</span></pre>
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">In the above example we wait until an element is present (The element's Xpath is specified by the id).</span><br />
<span style="font-family: inherit;"><br /></span><span style="font-family: inherit;">In conclusion WaitForCondition offers better control over the aforementioned solutions controlling what to expect and when thus resulting in test robustness.</span><br />
<br /></div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-15354747987539433932011-09-24T15:54:00.002+03:002020-12-14T18:16:33.643+02:00TestNG vs Junit<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<title></title>
</div>
<br />
<div style="margin-bottom: 0in;">
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">When
I start setting up the test environment for the functional tests I
decided to use Selenium RC. The development of the test scripts was
decided to be made in Java and the obvious choice for the testing
framework was the Junit. After couple of months in development it
came to my attention that there was another testing framework that
offered more choices than Junit was. The test framework was TestNG
and the decision for switching the framework was made after
considering two major factors. The first factor was the adaptation of
the existing test scripts to the new framework and the second factor
was the flexibility the new framework offered over Junit.</span></div>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">
</span>
<div style="margin-bottom: 0in;">
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><br /></span></div>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">
</span>
<div style="margin-bottom: 0in;">
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">The
migration to the new framework was a breeze using the eclipse TestNG
pluging refactoring support. The Junit assertions were resolved by
importing <span style="color: red;"><span style="font-style: normal;"><span style="font-weight: normal;">org.testng.AssertJUnit.*;</span></span></span>
making the transition effortless.</span></div>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;">
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
As explained above the decision for changing the frameworks was based on
the flexibility TestNG offered over Junit. For starters the big
difference between the testing frameworks is the purpose designed
for. Junit was designed for unit testing while TestNG for high level
testing. In that sense the capabilities TestNG offers are more
aligned to the needs of a functional tester that the needs of an
application developer. To make things more clear lets see some of the
capabilities TestNG offers that Junit doesn't.</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
One of the capabilities TestNG offers is the parametric testing. With
this capability placing a parameter in the testng.xml file makes the
parameter reusable in the test scripts. This capability come handy to
our test team in parameterizing the time delay in the
selenium.WaitForPageToLoad(“1000”) statements used in the test
scripts. With the parametrization of the time delay it became easy to
adjust the time delays by changing a file in seconds.
</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
Another capability of the TestNG that Junit does not have is the capability
to rerun failed tests. Although I have not used this capability yet,
it is pretty obvious that if you have a test suite taking hours to
execute; its time saving to rerun only failed tests without
re-executing the suite.</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
One
the TestNG capabilities extensively used in our test cases is the
capability to depend test steps on other test step. In this way when
one of the dependencies fail then the tests depending on the failed
one are marked as skipped and not as failed. In this case by making
our test steps dependent on the preconditions (@Beforelass) we bind
the tests to the preconditions. In this way we know that if one of
the preconditions fail the test is not considered failed but skipped.</div>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
TestNG
is an easy to install and use testing framework. You can use it with
Eclipse and lately with Netbeans. Documentation can be found at: <a href="http://testng.org/">http://testng.org/</a></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
To
generate nice reports you can use ReportNG you can find more
information on setting up and using ReportNG to the following:</div>
<div style="margin-bottom: 0in;">
<a href="http://reportng.uncommons.org/">http://reportng.uncommons.org/</a></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
For
maven users there is a blog by <a href="http://solidsoft.wordpress.com/2011/01/23/better-looking-html-test-reports-for-testng-with-reportng-maven-guide/" target="_top">Marcin
Zajączkowski</a> explaining how to setup reportng using maven.</div>
</span>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.comtag:blogger.com,1999:blog-5794697149014008339.post-21239302799729712122011-09-18T22:49:00.001+03:002020-12-14T18:16:33.850+02:00Selenium IDE vs Selenium RC<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Verdana, sans-serif;">Starting the road trip to the world of automation testing, the choices of testing tools are limitless. One of the most popular and widely used tools for web application testing is the Selenium Suite.</span><br />
<div style="font-family: Verdana,sans-serif; margin: 0cm;">
<span lang="EN-US">Couple of the options the Selenium suite offers for testing, is the Selenium IDE and the Selenium Resource Control (RC). Both options have pros and cons and it is up to one needs to decide which one to use. <o:p></o:p></span></div>
<div style="font-family: Verdana,sans-serif; margin: 0cm;">
<span lang="EN-US">One of the major disadvantages of the IDE is that only it works for Firefox, that is if you need to test for multiple browsers this is clearly not your choice.<o:p></o:p></span></div>
<div style="font-family: Verdana,sans-serif; margin: 0cm;">
<span lang="EN-US">A second major drawback of IDE is that the recorded scripts are easily maintainable for small scale projects but impossible to maintain in big ones. One of the major advantages of the IDE is that it is easily usable by non-technical personnel the simplicity of recording and replaying scenarios is an appealing choice for small scale projects.<span class="apple-converted-space"> <o:p></o:p></span></span></div>
<div style="font-family: Verdana,sans-serif;">
<span class="apple-converted-space"><span lang="EN-US" style="line-height: 115%;">In this blog I will explore the Selenium RC ways for testing large scale web applications. I will present techniques for implementing test scripts and I will pass my experience for avoiding common mistakes. The experiences I will share with you are real life ones gained in participating in various test teams.</span></span></div>
</div>
Georgios Kogketsofhttp://www.blogger.com/profile/08881500595379291825noreply@blogger.com