2. TestNG- Framework
• Open source
• Do not require Main method
• Efficient for testing
• Inspired by JUnit and NUnit.
• Use annotation for execution.
• Html Report
7. Simple example
package SeleniumTests;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.Test;
public class SampleTest {
@Test
public void verifytitle()
{
WebDriver driver = new FirefoxDriver();
driver.get("http:www.gmail.com");
String actual= driver.getTitle();
Assert.assertEquals(actual, "Gmail");
}
}
8. Multiple Test Support
• Priority – Test are executed based on define priority
• DependsOnMethod–Test are executed with dependency other test.
• Default – Test are executed in ascending order of name
9. Priority
package SeleniumTests;
/* Define priority of test. lowest executed first. Enable make test non-executable(like in test of priority of -1 */
import org.testng.annotations.Test;
public class multipletest{
@Test(priority =-1, enabled =false)//Test is non-executable.
public void login()
{
System.out.println("login success");}
@Test(priority =1)
public void search()
{
System.out.println("search success");}
@Test (priority = 2)
public void logout()
{
System.out.println("logout success");}
}
10. DependsOnMethod
package SeleniumTests;
/* dependson is used to define dependency execution*/
import org.testng.annotations.Test;
public class multipletestwithdependsonmethods2 {
@Test
public void login()
{
System.out.println("login success");}
@Test(dependsOnMethods ={"login"})
public void search()
{
System.out.println("search success");}
@Test (dependsOnMethods ={"search"})
public void logout()
{
System.out.println("logout success");}
}
11. Skip and always execution of Test
package SeleniumTests;
import org.testng.Assert;
/* depends on method also define dependency execution and skip of test */
import org.testng.annotations.Test;
public class multipletestforskip {
@Test
public void login()
{System.out.println("login success");}
@Test(dependsOnMethods ={"login"})
public void search()
{ Assert.assertEquals("abc", "test");}
@Test (dependsOnMethods ={"search"})
public void logoutskip()// logoutskip is skipped as search is fail. This is hard dependency.
{System.out.println("logout success");}
@Test (dependsOnMethods ={"search"}, alwaysRun=true)
public void logout()// logout is run even dependent case is fail.This is called soft dependency.
{System.out.println("logout success");} }
12. Scenario based examples-1.
/*
*
login
advance search
logout
login
search
logout
login
buyproduct
logout
*/
public class Sample2 {
@BeforeMethod
public void login()
{System.out.println("login success");}
@Test(priority=2)
public void search()
{System.out.println("search success");}
@Test(priority=1)
public void advancesearch()
{System.out.println("advance search success");}
@Test(priority=3)
public void buyproduct()
{System.out.println("buyproduct success");}
@AfterMethod
public void logout()
{System.out.println("logout success");}}
13. Scenario based examples-2.
/*
login
advance search
search
buyproduct
logout
*/
public class Sample3 {
@BeforeClass
public void login()
{System.out.println("login success");}
@Test(priority=2)
public void search()
{System.out.println("search success");}
@Test(priority=1)
public void advancesearch()
{System.out.println("advance search success");}
@Test(priority=3)
public void buyproduct()
{System.out.println("buyproduct success");}
@AfterClass
public void logout()
{System.out.println("logout success");}
}
14. Multiple test executions serially
• Create xml file to define classes
• Create test classes
Xml file
<suite name = "Ëcommerce suite">
<test name ="sanity tests">
<classes>
<class name = "SeleniumTests.Sample5"/>
<class name = "SeleniumTests.Sample4"/>
</classes>
</test>
</suite>
15. public class Sample4 {
@BeforeTest
public void login()
{System.out.println("login success");}
@Test(priority=2)
public void fundtransfer()
{System.out.println("fundtransfer
success");}
@Test(priority=1)
public void accountsummary()
{System.out.println("accountsummary
success");}
@Test(priority=3)
public void billpayment()
{System.out.println("billpayment
success");}
@Test(priority=4)
public void threadtest()
{System.out.println("thread success with
class"+getClass().getSimpleName()+"withthread
name"+Thread.currentThread().getId());}
@AfterTest
public void logout()
{System.out.println("logout success");}}
public class Sample5 {
@Test(priority=2)
public void search()
{
System.out.println("search success");}
@Test(priority=1)
public void advancesearch()
{
System.out.println("advance search success");}
@Test(priority=3)
public void buyproduct()
{
System.out.println("buyproduct success ");}
@Test(priority=4)
public void threadtest()
{
System.out.println("thread success with
class"+getClass().getSimpleName()+"withthread
name"+Thread.currentThread().getId());}
}
16. Parallel execution of multiple tests
• execution• Create xml file to define classes and define threads
• Create test classes
<suite name = "Parallel test suite" parallel = "classes" thread-count ="2">
<test name ="Sanity tests">
<classes>
<class name = "SeleniumTests.Sample5"/>
<class name = "SeleniumTests.Sample4"/>
</classes>
</test>
</suite>
17. Group execution of Methods
• Create xml file to define classes and groups
• Create test classes
<suite name = "Ëcommerce suite">
<test name ="sanity tests">
<groups>
<run>
<include name = "group1"/></run>
</groups>
<classes>
<class name = "SeleniumTests.Sample6"/>
<class name = "SeleniumTests.Sample7"/>
</classes>
</test>
</suite>
18. public class Sample6 {
@BeforeTest (groups = {"group2","group1"})
public void test1()
{System.out.println("test1 success");}
@Test(priority=2, groups= {"group1"} )
public void test2()
{System.out.println("test2 success");}
@Test(priority=1, groups= {"group2"})
public void test3()
{System.out.println("test3 success");}
@Test(priority=3, groups= {"group1"})
public void test4()
{System.out.println("test4 success");}
@Test(priority=4, groups= {"group1", "group2"})
public void threadtest()
{
System.out.println("thread success with
class"+getClass().getSimpleName()+"withthread
name"+Thread.currentThread().getId());
}
@AfterTest(groups = {"group2","group1"})
public void test5()
{System.out.println("test5 success");}}
public class Sample7 {
@Test(priority=2,groups= {"group1"})
public void stest1()
{
System.out.println("stest1 success");}
@Test(priority=1,groups= {"group2"})
public void stest2()
{
System.out.println("stest2 success");}
@Test(priority=3, groups= {"group1"})
public void stest3()
{
System.out.println("stest3 success ");}
@Test(priority=4, groups= {"group1", "group2"})
public void threadtest()
{
System.out.println("thread success with
class"+getClass().getSimpleName()+"withthread
name"+Thread.currentThread().getId());}
}
19. Data driven framework using TestNG
• Third party support needed in data driven framework like POI, JXl etc.
• Annotation- Data Provider is used for data connection.
• Excel should be created on defined location.
public class DataDrivern {
@Test(dataProvider ="testdata")
public void login(String username, String Password)
{String status;
WebDriver driver = new FirefoxDriver();
driver.get("http://lms.nagarro.com/");
WebElement element = driver.findElement(By.id("username"));
element.sendKeys(username);
element = driver.findElement(By.id("password"));
element.sendKeys(Password);
element = driver.findElement(By.name("submit"));
element.click();
if( driver.getTitle().contains("Nagarro Learning Management
System"))
{status= "Pass"; driver.findElement(By.linkText("Log out")).click();}
else { status= "Fail"; }
Assert.assertEquals(status, "Pass");
driver.close();}
@DataProvider(name="testdata")
public Object[][] Readexcel()throws
BiffException, IOException
{ File f = new File ("E:/input.xls");
Workbook w = Workbook.getWorkbook(f);
Sheet s= w.getSheet(0);
int rows = s.getRows();
int columns =s.getColumns();
String InputData [][] = new String [rows][columns];
for (int i=0; i<rows; i++)
{for (int j=0;j<columns;j++)
{Cell c=s.getCell(j,i);
InputData[i][j]=c.getContents();
}}return InputData;}}
TestNG support execution of test in different manner. You can design any scenarios as per requirement.
Priority, dependsonMethod allow you to design scenario.
This example show execution of test based on priority. Priority =-1 will execute first. But we see enable status is false, this test will not execute.
This example clearly say that search method is dependent to login. And log out is dependent to search. Execution will take place as login search logout.
1. Skip: As login skip is dependent to search. It should executed after search. In current scenario we see search will fail. Hence testing will skip Logoutskip Method.
2. Logout also dependent to search, but alwaysrun is true so it will ecute always without considering fail or pass of search. But it will execute after search.