SlideShare a Scribd company logo
Testing Your Application on / for
       Google App Engine
                          Narinder Kumar
                       Inphina Technologies




                                       1
Agenda
   Problem Context
   App Engine Testing Framework
       Local DataStore Testing
       Authentication API Testing
       Memcache Testing
   Google Cloud Cover – An Overview



                                       2
Easy to build, Easy to Maintain,
         Easy to Scale




                                   3
Why Testing
   To verify correctness
    of the code
   To be assured of
    continued
    correctness of old
    code
   To avoid surprises
   To safely make large
    refactorings
I feel sad and naked without Good Test Coverage
                              Max Ross (Member of Google App Engine Team)   4
Do we need App Engine Specific
     Testing Strategies ?




                                 5
Our Goal
To be able to test in our local environment using
   Spring
   Maven
   JPA/JDO
   JUnit
   Continuous Integration



                                                6
Google Infrastructure Services
   DataStore
   Memcache
   TaskQueue
   Authentication
   ...




                                       7
App Engine Testing Framework
   LocalServiceTestHelper
       LocalDataStoreServiceTestConfig
       LocalMemCacheServiceTestConfig
       LocalTaskQueueTestConfig
       LocalUserServiceTestConfig
       ...




                                          8
Local Data Store Testing




                           9
Step 1 : Make RunTime Libraries
        Available Locally
 <dependency>
     <groupid>com.google.appengine</groupid>
     <artifactid>appengine-testing</artifactid>
     <version>1.3.4</version>
     <scope>test</scope>
 </dependency>
 <dependency>
     <groupid>com.google.appengine</groupid>
     <artifactid>appengine-api-labs</artifactid>
     <version>1.3.4</version>
     <scope>test</scope>
 </dependency>
 <dependency>
     <groupid>com.google.appengine</groupid>
     <artifactid>appengine-api-stubs</artifactid>
     <version>1.3.4</version>
     <scope>test</scope>
 </dependency>


 Some of these libraries are not available in Central Maven
                        Repositories                          10
Step 2 : Enhance Domain Classes
 <plugin>
            <groupid>org.datanucleus</groupid>
            <artifactid>maven-datanucleus-plugin</artifactid>
            <version>1.1.4</version>
            <configuration>
            <mappingincludes>**/domain/*.class</mappingincludes>
                 <verbose>true</verbose>
                 <enhancername>ASM</enhancername>
                 <api>JPA</api>
            </configuration>
            <executions>
                 <execution>
                      <phase>compile</phase>
                      <goals>
                          <goal>enhance</goal>
                      </goals>
                 </execution>
            </executions>
 ......
 <plugin>
                                                                   11
Prepare Run-Time Environment
        and Dependencies
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml",
"classpath:test-applicationContext-dao.xml"})
public class LocalDatastoreSpringTestCase extends TestCase {

  private final LocalServiceTestHelper helper =
     new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

  @Before
  public void setUp() {
    helper.setUp();
  }

  @After
  public void tearDown() {
    helper.tearDown();
  }


                                                                               12
Write Specific Tests
public class EmployeeDaoSpringTest extends LocalDatastoreSpringTestCase {

    @Autowired
    private EmployeeDao employeeDao;

    @Test
    public void testShouldPersistEmployee() {
         Employee employee = new Employee();
         employee.setFirstName("Scott");
         employee.setLastName("Adams");
         employee.setHireDate(new Date());

        employeeDao.createEmployee(employee);

        Collection<employee> list = employeeDao.list();

        Assert.assertEquals(1, list.size());
    }


                                                                            13
Authentication API Testing
public class AuthenticationTest {

    private final LocalServiceTestHelper helper =
       new LocalServiceTestHelper(new LocalUserServiceTestConfig())
         .setEnvIsAdmin(true).setEnvIsLoggedIn(true);

    @Test
    public void testIsAdmin() {
      UserService userService = UserServiceFactory.getUserService();
      assertTrue(userService.isUserAdmin());
    }

    @Before
    public void setUp() {
      helper.setUp();
    }

    @After
    public void tearDown() {
      helper.tearDown();
    }
}
                                                                       14
Memcache Testing
public class LocalMemcacheTest {

       private final LocalServiceTestHelper helper =
          new LocalServiceTestHelper(new LocalMemcacheServiceTestConfig());

       @Test
       private void testInsert() {
          MemcacheService ms = MemcacheServiceFactory.getMemcacheService();
          assertFalse(ms.contains("yar"));
          ms.put("yar", "foo");
          assertTrue(ms.contains("yar"));
       }}

....
       // SetUp and Tear Down




                                                                              15
Google Cloud Cover – An Overview




                                   16
Key Features
   Provides ability to run your tests in Cloud
   Designed to run Existing Test Suites
   Tests Execute in Parallel
       Creates one Task Queue per Test
       Number of workers determined by Queue Config
   Allows to Run Large Test Suites faster : Acts as
    a Test Grid


                                                       17
How to Set it up
   Create a Standard GAE/J web application with
    all Production Code & Test Code and
    dependencies
   Add Cloud Cover Dependencies to WAR
   Create a TestRunner Config around your Test
    Suite
   Add Cloud Cover Servlet
      http://<your_app_id>/cloudcover.html

                                                  18
Google Cloud Cover in Action




                               19
Different from Normal Testing
   Each Test must complete in 30 seconds

   Application Code and Test Code must obey

    Sandbox restrictions

   Need to invoke Tests via HTTP



                                               20
Conclusions
   Local RunTime Environment very helpful

    during Development Phase

   Google Cloud Cover can be a good aid in

    certain areas but need more refinement



                                              21
nkumar@inphina.com

      www.inphina.com
http://thoughts.inphina.com


                              22
References
   http://code.google.com/appengine/docs/java/tools/localunittesting.html

   http://code.google.com/p/cloudcover/

   http://thoughts.inphina.com/2010/06/28/unit-testing-maven-based-jpa-application-on-gae/

   http://objectuser.wordpress.com/category/software-development/google-app-engine/

   http://code.google.com/events/io/2010/sessions.html#App%20Engine




                                                                                        23

More Related Content

PDF
Introduction maven3 and gwt2.5 rc2 - Lesson 01
PDF
Architecting your GWT applications with GWT-Platform - Lesson 02
PDF
ScalaUA - distage: Staged Dependency Injection
PDF
Soft shake 2013 - make use of sonar on your mobile developments
PDF
Scala, Functional Programming and Team Productivity
PDF
Testing with JUnit 5 and Spring
PDF
Izumi 1.0: Your Next Scala Stack
PPTX
Making React Native UI Components with Swift
Introduction maven3 and gwt2.5 rc2 - Lesson 01
Architecting your GWT applications with GWT-Platform - Lesson 02
ScalaUA - distage: Staged Dependency Injection
Soft shake 2013 - make use of sonar on your mobile developments
Scala, Functional Programming and Team Productivity
Testing with JUnit 5 and Spring
Izumi 1.0: Your Next Scala Stack
Making React Native UI Components with Swift

What's hot (20)

PDF
Hyper-pragmatic Pure FP testing with distage-testkit
PPTX
Release With Maven
PDF
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
PDF
Integration Testing With ScalaTest and MongoDB
PDF
AngularJS Unit Test
PPTX
Managed Beans: When, Why and How
PDF
Chef for beginners module 2
PDF
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
PPT
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
PDF
In the Brain of Hans Dockter: Gradle
PDF
Jdc 2010 - Maven, Intelligent Projects
PDF
Intelligent Projects with Maven - DevFest Istanbul
PPTX
Springboot2 postgresql-jpa-hibernate-crud-example with test
PDF
Chef for beginners module 1
PDF
JPQL/ JPA Activity 1
 
PDF
Chef for beginners module 5
PDF
Maven plugin guide using Modello Framework
PPTX
PDF
vJUG - The JavaFX Ecosystem
PDF
JavaDo#09 Spring boot入門ハンズオン
Hyper-pragmatic Pure FP testing with distage-testkit
Release With Maven
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Integration Testing With ScalaTest and MongoDB
AngularJS Unit Test
Managed Beans: When, Why and How
Chef for beginners module 2
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
Selenium-Browser-Based-Automated-Testing-for-Grails-Apps
In the Brain of Hans Dockter: Gradle
Jdc 2010 - Maven, Intelligent Projects
Intelligent Projects with Maven - DevFest Istanbul
Springboot2 postgresql-jpa-hibernate-crud-example with test
Chef for beginners module 1
JPQL/ JPA Activity 1
 
Chef for beginners module 5
Maven plugin guide using Modello Framework
vJUG - The JavaFX Ecosystem
JavaDo#09 Spring boot入門ハンズオン
Ad

Similar to Testing your application on Google App Engine (20)

PPTX
Google Cloud Platform
PDF
Android UI Testing with Appium
DOC
Resume_sindhu
PDF
UI Testing - Selenium? Rich-Clients? Containers? (SwanseaCon 2018)
PPTX
Junit_.pptx
ODP
Pyramid deployment
PPTX
OWASP ZAP Workshop for QA Testers
PPTX
Protractor framework architecture with example
PDF
MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...
PPTX
Joomla! Testing - J!DD Germany 2016
PPTX
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
PDF
Devfest 2023 - Service Weaver Introduction - Taipei.pdf
PDF
Meetup 2022 - APIs with Quarkus.pdf
PPTX
Top 10 Mistakes AngularJS Developers Make
PPTX
Codeception
PDF
Testing for fun in production Into The Box 2018
PPT
Pragmatic Parallels: Java and JavaScript
PDF
Firebase analytics event_201607
PPTX
JBCN_Testing_With_Containers
ODP
Unit Testing and Coverage for AngularJS
Google Cloud Platform
Android UI Testing with Appium
Resume_sindhu
UI Testing - Selenium? Rich-Clients? Containers? (SwanseaCon 2018)
Junit_.pptx
Pyramid deployment
OWASP ZAP Workshop for QA Testers
Protractor framework architecture with example
MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...
Joomla! Testing - J!DD Germany 2016
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
Devfest 2023 - Service Weaver Introduction - Taipei.pdf
Meetup 2022 - APIs with Quarkus.pdf
Top 10 Mistakes AngularJS Developers Make
Codeception
Testing for fun in production Into The Box 2018
Pragmatic Parallels: Java and JavaScript
Firebase analytics event_201607
JBCN_Testing_With_Containers
Unit Testing and Coverage for AngularJS
Ad

More from Inphina Technologies (13)

PDF
Scala collections
PDF
PPTX
Easy ORMness with Objectify-Appengine
PDF
Cloud Foundry Impressions
PDF
Cloud slam2011 multi-tenancy
PDF
Google appenginemigrationcasestudy
PDF
Preparing yourdataforcloud
PDF
Multi-Tenancy in the Cloud
PDF
Inphina at a glance
PDF
Inphina cloud
PDF
Multi-tenancy in the cloud
PDF
Preparing your data for the cloud
PDF
Getting started with jClouds
Scala collections
Easy ORMness with Objectify-Appengine
Cloud Foundry Impressions
Cloud slam2011 multi-tenancy
Google appenginemigrationcasestudy
Preparing yourdataforcloud
Multi-Tenancy in the Cloud
Inphina at a glance
Inphina cloud
Multi-tenancy in the cloud
Preparing your data for the cloud
Getting started with jClouds

Recently uploaded (20)

PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Unlocking AI with Model Context Protocol (MCP)
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Spectroscopy.pptx food analysis technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPT
Teaching material agriculture food technology
PPTX
Cloud computing and distributed systems.
PDF
Electronic commerce courselecture one. Pdf
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Chapter 3 Spatial Domain Image Processing.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Digital-Transformation-Roadmap-for-Companies.pptx
sap open course for s4hana steps from ECC to s4
Encapsulation_ Review paper, used for researhc scholars
Unlocking AI with Model Context Protocol (MCP)
The AUB Centre for AI in Media Proposal.docx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Machine learning based COVID-19 study performance prediction
Spectroscopy.pptx food analysis technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Teaching material agriculture food technology
Cloud computing and distributed systems.
Electronic commerce courselecture one. Pdf

Testing your application on Google App Engine

  • 1. Testing Your Application on / for Google App Engine Narinder Kumar Inphina Technologies 1
  • 2. Agenda  Problem Context  App Engine Testing Framework  Local DataStore Testing  Authentication API Testing  Memcache Testing  Google Cloud Cover – An Overview 2
  • 3. Easy to build, Easy to Maintain, Easy to Scale 3
  • 4. Why Testing  To verify correctness of the code  To be assured of continued correctness of old code  To avoid surprises  To safely make large refactorings I feel sad and naked without Good Test Coverage Max Ross (Member of Google App Engine Team) 4
  • 5. Do we need App Engine Specific Testing Strategies ? 5
  • 6. Our Goal To be able to test in our local environment using  Spring  Maven  JPA/JDO  JUnit  Continuous Integration 6
  • 7. Google Infrastructure Services  DataStore  Memcache  TaskQueue  Authentication  ... 7
  • 8. App Engine Testing Framework  LocalServiceTestHelper  LocalDataStoreServiceTestConfig  LocalMemCacheServiceTestConfig  LocalTaskQueueTestConfig  LocalUserServiceTestConfig  ... 8
  • 9. Local Data Store Testing 9
  • 10. Step 1 : Make RunTime Libraries Available Locally <dependency> <groupid>com.google.appengine</groupid> <artifactid>appengine-testing</artifactid> <version>1.3.4</version> <scope>test</scope> </dependency> <dependency> <groupid>com.google.appengine</groupid> <artifactid>appengine-api-labs</artifactid> <version>1.3.4</version> <scope>test</scope> </dependency> <dependency> <groupid>com.google.appengine</groupid> <artifactid>appengine-api-stubs</artifactid> <version>1.3.4</version> <scope>test</scope> </dependency> Some of these libraries are not available in Central Maven Repositories 10
  • 11. Step 2 : Enhance Domain Classes <plugin> <groupid>org.datanucleus</groupid> <artifactid>maven-datanucleus-plugin</artifactid> <version>1.1.4</version> <configuration> <mappingincludes>**/domain/*.class</mappingincludes> <verbose>true</verbose> <enhancername>ASM</enhancername> <api>JPA</api> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>enhance</goal> </goals> </execution> </executions> ...... <plugin> 11
  • 12. Prepare Run-Time Environment and Dependencies @RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class }) @ContextConfiguration(locations = { "classpath:test-applicationContext.xml", "classpath:test-applicationContext-dao.xml"}) public class LocalDatastoreSpringTestCase extends TestCase { private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); @Before public void setUp() { helper.setUp(); } @After public void tearDown() { helper.tearDown(); } 12
  • 13. Write Specific Tests public class EmployeeDaoSpringTest extends LocalDatastoreSpringTestCase { @Autowired private EmployeeDao employeeDao; @Test public void testShouldPersistEmployee() { Employee employee = new Employee(); employee.setFirstName("Scott"); employee.setLastName("Adams"); employee.setHireDate(new Date()); employeeDao.createEmployee(employee); Collection<employee> list = employeeDao.list(); Assert.assertEquals(1, list.size()); } 13
  • 14. Authentication API Testing public class AuthenticationTest { private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalUserServiceTestConfig()) .setEnvIsAdmin(true).setEnvIsLoggedIn(true); @Test public void testIsAdmin() { UserService userService = UserServiceFactory.getUserService(); assertTrue(userService.isUserAdmin()); } @Before public void setUp() { helper.setUp(); } @After public void tearDown() { helper.tearDown(); } } 14
  • 15. Memcache Testing public class LocalMemcacheTest { private final LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalMemcacheServiceTestConfig()); @Test private void testInsert() { MemcacheService ms = MemcacheServiceFactory.getMemcacheService(); assertFalse(ms.contains("yar")); ms.put("yar", "foo"); assertTrue(ms.contains("yar")); }} .... // SetUp and Tear Down 15
  • 16. Google Cloud Cover – An Overview 16
  • 17. Key Features  Provides ability to run your tests in Cloud  Designed to run Existing Test Suites  Tests Execute in Parallel  Creates one Task Queue per Test  Number of workers determined by Queue Config  Allows to Run Large Test Suites faster : Acts as a Test Grid 17
  • 18. How to Set it up  Create a Standard GAE/J web application with all Production Code & Test Code and dependencies  Add Cloud Cover Dependencies to WAR  Create a TestRunner Config around your Test Suite  Add Cloud Cover Servlet http://<your_app_id>/cloudcover.html 18
  • 19. Google Cloud Cover in Action 19
  • 20. Different from Normal Testing  Each Test must complete in 30 seconds  Application Code and Test Code must obey Sandbox restrictions  Need to invoke Tests via HTTP 20
  • 21. Conclusions  Local RunTime Environment very helpful during Development Phase  Google Cloud Cover can be a good aid in certain areas but need more refinement 21
  • 22. nkumar@inphina.com www.inphina.com http://thoughts.inphina.com 22
  • 23. References  http://code.google.com/appengine/docs/java/tools/localunittesting.html  http://code.google.com/p/cloudcover/  http://thoughts.inphina.com/2010/06/28/unit-testing-maven-based-jpa-application-on-gae/  http://objectuser.wordpress.com/category/software-development/google-app-engine/  http://code.google.com/events/io/2010/sessions.html#App%20Engine 23