Wednesday, October 29, 2014

Chapter 29-36 -What is TestNG

What is TestNG

TestNG is a powerful testing framework, an enhanced version of Junit which was in use for long years before TestNG came into existance. NG stands for 'Next Generation'.
TestNG framework provides the following features and answers to our question "Why we need TestNG"?
  • Annotations helps us to organize the tests easier.
  • Flexible test configuration.
  • Test cases can be grouped more easily
  • Parallelization of test can be achieved using TestNG
  • Support for data-driven testing
  • Inbuilt Reporting

Installing TestNG for Eclipse

Step 1 : Launch Eclipse and select 'Install New Software'.
Selenium IDE 93
Step 2 : Enter the URL as 'http://beust.com/eclipse' and click 'Add'.
Selenium IDE 94
Step 3 : Add Repository dialog opens. Enter the name as 'TestNG' and click 'OK'
Selenium IDE 95
Step 4 : Click 'Select All' and 'TestNG' would be selected would be selected as shown in the figure.
Selenium IDE 96
Step 5 : Click 'Next' to continue.
Selenium IDE 97
Step 6 : Review the items that are selected and click 'Next'.
Selenium IDE 98
Step 7 : "Accept the License Agreement" and click 'Finish'.
Selenium IDE 99
Step 8 : TestNG starts installing and the progress would be shown as below..
Selenium IDE 100
Step 9 : Security Warning pops up as the validity of the software cannot be established. click 'Ok'.
Selenium IDE 101
Step 10 : The Installer pops up for the restart. click 'Yes'.
Selenium IDE 102

Annotations in TestNG

Annotations were formally added to the Java language in JDK 5 and TestNG made the choice to use annotations to annotate test classes. Following are some of the benefits of using annotations. More about TestNG can be found here
  • TestNG identifies the methods it is interested in by looking up annotations. Hence, method names are not restricted to any pattern or format.
  • We can pass additional parameters to annotations.
  • Annotations are strongly typed, so the compiler will flag any mistakes right away.
  • Test classes no longer need to extend anything (such as TestCase, for JUnit 3).
AnnotationDescription
@BeforeSuiteThe annotated method will be run only once before all tests in this suite have run.
@AfterSuiteThe annotated method will be run only once after all tests in this suite have run.
@BeforeClassThe annotated method will be run only once before the first test method in the current class is invoked.
@AfterClassThe annotated method will be run only once after all the test methods in the current class have been run.
@BeforeTestThe annotated method will be run before any test method belonging to the classes inside the tag is run.
@AfterTestThe annotated method will be run after all the test methods belonging to the classes inside the tag have run.
@BeforeGroupsThe list of groups that this configuration method will run before. This method is guaranteed to run shortly before the first test method that belongs to any of these groups is invoked.
@AfterGroupsThe list of groups that this configuration method will run after. This method is guaranteed to run shortly after the last test method that belongs to any of these groups is invoked.
@BeforeMethodThe annotated method will be run before each test method.
@AfterMethodThe annotated method will be run after each test method.
@DataProviderMarks a method as supplying data for a test method. The annotated method must return an Object[ ][ ] where each Object[ ] can be assigned the parameter list of the test method. The @Test method that wants to receive data from this DataProvider needs to use a dataProvider name equals to the name of this annotation.
@FactoryMarks a method as a factory that returns objects that will be used by TestNG as Test classes. The method must return Object[ ].
@ListenersDefines listeners on a test class.
@ParametersDescribes how to pass parameters to a @Test method.
@TestMarks a class or a method as part of the test.

TestNG-Eclipse Setup

Step 1 : Launch Eclipse and create a 'New Java Project' as shown below.
Selenium IDE 53
Step 2 : Enter the project name and click 'Next'.
Selenium IDE 103
Step 3 : Navigate to "Libraries" Tab and Add the Selenium Remote Control Server JAR file by clicking on "Add External JAR's" as shown.
Selenium IDE 113
Step 4 : The Added JAR file is shown as below and click 'Add Library'.
Selenium IDE 104
Step 5 : The 'Add Library' dialog opens. Select 'TestNG' and click 'Next' in 'Add Library' Dialog.
Selenium IDE 105
Step 6 : The added 'TestNG' Library is added and it is displayed as shown below.
Selenium IDE 106
Step 7 : Upon creating the project the structure of the project would be as shown below.
Selenium IDE 107
Step 8 : Right click on 'src' folder and select 'New' and 'other'.
Selenium IDE 108
Step 9 : Select 'TestNG' and click 'Next'.
Selenium IDE 109
Step 10 : Select 'Source Folder' Name and click 'Ok'.
Selenium IDE 110
Step 11 : Select 'Package name', class name and click 'Finish'.
Selenium IDE 111
Step 12 : The Package explorer and the created class would be displayd to the user.
Selenium IDE 112

First Test in TestNG

Now let us start scripting using TestNG. Let us script for the same example that we used in understanding the Webdriver. We will make use of the demo application, www.calculator.net and perform percent calculator.
In the below test, you will notice that there is NO main method, as testNG will drive the program execution flow. After Initializing the driver, it will execute '@BeforeTest' method followed by '@Test' and then '@AfterTest'. Please note that there can be any number of '@Test' annotation in a class but '@BeforeTest' and '@AfterTest' can appear only Once.
package TestNG;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class TestNGClass 
{
  WebDriver driver = new FirefoxDriver();

  @BeforeTest
  public void launchapp()
  {  
    //Puts a Implicit wait, Will wait for 10 seconds before throwing exception
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    //Launch website
    driver.navigate().to("http://www.calculator.net"); 
    driver.manage().window().maximize();
  }
  
  @Test
  public void calculatepercent()
  {
 // Click on Math Calculators 
 driver.findElement(By.xpath(".//*[@id='menu']/div[3]/a")).click();    

 // Click on Percent Calculators 
 driver.findElement(By.xpath(".//*[@id='menu']/div[4]/div[3]/a")).click();     

 // Enter value 10 in the first number of the percent Calculator
 driver.findElement(By.id("cpar1")).sendKeys("10");   

 // Enter value 50 in the second number of the percent Calculator     
 driver.findElement(By.id("cpar2")).sendKeys("50");  

 // Click Calculate Button 
 driver.findElement(By.xpath(".//*[@id='content']/table/tbody/tr/td[2]/input")).click();    

 // Get the Result Text based on its xpath     
 String result = driver.findElement(By.xpath(".//*[@id='content']/p[2]/span/font/b")).getText();    

 //Print a Log In message to the screen  
 System.out.println(" The Result is " + result);     
  
 if(result.equals("5"))
 {
  System.out.println(" The Result is Pass");
 }
 else
 {
  System.out.println(" The Result is Fail");
 }      
  }

  @AfterTest
  public void terminatetest()
  {   
    driver.close();
  }
}

Result Analysis

The Output is thrown to the console and it would appear as shown below. The Console output also has the execution summary.
Selenium IDE 114
The result of TestNG can also be seen in a different tab. Click on 'HTML Report View' button as shown below.
Selenium IDE 115
The HTML result would be displayed as shown below.
Selenium IDE 117

No comments: