Saturday, 3 October 2015

Create selenium WebDriver project in eclipse with Apache maven

The Problem
I often see Selenium practitioners ask that I have downloaded necessary resources to work on Selenium WebDriver. But, What should be project structure, how to manage dependencies, How to do build  and test management etc.

A Solution
By leveraging Apache Maven in our test framework, we can manage entire life-cycle of a test project. It provides support to define project structure, download the project dependencies libraries automatically, build and test management etc. Maven allows us to get all the Selenium libraries files and their dependencies by configuring the pom.xml (POM – Project Object Model) file.

Let’s dig in with an example

An Example
We will use Eclipse IDE and Maven for building the Selenium WebDriver test framework.
  1. Launch the Eclipse IDE.
  2. Create a new project by selecting [File -> New -> Other] from Eclipse Main Menu.
  3. On the New dialog, select [Maven -> Maven Project] as shown in the following screenshot:

  1. Click on [Next], the New Maven Project dialog will be displayed. Select the [Create a simple project (skip archetype selection)] check-box and set everything to default and click on the Next button as shown in the following screenshot: 

  1. On the New Maven Project dialog box, enter base package name (like com.myproject.app) in Group Id and project name (like myproject) in Artifact Id textboxes. You can also add a name and description but it is optional. Set everything to default and click on the [Finish] button as shown in the following screenshot:


  1. Eclipse will create the myproject project with a structure (in Package Explorer) similar to the one shown in the following screenshot:

7.       
           7. The JRE version might change based on the Java version installed on your machine. 
              Right-click on JRE System Library [J2SE-1.5] and select the Properties option from the 
              menu.       
  1. Select pom.xml from Package Explorer. This will open the pom.xml file in the editor area with the Overview tab open. Select the pom.xml tab instead.
  2. Add the WebDriver and TestNG dependencies highlighted in the following code snippet, to pom.xml in the <project> node:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
         <modelVersion>4.0.0</modelVersion>
         <groupId>com.myproject.app</groupId>
         <artifactId>myproject</artifactId>
         <version>0.0.1-SNAPSHOT</version>
<dependencies>
     <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-server</artifactId>
        <version>2.42.2</version>
    </dependency>
   <dependency>
                  <groupId>org.testng</groupId>
                  <artifactId>testng</artifactId>
                  <version>6.8.8</version>
   <scope>test</scope>
   </dependency>
</dependencies>
  <build>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
      <testResource>
        <directory>src/test/java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
    </testResources>
   
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
    </build>
/project>

  1. Right click on pom.xml from Package Explorer & Select [Run As -> Maven Install]

Conclusion
If you'd like to see the code and example used in the above project, you can find them here.


Happy Testing!

Test Automation Framework using Jenkins, GitHub, Maven, Selenium Grid, and TestNG

The Problem
  
You’re looking to automation web application using Selenium WebDriver for a full end-to-end / UI automation testing, there could be many challenges -

Challenge 1 - Selenium tests take a long time to run, how to speed up test execution, How to run script across the browser

Challenge 2 - Your team is distributed across geography, how team members develop, debug & update would test scripts at a central repository.

Challenge 3 - How to make sure code is not broken & there is no build failure after last night script update?

Challenge 4 - Who will own the responsibility to run script & share execution result (success/failure) with team & stakeholder?

Challenge 5 - How to manage project dependency & make sure across the team same version of jar file is used.


A Solution

Solution 1 - By leveraging Selenium Grid, we could speed up test execution & reduce test execution time. It provides ability to run parallel execution of test cases on multiple browser and operating system. Setup a Selenium Grid hub and nodes to run a battery of Selenium tests quickly.
           
Solution 2 - By leveraging Git/GitHub (private/public code repository) we can maintain web-based code repository and source code management, where every team member can upload their test scripts. It also provides access control and collaboration features such as wikis, task management, and bug tracking and feature requests for every project.

Solution 3 & 4 – By leveraging Jenkins, once configured on a central machine, it runs Selenium tests automatically several times a day (or as scheduled), or even each time there is a code commit (It allows to schedule build with GitHub with the git-plugin to run job on each commit, success/failure report is shared with stakeholder via email upon completion of build job)

Solution 5 - By leveraging Apache Maven in our test framework, this is a software project management and comprehension tool. Based on the concept of a project object model (POM),Maven manages a project's resource, build, reporting and documentation from a central piece of information.

General workflow

Maintain two branches on GitHub – Master & Stable. All new development & changes happens in branch Master. Stable branch contains successfully executable test scripts.

  1. Push changes to a branch Master or Initiate a Script run by clicking on [Build Now] on Jenkins Project page
  2. Jenkins detects a change pushed to Master
  3. Jenkins pulls in the latest changes & begins to run Selenium tests
  4. Upon completion of test execution, Jenkins sends execution report via email to configured email ID

Let’s dig in with an example


An Example

Jenkins CI to manage test execution & nodes from single interface -



 POM.xml which manages project dependency, goal & project lifecycle -


Test Java class which has tests for AUT

Test Execution Report

Conclusion
If you'd like to see the code of above mentioned project,  please write to us.

 Happy Testing!

Cucumber vs TestNG : Which is better?

I have been a long time user of TestNG.  Few months back, I started exploring about Cucumber. It was a wish from my client to create automation framework using Cucumber. I searched on web & found many blogs on Cucumber & its implementation. I started with assumption that Cucumber will replace TestNG. After working for few months, I came to following conclusion they are as follows -



                    Cucumber
                        TestNG
  • Cucumber is a collaboration tool, which lets non-technical people write executable specifications. Those executable specifications test your app from the outside - like a black box.
  • Cucumber is not meant to be used as a unit testing tool.
  •  It allows to write automated acceptance tests, functional requirements and software documentation into one format that would be understandable by non-technical people as well as testing tools
  • You can implement your tests using the same language you use to discuss them with the business. 
  • Cucumber adds the overhead of plain English (or other native language) to executable code conversion
  • Good for acceptance testing

  • TestNG are unit testing tools. They are great for testing individual classes, but not great for executable specifications that are readable (and writeable) by non-technical people.
  • It facilitates to test individual classes.
  •  You can group tests using tags.
  •  TestNG supports a lot of complicated practices like priorities, grouping, listener etc. 
  •  Useful when you have to automate large number of test case

Thursday, 1 October 2015

R code to get the column Name having null value

R Quick Solution:

Problem: What to know which columns have NULL value in dataset?

Solution:
Data set: r_data

> for(varr in names(r_data))
        {
            print(varr)
            print(sum(is.na(r_data[varr])))
        }

Output:
  [1] "SD_ID"
  [1] 0
  [1] "ZIP"
  [1] 0
  [1] "COUNTY"
  [1] 0
  [1] "LATITUDE"
  [1] 20

It means variable Latitude has 20 missing values. So you to investigate it and substitute the missing value based on your business requirement.

Saturday, 19 September 2015

Java required by Selenium Automation

#Java #TheBuddhaTree #SeleniumWebDriver

After many of requests/questions from our readers that how much Java is needed for working on Selenium WebDriverHere we are listing all the Java topics, which you should know before start working on Selenium WebDriver.

Introduction to Computers and Java
•       Introduction
•       Computers: Hardware and Software
•       Machine Languages, Assembly Languages and High-  Level Languages
•       Introduction to Object Technology
•       Operating Systems
•       Programming Languages
•       Java Development Environment
•       Test-Driving Java Application

Introduction to Java Applications
•       Introduction
•       Write Your First Program in Java
•       Modifying Your First Java Program
•       Displaying Text
•       Adding Integers
•       Memory Concepts
•       Arithmetic
•       Decision Making: Equality and Relational
•       Conditional Operators

Introduction to Classes, Objects, Methods and Strings
•       Introduction
•       Declaring Class with Method and Instantiating Object of a Class
•       Declaring a Method with Parameter
•       Instance Variables, set getter Methods
•       Primitive vs. Reference Types
•       Initializing Objects with Constructors
•       Floating-Point Numbers and double

Control Statements:  Part  1
•       Introduction
•       Algorithms
•       Control Structures
•       if Statement
•       if...else Statement
•       while Statement
•       Compound Assignment Operators
•       Increment and Decrement Operators
•       Primitive Types

Control Statements: Part 2
• Introduction
• Essentials of Counter-Controlled Repetition
• for Repetition Statement
• Examples Using the for Statement
• do...while Repetition Statement
• switch Multiple-Selection Statement
• break and continue Statements
• Logical Operators
• Structured Programming Summary

  Methods
• Introduction
• Program Modules in Java
• static Methods  and static Fields
• Methods with Multiple Parameters
• Method-Call Stack and Activation Records
• Argument Promotion and Casting
• Java API Packages
• Scope of Declarations
• Method Overloading

Array
• Introduction
• Arrays
• Declaring and Creating Arrays
• Arrays Examples
• Enhanced for Statement
• Passing Arrays to Methods
• Multidimensional Arrays
• Limitation of Array

Classes and Objects: In Detail
• Introduction
• Controlling Access to Members
• Referring to the Current Object’s Members with this  Reference
• Overloaded Constructors
• Default and No-Argument Constructors
• Setter and Getter Methods
• Composition &  Enumerations
• Garbage Collection and Method finalize
• static Class Members
• static Import
• final Instance Variables
• Creating & Accessing package

Inheritance
• Introduction
• Superclass and Subclass
• protected Members
• Relationship between Superclass and Subclass
• Constructors in Subclasses
• Class Object

Polymorphism
• Introduction
• Polymorphism Examples
• Polymorphic Behavior
• Abstract Class and Method
• final Method and Class
• Using Interfaces

Exception Handling
• Introduction
• Example: Divide by Zero
• When to Use Exception Handling
• Java Exception Hierarchy
• finally Block
• Obtaining Information from an Exception Object
• Chained Exceptions
• Declaring New Exception Types
• Preconditions and Post-conditions
• Assertions

Strings, Characters and Regular Expressions
• Introduction
• Fundamentals of Characters and Strings
• Class String
• String operation
• Class Character
• Tokenizing Strings
• Regular Expressions, Class Pattern and Class Matcher
  
Files, Streams and Object Serialization
• Introduction
• Files and Streams
• Class File
• Sequential-Access Text Files
• Object Serialization
• Additional java.io Classes

Generic Collections Classes & Methods
• Introduction
• Collections Overview
• Type-Wrapper Classes for Primitive Types
• Autoboxing and Auto-Unboxing
• Interface Collection and Class Collections
• Lists
• Collections Methods
• Sets
• Maps
• Properties Class
• Synchronized Collections
• Un-modifiable Collections


• Abstract Implementations