Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
RichFaces – Testing on Mobile Devices Pavol Pitoňák Quality Assurance Engineer, Red Hat 17 Feb 2012
Why Are We Doing This? <ul><li>canalys.com </li></ul>
 
Testing a Java Web Application <ul><li>Build archive
Start a container
Deploy archive
Open web browser
Run tests (continuously)
Review test results </li></ul>
RichRates <ul><li>github.com/qa/richrates
richrates-ppitonak.rhcloud.com </li></ul>
<ul>richrates-ppitonak.rhcloud.com </ul>
<ul>richrates-ppitonak.rhcloud.com </ul>
<ul>richrates-ppitonak.rhcloud.com </ul>
<ul>richrates-ppitonak.rhcloud.com </ul>
<ul>richrates-ppitonak.rhcloud.com </ul>
Project Structure <ul><li>Standard Maven structure
testng.xml
testng-ftest.xml
testng-all.xml </li></ul>
Running Unit Tests <ul>mvn clean package testng.xml </ul>
Running Functional Tests <ul>mvn clean package -P jbossas-managed-71,ftest testng-ftest.xml </ul>
Running All Tests <ul>mvn clean package -P jbossas-managed-71,all-tests testng-all.xml </ul>
Sample Unit Test <ul>public class UAgentInfoTest { <li>@Test
public void testIPad() {
Assert.assertTrue(...);
}
} </li></ul>
Sample Arquillian Test <ul>public class SkinBeanTest extends Arquillian { <li>@Inject private SkinBean skinBean;
@Deployment
public static JavaArchive createTestArchive() {
return ...;
}
@Test
public void testDefaultSkin() {
Assert.assertEquals(skinBean.getSkin(), &quot;blueSky&quot;);
}
} </li></ul>
Sample WebDriver Test public class SampleTest extends Arquillian { @Drone public WebDriver driver; @ArquillianResource pri...
Deployment <ul><li>@Deployment(testable = false)
public static WebArchive createTestArchive() {
WebArchive war = ShrinkWrap.createFromZipFile(WebArchive.class, new File(&quot;target/richrates.war&quot;));
}
... or construct the WAR yourself :) </li></ul>
Deployment <ul><li>@Deployment(testable = false)
public static WebArchive createTestArchive() {
WebArchive war = ShrinkWrap.createFromZipFile(WebArchive.class, new File(&quot;target/richrates.war&quot;));
}
... or construct the WAR yourself :) </li></ul>
Deployment 2 <ul><li>@Deployment(testable = false)
public static WebArchive createTestArchive() {
MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class).loadMetadataFromPom( &quot;pom.x...
WebArchive war = ShrinkWrap.create(WebArchive.class, &quot;richrates.war&quot;);
Nächste SlideShare
Wird geladen in …5
×

RichFaces - Testing on Mobile Devices

Slides from my talk on Red Hat Developer Conference 2012 in Brno.

Ähnliche Bücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Ähnliche Hörbücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

RichFaces - Testing on Mobile Devices

  1. RichFaces – Testing on Mobile Devices Pavol Pitoňák Quality Assurance Engineer, Red Hat 17 Feb 2012
  2. Why Are We Doing This? <ul><li>canalys.com </li></ul>
  3.  
  4. Testing a Java Web Application <ul><li>Build archive
  5. Start a container
  6. Deploy archive
  7. Open web browser
  8. Run tests (continuously)
  9. Review test results </li></ul>
  10. RichRates <ul><li>github.com/qa/richrates
  11. richrates-ppitonak.rhcloud.com </li></ul>
  12. <ul>richrates-ppitonak.rhcloud.com </ul>
  13. <ul>richrates-ppitonak.rhcloud.com </ul>
  14. <ul>richrates-ppitonak.rhcloud.com </ul>
  15. <ul>richrates-ppitonak.rhcloud.com </ul>
  16. <ul>richrates-ppitonak.rhcloud.com </ul>
  17. Project Structure <ul><li>Standard Maven structure
  18. testng.xml
  19. testng-ftest.xml
  20. testng-all.xml </li></ul>
  21. Running Unit Tests <ul>mvn clean package testng.xml </ul>
  22. Running Functional Tests <ul>mvn clean package -P jbossas-managed-71,ftest testng-ftest.xml </ul>
  23. Running All Tests <ul>mvn clean package -P jbossas-managed-71,all-tests testng-all.xml </ul>
  24. Sample Unit Test <ul>public class UAgentInfoTest { <li>@Test
  25. public void testIPad() {
  26. Assert.assertTrue(...);
  27. }
  28. } </li></ul>
  29. Sample Arquillian Test <ul>public class SkinBeanTest extends Arquillian { <li>@Inject private SkinBean skinBean;
  30. @Deployment
  31. public static JavaArchive createTestArchive() {
  32. return ...;
  33. }
  34. @Test
  35. public void testDefaultSkin() {
  36. Assert.assertEquals(skinBean.getSkin(), &quot;blueSky&quot;);
  37. }
  38. } </li></ul>
  39. Sample WebDriver Test public class SampleTest extends Arquillian { @Drone public WebDriver driver; @ArquillianResource private URL deployedRoot; @Deployment public static WebArchive createTestArchive() { return ...; } @Test public void testDefaultSkin() { driver.get(“http://devconf.cz”); ... } }
  40. Deployment <ul><li>@Deployment(testable = false)
  41. public static WebArchive createTestArchive() {
  42. WebArchive war = ShrinkWrap.createFromZipFile(WebArchive.class, new File(&quot;target/richrates.war&quot;));
  43. }
  44. ... or construct the WAR yourself :) </li></ul>
  45. Deployment <ul><li>@Deployment(testable = false)
  46. public static WebArchive createTestArchive() {
  47. WebArchive war = ShrinkWrap.createFromZipFile(WebArchive.class, new File(&quot;target/richrates.war&quot;));
  48. }
  49. ... or construct the WAR yourself :) </li></ul>
  50. Deployment 2 <ul><li>@Deployment(testable = false)
  51. public static WebArchive createTestArchive() {
  52. MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class).loadMetadataFromPom( &quot;pom.xml&quot;);
  53. WebArchive war = ShrinkWrap.create(WebArchive.class, &quot;richrates.war&quot;);
  54. war.addPackage(&quot;org.richfaces.examples.richrates&quot;);
  55. war.addPackage(&quot;org.richfaces.examples.richrates.annotation&quot;);
  56. war.addPackages(true, &quot;org.slf4j&quot;);
  57. war.merge(ShrinkWrap.create(ExplodedImporter.class, &quot;tmp1.war&quot;).importDirectory(&quot;src/main/webapp&quot;).as(WebArchive.class));
  58. war.merge(ShrinkWrap.create(ExplodedImporter.class, &quot;tmp2.war&quot;).importDirectory(&quot;src/main/resources&quot;).as(WebArchive.class), &quot;WEB-INF/classes&quot;);
  59. war.addAsLibraries(resolver.artifact(&quot;org.richfaces.ui:richfaces-components-ui&quot;).resolveAsFiles());
  60. war.addAsLibraries(resolver.artifact(&quot;org.richfaces.core:richfaces-core-impl&quot;).resolveAsFiles());
  61. war.addAsLibraries(resolver.artifact(&quot;org.jdom:jdom&quot;).resolveAsFiles());
  62. war.addAsLibraries(resolver.artifact(&quot;joda-time:joda-time&quot;).resolveAsFiles());
  63. return war;
  64. } </li></ul>
  65. Arquillian.xml <ul><li><extension qualifier=&quot;webdriver&quot;>
  66. <property name=&quot;implementationClass&quot;> org.openqa.selenium.firefox.FirefoxDriver </property>
  67. </extension>
  68. -Darquillian.browser.implementation.class=... </li></ul>
  69. Arquillian.xml <ul><li>Define your containers
  70. Maven profiles </li></ul>
  71. Sample WebDriver Test public class SampleTest extends Arquillian { @Drone public WebDriver driver; @ArquillianResource private URL deployedRoot; @Deployment public static WebArchive createTestArchive() { return ...; } @Test public void testDefaultSkin() { driver.get(“http://devconf.cz”); ... } }
  72. Page Factory <ul><li>@Test
  73. public void googleSearchTest {
  74. WebDriver driver = ...
  75. driver.get(&quot;http://www.google.com/&quot;);
  76. GoogleSearchPage page = PageFactory.initElements(driver,GoogleSearchPage.class);
  77. page.searchFor(&quot;Cheese&quot;);
  78. } </li></ul>
  79. <ul>Page Factory </ul>
  80. Page Object <ul><li>public class CalculatorPage extends AbstractPage {
  81. @FindBy(id = &quot;calculator:amount&quot;)
  82. private WebElement amountInput;
  83. @FindBy(xpath = &quot;//div[contains(@class, 'result')]&quot;)
  84. private WebElement resultOutput;
  85. @FindBy(id = &quot;calculator:calculateButton&quot;)
  86. private WebElement submitButton;
  87. ...
  88. } </li></ul>
  89. Mobile Web Testing <ul><li>Almost no changes in Arquillian config
  90. Android 1.x not supported
  91. Android 2.x – phones
  92. Android 3.x – tablets
  93. Android 4.x – phones and tablets
  94. Physical device vs. emulator </li></ul>
  95. Physical Devices <ul><li>Windows – install USB drivers
  96. Linux – set up udev
  97. Mac OS X – no setup needed </li></ul>
  98. Android Emulator <ul><li>Part of Android Software Development Kit
  99. Android 1.5 – 4.0.3
  100. <sdk_path>/tools/android
  101. Eclipse plugins </li></ul>
  102. Emulators <ul><li>2.2 </li><ul><li>Relatively fast
  103. Works with selenium-server 2.6 </li></ul><li>2.3 </li><ul><li>Unreliable </li></ul><li>3.x </li><ul><li>Slow </li></ul><li>4.x </li><ul><li>Relatively fast
  104. Works well with newest Selenium </li></ul></ul>
  105. Demo Creating and launching a new emulator
  106. Android-x86 Project <ul><li>www.android-x86.org
  107. Project porting Android to x86 platform </li></ul>
  108. Demo Launching Android in VirtualBox
  109. AndroidDriver Config <ul><li><extension qualifier=&quot;webdriver&quot;>
  110. <property name=&quot;implementationClass&quot;> org.openqa.selenium.android.AndroidDriver </property>
  111. <property name=&quot;remoteAddress&quot;>
  112. http://localhost:4444/wd/hub
  113. </property>
  114. </extension> </li></ul>
  115. Emulator Configuration <ul><li>Install android-server.apk
  116. Launch WebDriver application in emulator
  117. platform-tools/adb forward tcp:4444 tcp:8080
  118. Use 10.0.2.2 for host's localhost </li></ul>
  119. VirtualBox Configuration <ul><li>Set up network
  120. platform-tools/adb connect <android_ip>
  121. Install android-server.apk
  122. Launch WebDriver application in emulator
  123. platform-tools/adb forward tcp:4444 tcp:8080
  124. Tests need server IP address </li></ul>
  125. Demo Tests running with Firefox, Android emulator and Android-x86
  126. Fast, Faster, Fastest
  127. Eclipse <ul><li>Plugins </li><ul><li>Android
  128. JBoss Tools
  129. m2e
  130. TestNG </li></ul><li>Supports both emulator and Android-x86 </li></ul>
  131. Demo Running tests in Eclipse
  132. Debugging <ul><li>You already know how :) </li></ul>
  133. Demo Debugging
  134. Arquillian Android Extension <ul><li>github.com/kpiwko/arquillian-extenstion-android
  135. Hot news!
  136. Create emulator
  137. Start emulator
  138. Install Android server
  139. Start Android server
  140. Can connect to real device </li></ul>
  141. Console Logging Listener <ul><li>Usual console log: </li></ul>
  142. Console Logging Listener <ul><li>Our console log: </li></ul><ul><li>[10:47:54] STARTED: ftest.ExchangeRatesTest.testInit()
  143. [10:47:54] SUCCESS: ftest.ExchangeRatesTest.testInit()
  144. [10:47:55] STARTED: ftest.ExchangeRatesTest.testNextAndPrevious()
  145. [10:47:57] SUCCESS: ftest.ExchangeRatesTest.testNextAndPrevious()
  146. [10:48:09] STARTED: ftest.CalculatorTest.testCalculate()
  147. [10:48:12] SUCCESS: ftest.CalculatorTest.testCalculate() </li></ul>
  148. Console Logging Listener <ul><li>Register in pom.xml or in test class </li></ul><ul><li>@Listeners(ConsoleStatusTestListener.class)
  149. public abstract class AbstractWebDriverTest<P extends Page> extends Arquillian {
  150. ...
  151. } </li></ul>
  152. Screenshot on Failure <ul><li>@AfterMethod(alwaysRun = true, groups = &quot;arquillian&quot;)
  153. public void handleTestError(ITestResult result) {
  154. if (result.getStatus() == ITestResult.SUCCESS) {
  155. return;
  156. }
  157. ...
  158. File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
  159. FileUtils.copyFile(scrFile, imageOutputFile);
  160. } </li></ul>
  161. Jenkins Android Plugin
  162. Jenkins Android Plugin
  163. Mobile Browser Simulator <ul><li>JBoss Tools 3.3 M5
  164. Simulates mobile phones and tablets
  165. Perfect for layout testing
  166. Not for automation </li></ul>
  167. Mobile Browser Simulator
  168. Conclusion <ul><li>Arquillian + Selenium 2
  169. Run from console and Eclipse
  170. How to create Android emulator
  171. Android-x86
  172. Emulator snapshots
  173. ID locators, Xpath locators, CSS locators </li></ul>
  174. [email_address] @ppitonak jboss.org/richfaces Q/A

×