{"id":300,"date":"2010-08-03T03:30:50","date_gmt":"2010-08-03T10:30:50","guid":{"rendered":"http:\/\/wiebe-elsinga.com\/blog\/?p=300"},"modified":"2011-10-20T21:16:58","modified_gmt":"2011-10-21T04:16:58","slug":"automatic-testing-for-android-applications","status":"publish","type":"post","link":"http:\/\/wiebe-elsinga.com\/blog\/automatic-testing-for-android-applications\/","title":{"rendered":"How-To: Automatic testing for Android Applications"},"content":{"rendered":"<div class=\"wpsso-pinterest-pin-it-image\" style=\"display:none !important;\">\n<\/div><!-- .wpsso-pinterest-pin-it-image -->\n\n<p>After setting up your <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=259\">Android development environment<\/a>, and <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=275\">Developing an Android Application<\/a> it\u2019s time to set-up a automatic Android Test environment. The steps to achieve this are:<\/p>\n<ul>\n<li>Choose a test technique.<\/li>\n<li>Creating a test project.<\/li>\n<li>Make the test.<\/li>\n<li>Run the test.<\/li>\n<\/ul>\n<p>I will use the Android application which was developed inside my <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=275\">previous post<\/a>.<\/p>\n<p><strong>[Update 15-03-2011]<\/strong> Updated to Android 2.3.3.<br \/>\n<strong>[Update 15-03-2011]<\/strong> Updated to Robotium 2.2.<br \/>\n<!--more--><\/p>\n<h2>Choose a test technique<\/h2>\n<p>There are different techniques you can use to test Android applications. The most commonly known is by way of JUnit. JUnit is used to test the technical quality of applications. But what about the testing the functional use of  a application, like you would do it with Selenium for web application. For Android applications there is a similar tool for testing called <a href=\"http:\/\/code.google.com\/p\/robotium\/\">Robotium<\/a>. It is a UI testing tool which simulates touching, clicks, typing, and other users&#8217; actions relevant for Android applications. In this example I will be using <a href=\"http:\/\/code.google.com\/p\/robotium\/\">Robotium<\/a>.<\/p>\n<h2>Creating a test project<a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/testProject.gif\"><img loading=\"lazy\" class=\"alignright size-thumbnail wp-image-301\" title=\"testProject\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/testProject-150x150.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><\/h2>\n<ol>\n<li>From within Eclipse select <strong>File<\/strong> menu, <strong>New<\/strong> and <strong>Other<\/strong>.<\/li>\n<li>Choose <strong>Android Test Project<\/strong> inside the <strong>Android<\/strong> folder.<\/li>\n<li>Provide the information about the Android Test project and click <strong>Next<\/strong>.<\/li>\n<li>Press <strong>Finish<\/strong>. You should see the following directory structure<\/li>\n<\/ol>\n<p><a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/testFiles.gif\"><img loading=\"lazy\" class=\"alignnone size-thumbnail wp-image-302\" title=\"testFiles\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/testFiles-150x150.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><\/p>\n<p>Because I will be creating a Robotium test, I must provide the <a href=\"http:\/\/code.google.com\/p\/robotium\/downloads\/detail?name=robotium-solo-2.2.jar&amp;can=2&amp;q=\">robotium-solo-2.2.jar<\/a> as library.<\/p>\n<h2>Make the test<a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/TestCase.gif\"><img loading=\"lazy\" class=\"alignright size-thumbnail wp-image-304\" title=\"TestCase\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/TestCase-150x150.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><\/h2>\n<ol>\n<li>From within Eclipse select <strong>File<\/strong> menu, <strong>New<\/strong> and <strong>JUnit Test Case<\/strong>.<\/li>\n<li>Provide the information about the Junit Test Case and click <strong>Finish<\/strong>.<\/li>\n<li>Change <em>MainTest.java<\/em> to the following<\/li>\n<\/ol>\n<p><\/p>\n<div class=\"codecolorer-container java default\" style=\"overflow:auto;white-space:nowrap;width:100%;height:100%;\"><div class=\"java codecolorer\"><span class=\"kw1\">package<\/span> <span class=\"co2\">com.my<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.ArrayList<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">com.jayway.android.robotium.solo.Solo<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">android.app.Activity<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">android.test.ActivityInstrumentationTestCase2<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"co2\">android.widget.TextView<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> MainTest <span class=\"kw1\">extends<\/span> ActivityInstrumentationTestCase2 <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">private<\/span> Solo solo<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">private<\/span> Activity activity<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">public<\/span> MainTest<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">super<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;com.my&quot;<\/span>, Main.<span class=\"kw1\">class<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n@Override<br \/>\n<span class=\"kw1\">protected<\/span> <span class=\"kw4\">void<\/span> setUp<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">super<\/span>.<span class=\"me1\">setUp<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">activity<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">getActivity<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> Solo<span class=\"br0\">&#40;<\/span>getInstrumentation<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>, <span class=\"kw1\">this<\/span>.<span class=\"me1\">activity<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n@Override<br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">void<\/span> tearDown<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">try<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span>.<span class=\"me1\">finalize<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span> <span class=\"kw1\">catch<\/span> <span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+throwable\"><span class=\"kw3\">Throwable<\/span><\/a> e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\ne.<span class=\"me1\">printStackTrace<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">activity<\/span>.<span class=\"me1\">finish<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">super<\/span>.<span class=\"me1\">tearDown<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"co3\">\/**<br \/>\n* @throws Exception Exception<br \/>\n*\/<\/span><br \/>\n<span class=\"kw1\">public<\/span> <span class=\"kw4\">void<\/span> testDisplay<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">throws<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+exception\"><span class=\"kw3\">Exception<\/span><\/a> <span class=\"br0\">&#123;<\/span><br \/>\n<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a> text <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Congratulations&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/Enter &quot;Congratulations&quot; inside the EditText field.<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span>.<span class=\"me1\">enterText<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>EditText<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">activity<\/span>.<span class=\"me1\">findViewById<\/span><span class=\"br0\">&#40;<\/span>R.<span class=\"me1\">id<\/span>.<span class=\"me1\">EditText01<\/span><span class=\"br0\">&#41;<\/span>, text<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/Click on the button named &quot;Click&quot;.<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span>.<span class=\"me1\">clickOnButton<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Click&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/Check to see if the given text is displayed.<\/span><br \/>\nassertTrue<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span>.<span class=\"me1\">searchText<\/span><span class=\"br0\">&#40;<\/span>text<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTextView outputField <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span>TextView<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">activity<\/span>.<span class=\"me1\">findViewById<\/span><span class=\"br0\">&#40;<\/span>R.<span class=\"me1\">id<\/span>.<span class=\"me1\">TextView01<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+arraylist\"><span class=\"kw3\">ArrayList<\/span><\/a> currentTextViews <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.<span class=\"me1\">solo<\/span>.<span class=\"me1\">getCurrentTextViews<\/span><span class=\"br0\">&#40;<\/span>outputField<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nassertFalse<span class=\"br0\">&#40;<\/span>currentTextViews.<span class=\"me1\">isEmpty<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTextView output <span class=\"sy0\">=<\/span> currentTextViews.<span class=\"me1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nassertEquals<span class=\"br0\">&#40;<\/span>text, output.<span class=\"me1\">getText<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">toString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h2>Run the test<\/h2>\n<p>Al that is left is running the test.<\/p>\n<ol>\n<li>Right click <em>MyAndroidAppTestProject<\/em>.<\/li>\n<li>Select <strong>Android Junit Test<\/strong> within the <strong>Run-As<\/strong> option.<\/li>\n<li>Be patient, the emulator starts up very slow. You should get the following result<\/li>\n<\/ol>\n<p><a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/testResult.gif\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-306\" title=\"testResult\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/testResult.gif\" alt=\"\" width=\"348\" height=\"236\" srcset=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/testResult.gif 348w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/testResult-300x203.gif 300w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/08\/testResult-160x110.gif 160w\" sizes=\"(max-width: 348px) 100vw, 348px\" \/><\/a><\/p>\n<h2>Appendix<\/h2>\n<p>Download source code <a href='http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/Android.zip'>Android.zip<\/a> [16kB] and <a href='http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2011\/03\/AndroidTest.zip'>AndroidTest.zip<\/a> [16kB] <\/p>\n","protected":false},"excerpt":{"rendered":"<p>After setting up your Android development environment, and Developing an Android Application it\u2019s time to set-up a automatic Android Test environment. The steps to achieve this are: Choose a test technique. Creating a test project. Make the test. Run the test. I will use the Android application which was developed inside my previous post. [Update 15-03-2011] Updated to Android 2.3.3. [Update 15-03-2011] Updated to Robotium 2.2.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,95],"tags":[154,30,11,24,25],"_links":{"self":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts\/300"}],"collection":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/comments?post=300"}],"version-history":[{"count":0,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts\/300\/revisions"}],"wp:attachment":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/media?parent=300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/categories?post=300"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/tags?post=300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}