GitLab is the open DevOps platform, delivered as a single application that spans the entire software development lifecycle. If you’re not using GitLab, your DevOps lifecycle is likely spread across any number of applications. These silos take overhead to integrate, manage, configure, and maintain, slowing down your team and your deployments. Moving to a single application will speed up your workflow and help you deliver better software, faster. To know more about GitLab, click here.
In this article, we will see how to push an existing project to GitLab using Eclipse IDE.
Implementation Steps
Step 1 – Go to GitLab and select the project which you want to clone. Click on the blue color “Clone” button and then copy the hyperlink as shown in the image. You can either Clone with SSH or Clone with HTTPS.
Step 2 – Open Eclipse IDE and right-click on the project you want to push and go to the Team ->Share project.
Step 3 – It will add the project to the given repository as shown below image. Select the Finishbutton.
As you can see, the given project is Git Repository. If the project is not GIT Repository, refer to this tutorial – How to create a new Git Repository to convert the project in GIT Repository.
Step 4 – Again, Right-Click on the project and go to theTeam ->commit.
Step 5 – Select the files you want to commit and click green color + sign or Drag and Drop the files from “Unstaged Changes to Staged Changes“.
This is how the stage files looks like as shown below.
Step 6 – Write the commit message in “Commit Message” and click “Commit and Push“.
Step 7 – Fill in the below details in this window and click the “Preview” button.
URI – This is the URL that we have cloned from GitLab in Step 1. Host – gitlab.com Repository path – the path of the project in GitLab (This is auto-populated after entering URI)
Authentication User – Username of GitLab Password – password of GitLab
Step 8 – A new window will open which provides the detail of the Destination location of the project. Click the “Preview” button.
Step 9 – Push to the new branch of GitLab Repository and click the Push button.
Step 10 – As this is a new project with a master branch, you can see the whole project migrated in GitLab. If we are not using the master branch, but the local branch, then we need to create a merge request to merge the latest changes in the already existing project in GitLab.
Cheers!!Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!
The implementation of a test framework is considered successful and effective, if the test framework supports test execution in multiple ways. The tests in a Gradle Cucumber Framework can be executed as JUnit Tests, Gradle Tests and Gradle commands from Command Line.
In this tutorial, I will explain to run Gradle tests from Command Line.
Versions Used
Cucumber – 7.5.0
Java – 11
JUnit – 4.13.2
Rest Assured – 4.3.3
To execute tests using JUnit Tests and Gradle Tests, we need to create a JUnit TestRunner.
Steps to follow
Create a Gradle Java Project.
Add Rest-Assured and Cucumber dependencies to the Gradle project
Add Configuration to build.gradle
Add Gradle Cucumber Task to build.gradle
Create a feature file under src/test/resources
Create the Step Definition class or Glue Code for the Test Scenario
Run the tests from Command Line
Step 1 – Create a Gradle project
Step 2 – Add the below-mentioned dependencies in the Gradle project inbuild.gradle.
plugins {
// Apply the java-library plugin to add support for Java Library
id 'java-library'
}
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
mavenCentral()
}
dependencies {
// This dependency is exported to consumers, that is to say found on their compile classpath.
api 'org.apache.commons:commons-math3:3.6.1'
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:29.0-jre'
// Use JUnit test framework
testImplementation 'junit:junit:4.13'
testImplementation 'io.cucumber:cucumber-java:6.6.1'
testImplementation 'io.cucumber:cucumber-junit:6.6.1'
testImplementation 'io.rest-assured:rest-assured:4.3.3'
}
Here, task cucumber will execute all the tests present in the project irrespective of the number of feature files and scenarios within the feature file.
Step 5 – Create a feature file under src/test/resources
I have created 2 sample feature files – API_GetExample.feature and API_PostExample.feature.
Below is the API_GetExample.feature
@getexample
Feature: Validation of get method
@GetUserDetails
Scenario Outline: Send a valid Request to get user details
Given I send a request to the URL to get user details
Then the response will return status 200 and id <id> and salary <employee_salary> and name "<employee_name>" and age <employee_age> and message "<message>"
Examples:
|id |employee_salary|employee_name |employee_age |message |
|1 |320800 |Tiger Nixon |61 |Successfully! Record has been fetched. |
@GetAllUsers
Scenario Outline: Send a valid Request to get the details of all the users
Given I send a request to the URL to get the details of all the users
Then the response will return status 200 and message "<message>"
Examples:
|message |
| Successfully! All records has been fetched. |
API_PostExample.feature
@postexample
Feature: Validation of POST method
@CreateUser
Scenario Outline: Send Request to create a user
Given I send a request to the URL to create a new user
Then the response will return status 200 and name "<employee_name>" and message "<message>"
Examples:
|employee_name |message |
|posttest |Successfully! Record has been added. |
1. Run Test from Command Line
1. Open the command prompt and change the directory to the project location.
cd C:\Users\Vibha\Projects\Vibha_Personal\Cucumber_Gradle_Demo
2. All feature files should be in src/test/resources and create the Cucumber Runner class as CucumberRunnerTest. Note:- The Runner class name should end with Test to execute the tests from Command Line
2. Running all Feature files or Tests from Command Line
The below command will run all the tests present in the project. As you can see, there are 2 feature files – API_GetExample.feature contains 2 scenarios, and API_PostExample.feature contains 1 scenario.
gradle cucumber
The below screenshot shows that Task: Cucumber is triggered.
The below screenshot shows that the tests are executed and the status of the tests.
3. Running a Feature file from Command Line
To run a particular feature, create a task – postexample for that feature in the build.gradle as shown in the below example.
Use the below-mentioned command to run the tests tagged with tag = GetUserDetails.
gradle cucumber -P tags=@GetUserDetails
5. Running a group of tests from Command Line
Below is the feature file
@getexample
Feature: Validation of get method
@GetUserDetails @SmokeTest
Scenario Outline: Send a valid Request to get a user details
Given I send a request to the URL to get user details
Then the response will return status 200 and id <id> and salary <employee_salary> and name "<employee_name>" and age <employee_age> and message "<message>"
Examples:
|id |employee_salary|employee_name |employee_age |message |
|1 |320800 |Tiger Nixon |61 |Successfully! Record has been fetched. |
@GetAllUsers
Scenario Outline: Send a valid Request to get the details of all the users
Given I send a request to the URL to get the details of all the users
Then the response will return status 200 and message "<message>"
Examples:
|message |
| Successfully! All records has been fetched. |
@GetInvalidUsers @SmokeTest
Scenario Outline: Send a valid Request to get the details of the invalid users
Given I send a request to the URL to get the details of the invalid user
Then the response will return status 200 and message "<message>"
Examples:
| message |
| Successfully! Record has been fetched. |
@GetInvalidUsers
Scenario Outline: Send a valid Request to get the details of the user with id 0
Given I send a request to the URL to get the details of the user with id 0
Then the response will return status 200 and message "<message>" and error "<errorMessage>"
Examples:
| message | errorMessage |
| Not found record. | id is empty |
@Test3
Scenario: Test 3
Given I send a request to the URL to get the details of the user3
Then the response will return successfully
@Test4
Scenario: Test 4
Given I send a request to the URL to get the details of the user4
Then the response will return successfully
I want to run 2 tests – @GetUserDetails and @GetInvalidUsers. I can create a task with the name of @SmokeTest and assign these scenarios wit h the same tag. The task will look like as shown below:
6. Skipping the execution of a group of tests from Command Line
In the below feature file, I have marked 4 tests as “@Ignore” and 2 are valid.
Feature: Validation of get method
@GetUserDetails @SmokeTest
Scenario Outline: Send a valid Request to get a user details
Given I send a request to the URL to get user details
Then the response will return status 200 and id <id> and salary <employee_salary> and name "<employee_name>" and age <employee_age> and message "<message>"
Examples:
|id |employee_salary|employee_name |employee_age |message |
|1 |320800 |Tiger Nixon |61 |Successfully! Record has been fetched. |
@GetAllUsers @Ignore
Scenario Outline: Send a valid Request to get the details of all the users
Given I send a request to the URL to get the details of all the users
Then the response will return status 200 and message "<message>"
Examples:
|message |
| Successfully! All records has been fetched. |
@GetInvalidUsers @SmokeTest @Ignore
Scenario Outline: Send a valid Request to get the details of the invalid users
Given I send a request to the URL to get the details of the invalid user
Then the response will return status 200 and message "<message>"
Examples:
| message |
| Successfully! Record has been fetched. |
@GetInvalidUsers @Ignore
Scenario Outline: Send a valid Request to get the details of the user with id 0
Given I send a request to the URL to get the details of the user with id 0
Then the response will return status 200 and message "<message>" and error "<errorMessage>"
Examples:
| message | errorMessage |
| Not found record. | id is empty |
@Test3 @Ignore
Scenario: Test 3
Given I send a request to the URL to get the details of the user3
Then the response will return successfully
@Test4
Scenario: Test 4
Given I send a request to the URL to get the details of the user4
Then the response will return successfully
Add the below-mentioned tag in the build.gradle.
def tags = (findProperty('tags') == null) ? 'not @Ignore' : findProperty('tags') + ' and not @Ignore'
Use the below-mentioned command to run the tests.
gradle cucumber
The program will execute only 2 tests and will skip the rest 4 tests. The output of the above program is
If I use the tag @SmokeTest here in the command line, then it will run all the tests tagged with @SmokeTest, but will ignore the tests tagged with @Ignore. So, in this case, it will run only 1 test – @GetUserDetails.
Page Object Model(POM) is an object design pattern in Selenium webdriver which tells how to organize the object repository. In this case, we refer to web elements as Objects. Page Object Model(POM) is not a Test Framework.
In the Page Object Model (POM), each web page is represented as a separate class. For example, consider HRM website. It has many web pages like Login , Dashboard , Assign Leave, Leave List, Timesheets, etc. Under this model, for each web page in the application, there should be a corresponding Page Class. This Page class will identify the WebElements of that web page and also contains Page methods that perform operations on those WebElements.
If a new web element is added or an existing web element is updated, then you can add or update that web element in object repository by navigating to class which has same name as webpage.
The object repository is independent of test cases, so we can use the same object repository for a different purpose with different tools. For example, we can integrate Page Object Model in Selenium with TestNG/JUnit for functional Testing and at the same time with JBehave/Cucumber for acceptance testing.
POM enhances test maintenance, readability and reducing code duplication.
In this tutorial, I’m creating a project using Page Object Model as Design Pattern and TestNG as the Test Automation Framework.
Steps to create a Page Object Model Project
Download and Install Java on system
Download and setup Eclipse IDE on system
Setup Maven
Create a new Maven Project
Add dependencies to pom.xml
Create Page Class for each page – LoginPage.Java and DashboardPage.java
Create tests for each Page – BaseTests, LoginTests and DashboardTests
Create a TestNG.XML
Run the tests from TestNG.xml
TestNG Report Generation
Step 1- Download and Install Java
Click here to know How to install Java. To check if Java is already installed on your machine, use the below command in the command line. This command will show the version of Java installed on your machine.
java -version
Step 2 – Download and setup Eclipse IDE on system
The Eclipse IDE (integrated development environment) provides strong support for Java developer. The Eclipse IDE for Java Developers distribution is designed to support standard Java development. It includes support for the Maven and Gradle build system and support for the Git version control system. Click here to know How to install Eclipse.
Step 3 – Setup Maven
To build a test framework, we need to add a number of dependencies to the project. It is very tedious and cumbersome process to add each dependency manually. So, to overcome this problem, we use a build management tool. Maven is a build management tool which is used to define project structure, dependencies, build, and test management. Click here to know How to install Maven.
To know if Maven is already installed or not on your machine, type this command in the command line. This command will show the version of Maven installed on your machine.
Step 6 – Create Page Class for each page – LoginPage.Java and DashboardPage.java
I want to test 2 pages – Login and Dashboard. So, I’m creating 2 seperate class. Each class will contain its web elements and methods of that page.
LoginPage.Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class LoginPage {
WebDriver driver;
By userName = By.name("txtUsername");
By password = By.name("txtPassword");
By titleText = By.id("logInPanelHeading");
By login = By.id("btnLogin");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
// Set user name in textbox
public void setUserName(String strUserName) {
driver.findElement(userName).sendKeys(strUserName);
}
// Set password in password textbox
public void setPassword(String strPassword) {
driver.findElement(password).sendKeys(strPassword);
}
// Click on login button
public void clickLogin() {
driver.findElement(login).click();
}
// Get the title of Login Page
public String getLoginTitle() {
return driver.findElement(titleText).getText();
}
public void login(String strUserName, String strPasword) {
// Fill user name
this.setUserName(strUserName);
// Fill password
this.setPassword(strPasword);
// Click Login button
this.clickLogin();
}
}
DashboardPage.java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class DashboardPage {
WebDriver driver;
By homePageUserName = By.id("welcome");
public DashboardPage(WebDriver driver) {
this.driver = driver;
}
// Get the User name from Home Page
public String getHomePageText() {
return driver.findElement(homePageUserName).getText();
}
}
Step 7 – Create tests for each Page – BaseTests, LoginTests and DashboardTests
Here, I have created 3 classes. BaseTest class to contain startUp and tearDown methods. These methods will run once before the after of every class. LoginTests and DashboardTests classes contain the tests related to LoginPage and DashboardPage respectively.
BaseTest
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import com.example.pageobjectmodel_demo.pages.DashboardPage;
import com.example.pageobjectmodel_demo.pages.LoginPage;
public class BaseTest {
public static WebDriver driver;
LoginPage objLogin;
DashboardPage objDashboardPage;
@BeforeClass
public void setup() {
System.setProperty("webdriver.gecko.driver",
"C:\\Users\\Vibha\\Software\\geckodriver-v0.26.0-win64\\geckodriver.exe");
driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://opensource-demo.orangehrmlive.com/");
}
@AfterClass
public void close() {
driver.close();
}
}
LoginTests
import org.testng.Assert;
import org.testng.annotations.Test;
import com.example.pageobjectmodel_demo.pages.DashboardPage;
import com.example.pageobjectmodel_demo.pages.LoginPage;
public class LoginTests extends BaseTest {
LoginPage objLogin;
DashboardPage objDashboardPage;
@Test(priority = 0)
public void loginTest() {
// Create Login Page object
objLogin = new LoginPage(driver);
// Verify login page text
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.contains("LOGIN Panel"));
}
}
DashboardTests
import org.testng.Assert;
import org.testng.annotations.Test;
import com.example.pageobjectmodel_demo.pages.DashboardPage;
import com.example.pageobjectmodel_demo.pages.LoginPage;
public class DashboardTests extends BaseTest {
LoginPage objLogin;
DashboardPage objDashboardPage;
@Test(priority = 0)
public void DasboardTest() {
objLogin = new LoginPage(driver);
// login to application
objLogin.login("Admin", "admin123");
// go the dashboard page
objDashboardPage = new DashboardPage(driver);
// Verify dashboard page
Assert.assertTrue(objDashboardPage.getHomePageText().contains("Welcome"));
}
}
Step 8 – Create a TestNG.XML
Here, I have mentioned 2 test classes. So, when I will run the tests from TestNG.xml, it will run the tests of both the classes. If will mention any one class, then the test of that particular class will be executed.
<?xml version = "1.0"encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "PageObjectModel">
<test name = "PageObjectModel Tests">
<classes>
<class name = "com.example.pageobjectmodel_demo.tests.LoginTests"/>
<class name = "com.example.pageobjectmodel_demo.tests.DashboardTests"/>
</classes>
</test>
</suite>
Step 9 – Run the tests from TestNG.xml
Right click on TestNG.xml and select Run As TestNG Suite.
The execution status looks like as shown below.
Step 10 – TestNG Report Generation
Once the execution is finished, refresh the project. It will create a test-output folder containing various reports generated by TestNG. Below is the screenshot of the report folder.
Image of Index.html report
Image of emailable-report.html
Cheers! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!
‘Iterator’ is an interface which belongs to collection framework. It allows us to traverse the collection, access the data element and remove the data elements of the collection.
java.util package has public interface Iterator and contains three methods:
boolean hasNext(): It returns true if Iterator has more element to iterate.
Object next(): It returns the next element in the collection until the hasNext()method return true. This method throws ‘NoSuchElementException’ if there is no next element.
void remove(): It removes from the underlying collection the last element returned by this iterator (optional operation). This method can be called only once per call to next(). The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
forEachRemaining– Performs the given action for each remaining element until all elements have been processed or the action throws an exception. Actions are performed in the order of iteration, if that order is specified. Exceptions thrown by the action are relayed to the caller.
Below is an example of use of Iterator. The iterator() method is used to get an iterator for any collection:
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<String> cars = new ArrayList<String>();
cars.add("Audi");
cars.add("BMW");
cars.add("Ford");
cars.add("Duster");
// Get the iterator
Iterator<String> it = cars.iterator();
// Print the first item
System.out.println("First element from list :"+it.next());
}
}
Output
First element from list :Audi
Looping through Collection
In the below example, we are looping through the collection using hasNext() and next() methods of Iterator.
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<String> cars = new ArrayList<String>();
cars.add("Audi");
cars.add("BMW");
cars.add("Ford");
cars.add("Duster");
// Get the iterator
Iterator<String> iterator = cars.iterator();
System.out.println("List elements : ");
while (iterator.hasNext())
System.out.print(iterator.next() + " ");
System.out.println();
}
}
Output
List elements :
Audi BMW Ford Duster
Removing elements from Collection
Iterators are designed to easily change the collections that they loop through. The remove() method can remove items from a collection while looping. In the below example, I’m deleting the items whose reminder are not 0.
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(20);
numbers.add(8);
numbers.add(10);
numbers.add(50);
// Get the iterator
Iterator<Integer> it = numbers.iterator();
System.out.println("List of Numbers : ");
while (it.hasNext()) {
Integer i = it.next();
if (i / 10 == 0) {
it.remove();
}
}
System.out.println(numbers);
}
}
Output
List of Numbers :
[20, 10, 50]
I hope you are cleared about Iterators now. Enjoy learning. Cheers!!
A HashMap stores items in “key/value”pairs, and you can access them by an index of another type (e.g. a String).
One object is used as a key (index) to another object (value). It can store different types: String keys and Integer values, or the same type, like String keys and String values. We need to import java.util.HashMap or its superclass in order to use the HashMap class and methods.
It is not an ordered collection, which means it does not return the keys and values in the same order in which they have been inserted into the HashMap.
HashMap<String, String> employeeDetail = new HashMap<String, String>();
HashMap<String, String> employeeDetail = new HashMap<>();
HashMap<String, Integer> employeeDetail = new HashMap<String, Integer>();
Add Items
Below is an example where we are adding items to HashMap by using put() method.
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
/* This is how to declare HashMap of key and Value as String */
HashMap<String, String> employeeDetail = new HashMap<String, String>();
// Add keys and values (Name, Designation)
employeeDetail.put("Tim", "DBA");
employeeDetail.put("Dong", "SDET");
employeeDetail.put("Nisha", "BA");
employeeDetail.put("Ulana", "Dev");
System.out.println("Detail of Employees :" + employeeDetail);
}
}
The output of the above program is
Below is an example where we are adding items to HashMap by using put() method.
Here, the key is String, and the Value is Integer.
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
// Combination of String(key) and Integer(value)
HashMap<String, Integer> employeeAge = new HashMap<String, Integer>();
// Add keys and values (Name, Age)
employeeAge.put("Tim", 25);
employeeAge.put("Dong", 26);
employeeAge.put("Nisha", 29);
employeeAge.put("Ulana", 34);
System.out.println("Age of Employees :" + employeeAge);
}
}
The output of the above program is
Access an Item
To access a value in the HashMap, use the get() method and refer to its key:-
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
// Combination of String(key) and Integer(value)
HashMap<String, Integer> employeeAge = new HashMap<String, Integer>();
// Add keys and values (Name, Age)
employeeAge.put("Tim", 25);
employeeAge.put("Dong", 26);
employeeAge.put("Nisha", 29);
employeeAge.put("Ulana", 34);
System.out.println("Age of Employees :"+ employeeAge);
// Access a value
System.out.println("Access Value of Key Nisha :" + employeeAge.get("Nisha"));
}
}
The output of the above program is
Remove an Item
To remove an item, use the remove() method and refer to the key:
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
// Combination of String(key) and Integer(value)
HashMap<String, Integer> employeeAge = new HashMap<String, Integer>();
// Add keys and values (Name, Age)
employeeAge.put("Tim", 25);
employeeAge.put("Dong", 26);
employeeAge.put("Nisha", 29);
employeeAge.put("Ulana", 34);
System.out.println("Age of Employees :" + employeeAge);
// To remove an item, use the remove() method and refer to the key
employeeAge.remove("Ulana");
System.out.println("List of Employee after removing Ulana :" + employeeAge);
}
}
The output of the above program is
To remove all items, use the clear()method:-
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
// Combination of String(key) and Integer(value)
HashMap<String, Integer> employeeAge = new HashMap<String, Integer>();
// Add keys and values (Name, Age)
employeeAge.put("Tim", 25);
employeeAge.put("Dong", 26);
employeeAge.put("Nisha", 29);
employeeAge.put("Ulana", 34);
System.out.println("Age of Employees :" + employeeAge);
// To remove all items, use the clear() method:
employeeAge.clear();
System.out.println("List of Employes after clear:" + employeeAge);
}
}
The output of the above program is
Checking whether HashMap is empty or not
We are using isEmpty() method of the HashMap class to perform this check.
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
/* This is how to declare HashMap */
HashMap<String, String> employeeDetail = new HashMap<String, String>();
// Add keys and values (Name, Designation)
employeeDetail.put("Tim", "DBA");
employeeDetail.put("Dong", "SDET");
employeeDetail.put("Nisha", "BA");
employeeDetail.put("Ulana", "Dev");
System.out.println("Detail of Employees :" + employeeDetail);
// Checking whether HashMap is empty or not
System.out.println("Is HashMap Empty? " + employeeDetail.isEmpty());
// Delete all items from HasMap
employeeDetail.clear();
System.out.println("Is HashMap Empty now? " + employeeDetail.isEmpty());
}
}
The output of the above program is
Check if a particular key exists in HashMap
We will be using containsKey() method of the HashMap class to perform this check. This method returns a boolean value.
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
/* This is how to declare HashMap */
HashMap<String, String> employeeDetail = new HashMap<String, String>();
// Add keys and values (Name, Designation)
employeeDetail.put("Tim", "DBA");
employeeDetail.put("Dong", "SDET");
employeeDetail.put("Nisha", "BA");
employeeDetail.put("Ulana", "Dev");
System.out.println("Detail of Employees :" + employeeDetail);
// Check if a particular key exists in HashMap
boolean flag = employeeDetail.containsKey("Nisha");
System.out.println("Key Nisha exists in HashMap? : " + flag);
boolean flag1 = employeeDetail.containsKey("Shawn");
System.out.println("Key Shawn exists in HashMap? : " + flag1);
}
}
The output of the above program is
Check if a particular value exists in HashMap
We will be using containsValue()method of the HashMap class to perform this check.
import java.util.HashMap;
public class HashMap_Demo {
public static void main(String[] args) {
/* This is how to declare HashMap */
HashMap<String, String> employeeDetail = new HashMap<String, String>();
// Add keys and values (Name, Designation)
employeeDetail.put("Tim", "DBA");
employeeDetail.put("Dong", "SDET");
employeeDetail.put("Nisha", "BA");
employeeDetail.put("Ulana", "Dev");
System.out.println("Detail of Employees :" + employeeDetail);
// Check if a particular value exists in HashMap
boolean valueExists = employeeDetail.containsValue("Dev");
System.out.println("String Dev exists in HashMap? : " + valueExists);
boolean valueNotExists = employeeDetail.containsValue("Test");
System.out.println("String Test exists in HashMap? : " + valueNotExists);
}
}
The output of the above program is
We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!
Selects the specified property in a parent object.
[‘property’]
Selects the specified property in a parent object. Be sure to put single quotes around the property name.Tip: Use this notation if the property name contains special characters such as spaces, or begins with a character other than A..Za..z_.
[n]
Selects the n-th element from an array. Indexes are 0-based.
[index1,index2,…]
Selects array elements with the specified indexes. Returns a list.
..property
Recursive descent: Searches for the specified property name recursively and returns an array of all values with this property name. Always returns a list, even if just one property is found.
*
Wildcard selects all elements in an object or an array, regardless of their names or indexes.
[start:end] [start:]
Selects array elements from the start index and up to, but not including, end index. If end is omitted, selects all elements from start until the end of the array. Returns a list.
[:n]
Selects the first n elements of the array. Returns a list.
[-n:]
Selects the last n elements of the array. Returns a list.
[?(expression)]
Selects all elements in an object or array that match the specified filter. Returns a list.
[(expression)]
Script expressions can be used instead of explicit property names or indexes. An example is [(@.length-1)] which selects the last item in an array. Here, length refers to the length of the current array rather than a JSON field named length.
@
Used in filter expressions to refer to the current node being processed.
Below is the sample JSON which I am using for extraction examples. I have saved this file in resources/Payloads as test.json.
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
To extract all books present in the store:-
String allBooks = JsonPath.read(jsonString, "$..*").toString();
System.out.println("--------------- All books in the store --------------");
System.out.println(allBooks);
The complete program looks like as shown below:
import com.jayway.jsonpath.JsonPath;
public class JsonPath_Demo {
public static void main(String args[]) {
String jsonString = new String(Files.readAllBytes(Paths.get("src/test/resources/Payloads/test.json")));
String allBooks = JsonPath.read(jsonString, "$..*").toString();
System.out.println("--------------- All books in the store --------------");
System.out.println(allBooks);
}
}
The output of the above program is
Below are examples that show how to extract different nodes from a JSON Body. I have used the above JSON Body for these examples.
// All bicycles in the store
String allBicycles = JsonPath.read(jsonString, "$..bicycle").toString();
System.out.println("--------------- All bicycles in the store ---------------");
System.out.println(allBicycles);
// The number of books
String noOfBooks = JsonPath.read(jsonString, "$..book.length()").toString();
System.out.println("--------------- The number of books ---------------");
System.out.println(noOfBooks);
// The authors of all books
String authors = JsonPath.read(jsonString, "$.store.book[*].author").toString();
System.out.println("--------------- Author of all Books ---------------");
System.out.println(authors);
// All authors
String allAuthors = JsonPath.read(jsonString, "$..author").toString();
System.out.println("--------------- All Authors ---------------");
System.out.println(allAuthors);
// All details of the store
String store = JsonPath.read(jsonString, "$.store.*").toString();
System.out.println("--------------- All details of the store ---------------");
System.out.println(store);
// Price of store
String storePrice = JsonPath.read(jsonString, "$.store..price").toString();
System.out.println("--------------- price of store ---------------");
System.out.println(storePrice);
The output of the above program is
Below are the examples where I have extracted specific book (nodes) from the JSON body.
// Third book
String thirdBook = JsonPath.read(jsonString, "$..book[2]").toString();
System.out.println("--------------- third book ---------------");
System.out.println(thirdBook);
// first Last Book
String firstLastBook = JsonPath.read(jsonString, "$..book[-1]").toString();
System.out.println("--------------- first Last Book ---------------");
System.out.println(firstLastBook);
// first two Books
String firstTwoBooks = JsonPath.read(jsonString, "$..book[0,1]").toString();
System.out.println("--------------- first Two Books ---------------");
System.out.println(firstTwoBooks);
// books from index 0 (inclusive) until index 2 (exclusive)
String booksRange = JsonPath.read(jsonString, "$..book[:2]").toString();
System.out.println("--------------- books from index 0 (inclusive) until index 2 (exclusive) ---------------");
System.out.println(booksRange);
// All books from index 1 (inclusive) until index 2 (exclusive)
String booksRange1 = JsonPath.read(jsonString, "$..book[1:2]").toString();
System.out.println("------------ All books from index 1 (inclusive) until index 2 (exclusive) -----------");
System.out.println(booksRange1);
// Book number one from tail
String bottomBook = JsonPath.read(jsonString, "$..book[1:]").toString();
System.out.println("--------------- Book number one from tail ---------------");
System.out.println(bottomBook);
The output of the above program is
Filters are logical expressions used to filter arrays. Below are examples of a JSONPath expression with the filters.
// All books in store expensive than 10
String expensiveBook = JsonPath.read(jsonString, "$.store.book[?(@.price > 10)]").toString();
System.out.println("--------------- All books in store costlier than 10 ---------------");
System.out.println(expensiveBook);
// All books in store that are not "expensive"
String notExpensiveBook = JsonPath.read(jsonString, "$..book[?(@.price <= $['expensive'])]").toString();
System.out.println("--------------- All books in store that are not expensive ---------------");
System.out.println(notExpensiveBook);
// All books in store that are equal to price 8.95
String comparePrice = JsonPath.read(jsonString, "$.store.book[?(@.price == 8.95)]").toString();
System.out.println("--------------- All books in store that are not expensive ---------------");
System.out.println(comparePrice);
// All books matching regex (ignore case)
String regxExample = JsonPath.read(jsonString, "$..book[?(@.author =~ /.*REES/i)]").toString();
System.out.println("--------------- All books matching regex (ignore case) ---------------");
System.out.println(regxExample);
// All books with price equal to mentioned list of prices
String priceList = JsonPath.read(jsonString, "$..book[?(@.price in ['12.99', '8.99'])]").toString();
System.out.println("--------------- All books with price equal to mentioned list of prices ---------------");
System.out.println(priceList);
// All books with price NOT equal to mentioned list of prices
String excludePriceList = JsonPath.read(jsonString, "$..book[?(@.price nin ['12.99', '8.99'])]").toString();
System.out.println("---------- All books with price NOT equal to mentioned list of prices ---------");
System.out.println(excludePriceList);
// All books with specified substring (case-sensitive)
String substringExample = JsonPath.read(jsonString, "$..book[?(@.author contains 'Melville')]").toString();
System.out.println("--------------- All books with specified substring (case-sensitive) ---------------");
System.out.println(substringExample);
// All books with an ISBN number
String specificBook = JsonPath.read(jsonString, "$..book[?(@.isbn)]").toString();
System.out.println("--------------- All books with an ISBN number ---------------");
System.out.println(specificBook);
The output of the above program is
We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!
In the last tutorial, I explained How to test POST Request using Rest Assured where the request body is in String Format. In this tutorial, I will create a request body using JSON Object in Rest Assured. This request body can be used for POST or PUT operations.
In the previous post, you must have observed that I had hard-coded the JSON request body in a string format. It is not a good practice if you have a dynamic payload or want to create a payload at run time or parameterized one. It is always recommended to create a payload in a way that is easy to maintain. You should manage, update, and retrieve value from it easily. This can be achieved by JSONObjector JSONArray.
A JSONObjectis an unordered collection of key and value pairs, resembling Java’s native Map implementations. JSON stores data as a key-value pair. The key is the left side and the value is the right side, and a semicolon is used to separate both. One key-value pair is separated from another key-value pair using a comma (,).
The internal form is an object having the get and opt methods for accessing the values by name and put methods for adding or replacing values by name. The values can be any of these types:Boolean, JSONArray, JSONObject, Number, String, or JSONObject.NULL object.
To create a request body using JSON Object, we need to add a Maven dependency.
JSONObjectexposes an API similar to Java’s Map interface. Below is an example of creating a request from a JSON Object. Here, Id is the auto-generated attribute. We are using the put() method and supply the key and value as an argument. I am using a logger just to print the JSON body in the Console.
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.json.JSONObject;
import org.junit.Test;
import static org.hamcrest.Matchers.equalTo;
public class Json_Demo {
@Test
public void passBodyAsJsonObject() {
JSONObject data = new JSONObject();
data.put("employee_name", "MapTest");
data.put("profile_image", "test.png");
data.put("employee_age", "30");
data.put("employee_salary", "11111");
RestAssured
.given()
.contentType(ContentType.JSON)
.body(data.toString())
.log().all()
.when()
.post("https://dummy.restapiexample.com/api/v1/create")
.then()
.assertThat().statusCode(200)
.body("data.employee_name", equalTo("MapTest"))
.body("data.employee_age", equalTo("30"))
.body("data.employee_salary", equalTo("11111"))
.body("data.profile_image", equalTo("test.png"))
.body("message", equalTo("Successfully! Record has been added."))
.log().all();
}
}
The request body will look as shown below:-
The texts produced by the toString() methods strictly conform to the JSON syntax rules.
.body(data.toString())
The above one is a simple JSON Request Body. Let’s take an example of a Complex Request Body or nested Request Body.
We need to create two JSONObject here. One will hold overall key-value pairs, and another JSONObject will hold only employee_details key-value pairs.
Below is an example that shows how to create a complex JSON request body using JSONObject.
@Test
public void passBodyAsJsonObjectDemo() {
//First JSONObject
JSONObject data = new JSONObject();
data.put("profile_image", "test.png");
//Second JSONObject
JSONObject detail = new JSONObject();
detail.put("updated_message", "Details of New Resource");
detail.put("employee_age", "30");
data.put("employee_details", detail);
data.put("employee_name", "MapTest");
data.put("employee_salary", "11111");
RestAssured
.given()
.contentType(ContentType.JSON)
.body(data.toString())
.log().all()
.when()
.post("http://dummy.restapiexample.com/api/v1/create")
.then()
.assertThat().statusCode(200)
.body("data.employee_name", equalTo("MapTest"))
.body("data.employee_details.employee_age", equalTo("30"))
.body("data.employee_details.updated_message", equalTo("Details of New Resource"))
.body("data.employee_salary", equalTo("11111")).body("data.profile_image", equalTo("test.png"))
.body("message", equalTo("Successfully! Record has been added."))
.log().all();
}
}
The request body will look as shown below:-
We are done. Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!
In the previous tutorial, I have provided the Introduction of Rest Assured. In this tutorial, I will explain how to setup basic Rest Assured Gradle project in Eclipse IDE. Before going through this tutorial, it is recommended to go through previous tutorial to know about Rest Assured.
What is Gradle?
Gradle is an open-source build automation tool that is designed to be flexible enough to build almost any type of software. A build automation tool is used to automate the creation of applications. The building process includes compiling, linking, and packaging the code. The process becomes more consistent with the help of building automation tools.
Steps to setup Rest Assured Gradle Project in Eclipse
Download and Install Java on the system
Download and setup Eclipse IDE on the system
Setup Gradle on System
Create a new Gradle Project
Add Rest-Assured dependencies to the project
Step 1- Download and Install Java
Rest-Assured needs Java to be installed on the system to run the tests. Check if Java is installed on your machine or not by using the below command on Command Prompt.
Step 2 – Download and setup Eclipse IDE on the system
The Eclipse IDE (integrated development environment) provides strong support for Java developers. If Eclipse IDE is already not present on your system, then click here to know How to install Eclipse.
Step 3 – Setup Gradle
To build a test framework, we need to add several dependencies to the project. This can be achieved by any build Tool. I have used Gradle Build Tool. Click here to know How to install Gradle.
Step 4 – Create a new Gradle Project
To know, in detail, how to create a Gradle project in Eclipse, refer to this link.
File ->New Project ->Gradle Project ->Next.
Provide projectname and location where you want to save the project on your system. Click the Finish Button.
Verify the Gradle Version and Gradle project structure name. Click the Finish Button.
Below is the structure of the new Gradle project.
Below is the structure and content of the build.gradle of the new project.
Step 5 – Add Rest-Assured dependencies to the project
Add Rest-Assured, JSON Schema Validator, and JUnit dependencies to the project.
// Use rest assured
testImplementation 'io.rest-assured:rest-assured:4.3.3'
testImplementation 'io.rest-assured:json-schema-validator:4.3.3'
Step 6 – Below are the Rest Assured, json schema validator, junit jar files present under Maven Dependencies.
Make sure you right-click on project -> Select Gradle ->Refresh Gradle Project. It is needed to see the new jar files in the project.
That’s it! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers
In the previous tutorial, I have explained about How to add Formulas in Excel in Java. In this tutorial, I will explain How to customize the style of cells in Excel in Java using Apache POI.
I’m using Apache POI to write data to the excel file. To download and install Apache POI, refer here.
If you are using maven, then you need to add below dependency in pom.xml.
In the previous tutorial, I explained about creating a new Excel file and writing data in that new Excel file using Java. In this tutorial, I will explain How to open and update existing Excel files in Java.
I’m using Apache POI to write data to the Excel file. To download and install Apache POI, refer here.
If you are using Maven, then you need to add the below dependency in pom.xml.
To know more about various interfaces and classes for managing Excel, pleaserefer to this tutorial.
In the below example, I have an existing Excel with the name “EmployeeDetails.xlsx”.
This is Excel which I am going to update. I will add 2 rows below the last row in Excel.
Below is a complete example of updating the data in existing Excel. One thing we need to note here is that we can update the Excel file only when we close it first.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelFileUpdateExample {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream(new File("EmployeeDetails.xlsx"));
// Create object of XSSFWorkbook class
XSSFWorkbook workbook = new XSSFWorkbook(fis);
// Create object of XSSFWorkbook class
XSSFSheet sheet = workbook.getSheet("Write_TestData");
Object[][] bookData = { { "SeleniumTest", "0000A", 9999 }, { "JavaTest", "0000B", 9990 }, };
// Get last row in Sheet
int rowCount = sheet.getLastRowNum();
for (Object[] Book : bookData) {
// Create row for all the new data
XSSFRow row = sheet.createRow(++rowCount);
int columnCount = 0;
// Create new cell for each row
XSSFCell cell = row.createCell(columnCount);
for (Object field : Book) {
cell = row.createCell(columnCount++);
if (field instanceof String) {
cell.setCellValue((String) field);
} else if (field instanceof Integer) {
cell.setCellValue((Integer) field);
}
}
}
fis.close();
// Write the workbook in file system
FileOutputStream outputStream = new FileOutputStream("EmployeeDetails.xlsx");
workbook.write(outputStream);
System.out.println("Excel is updated successfully");
// Close the workbook
workbook.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
The output of the above program is
Below is the updated Excel.
Update a specific cell in the Excel file
In the below example, I will update the value in a specific cell. As you can see in the above image, I will update, 1004S to “Updated Value”. Below is the code snippet for the same.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class UpdateExcelDemo {
public static void main(String[] args) {
try {
// Create an object of FileInputStream class to read excel file
FileInputStream fis = new FileInputStream(new File("EmployeeDetails.xlsx"));
// Create object of XSSFWorkbook class
XSSFWorkbook workbook = new XSSFWorkbook(fis);
// Read excel sheet by sheet name
XSSFSheet sheet = workbook.getSheet("Write_TestData");
// Print data present at row 0 column 2
System.out.println(sheet.getRow(4).getCell(1).getStringCellValue());
// Get the Cell at index 3 from the above row
XSSFCell cell = sheet.getRow(4).getCell(1);
cell.setCellType(CellType.STRING);
cell.setCellValue("Updated Value");
// Write the output to the file
FileOutputStream fileOut = new FileOutputStream(new File("EmployeeDetails.xlsx"));
workbook.write(fileOut);
System.out.println("Id column in Excel is updated successfully");
fileOut.close();
// Closing the workbook
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
The output of the above program is
Below is the updated Excel.
That’s it! Well done.
Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!