JMeter Authorization with access token

Last Updated on

HOME

Authorization with a dynamic access token is used to pass dynamic response content to subsequent requests. This is used to validate API authorization.

In this post, we will discuss fetching an access token (dynamic response) with the help of JSON Extractor. We will also show how to pass it as a parameter in the subsequent request using BeanShell Assertion.

Table of Contents:

To achieve authorization with access token, we need to create 2 Thread Groups:

Thread Group 1 – To generate Access Token  
Thread Group 2 – To pass Access Token to Request 

Step 1 – Add Thread Group 1: Thread Group – Authorization Token Generation

1. Add Thread Group

We should provide the name of the Thread Group. In this case, this thread group is used to generate the token, so named Token Generation. We want to generate only 1 token, so the Number of Threads, Ramp-up period, and Loop Count are 1 only.

2. Add HTTP Request Sampler

In the HTTP Request Control Panel, the Path field indicates which URL request you want to send

 To add: Right-click on Thread Group and select: Add -> Sampler -> HTTP Request

Add valid credentials in the parameters section.

3. Add HTTP Header Manager 

The Header Manager lets you add or override HTTP request headers like can add Accept-Encoding, Accept, Cache-Control

To add: Right-click on Thread Group and select: Add -> Config Element -> HTTP Read Manager

Add Authorization as Headers in Header Manager 

4. Add JSON Extractor

To extract the authentication token from the request, we are going to use JMeter JSON Extractor. The process of extracting a variable from a response works as mentioned below:

First, the server sends back a response. Then a post-processor, like the JSON Extractor, executes. It extracts part of the response and puts it into a variable like ${token}.

To add: Right-click on Thread Group and select: Add -> Post Processors -> JSON Extractor

The JSON extractor requires us to follow a few steps, so we can process the JSON correctly.

1) Name – JSON Extractor
2) Apply to – we will use the defaulted Main Sample Only. The option is: The main sample only – the assertion only applies to the main sample
3) Name of created variables – BEARER
4) JSON Path Expressions – access_token

5. Add BeanShell Assertion 

An advanced assertion with full access to JMeter API. Java conditional logic can be used to set the assertion result.

To add: Right-click on Thread Group and select: Add -> Assertions -> BeanShell Assertions

Add the below-mentioned script in the Script section of BeanShell Assertion

${__setProperty(BEARER, ${BEARER})};

Step 2 – Add Thread Group 2: Thread Group – Main Request

1. Add Thread Group

Provide a name to this Thread Group. I have also provided the number of threads, ramp-up, and duration in the thread group as shown in the image

We can parameterize the values of the number of threads. We can also do this for the ramp-up period and duration. This is done using a JMeter property called ___P. You can ask why we are using the property function in JMeter. It is because this makes the JMeter script configurable. We can pass any value through the command line without making any changes in the script.

___P – This is a simplified property function that is intended for use with properties defined on the command line. 

If no default value is supplied, it is assumed to be 1. The value of 1 was chosen because it is valid for common test variables such as loops, thread count, ramp-up, etc.

${__P(group1.threads)} – return the value of group1.threads

${__P(THREADS,1)} – This THREADS value will be passed through command line. If no value is passed, by default, it will choose 1.

Similarly, ramp-up and duration are parameterized.

${__P(THREADS,1)}
${__P(RAMPUP,1)}
${__P(DURATION,1)}

2. Add HTTP Request Sampler

Below-mentioned are the values used in HTTP Request to perform the test

Add a valid request body in the Body Data section (if the request is POST).

3. Add HTTP Header Manager

We have previously extracted the token from the Token Generation request. Now, it’s time to reuse it in the header section of HTTP Header Manager.

Below are the values used in the HTTP Request to perform the test.

Authorization = Bearer ${__property(BEARER)}

Step 3 – Adding Listeners to the Test Plan

Listeners – They show the results of the test execution. They can show results in a different format such as a tree, table, graph, or log file

We have added listeners – View Result Tree 

View Result Tree – View Result Tree shows the results of the user request in basic HTML format

To add: Right-click Test Plan, Add -> Listener -> View Result Tree

Step 4 – Save the Test Plan

To Save: Click File Select -> Save Test Plan as ->Give the name of the Test Plan. It will be saved as .jmx format.

Step 5  – Run the Test Plan

Click on Green Triangle as shown at the top to run the test.

Step 6 – View the Execution Status

Click on View Result Tree to see the status of Run. A successful request will be of a Green colour in the Text Section

Here, we can see that the Token Generation request is successfully processed.

The below image shows that the Main Request is successfully executed too.

    Congratulation!! We can add an authorization token generated by a request add it to another request and process the request using JMeter. 

    How to download and install Apache JMeter
    How to send GET Requests in JMeter
    How to send POST requests in JMeter
    Install Apache JMeter in Ubuntu
    Constant Throughput Timer in JMeter

    How to run scheduled jobs using GitLab CI/CD

    Last Updated On

    HOME

    This tutorial explains the process to schedule the run of the GitLab pipeline. This is a very important step towards achieving CI/CD.

    Table of Contents

    1. Prerequisite
    2. What is GitLab CI/CD Workflow?
    3. GitLab Section
      1. Create a blank project in GitLab
      2. Push the project from the local repository to GitLab Repository
      3. Create a .gitlab-ci.yml file in the project in GitLab
      4. Schedule the pipeline
      5. Verify that the job is scheduled
      6. Run the tests in the GitLab pipeline
      7. Check the status of the pipeline
      8. Download the report
    4. How to schedule a cron job?

    Prerequisite:

    1. GitLab Account

    Please refer to this tutorial to get the structure and code of the SpringBoot project – Testing of SpringBoot Application with JUnit5

    What is GitLab CI/CD Workflow?

    GitLab automatically enables CI/CD pipelines for new projects. It’s just a matter of adding a new configuration file called .gitlab-ci.yml to your code repository with instructions for GitLab on what to run. So simply create the following basic workflow in your main repository directory and commit it:

    By default, GitLab will have CI/CD pipelines and Auto DevOps enabled for all projects. What this means is that, when you push code to the repository, GitLab will automatically trigger the pipeline.

    GitLab Section

    Step 1 – Create a blank project in GitLab

    To know, how to create a blank new project in GitLab, please refer to How to create a new project in GitLab.

    Step 2 – Push the project from the local repository to GitLab Repository

    To know, how to push the changes to GitLab, please refer to How to push new local GIT Repository to GitLab.

    Step 3 – Create a .gitlab-ci.yml file in the project in GitLab

    There are many ways to create a new file in GitLab. One of the ways is to create a file as shown in the below image. I have already created a .gitlab-ci.yml in the project, which can be seen in the image.

    It is a YAML file where you configure specific instructions for GitLab CI/CD. In the .gitlab-ci.yml, we can define:

    • The scripts you want to run.
    • Other configuration files and templates you want to include.
    • Dependencies and caches.
    • The commands you want to run in sequence and those you want to run in parallel.
    • The location to deploy your application to.
    • Whether you want to run the scripts automatically or trigger any of them manually.

    Below is a sample example to run the SpringBoot project (Maven) in the GitLab pipeline.

    image: maven:3.8.5-openjdk-17
     
    stages:
      - test
     
    variables:
      MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
     
    test:
      stage: test
      allow_failure: true
     
    # Run the tests
      script:
        - echo "Executing SpringBoot scenarios with maven"
        - mvn clean test site
     
    # Store artifacts
      artifacts:
        when: always
        name: "SpringBoot Report"
        paths:
        - target/site/*
        expire_in: 24 h
    

    Image – maven:3.8.5-openjdk-17 is used in this test. It is a docker image for Maven and has Java 17 installed in it.

    Pipeline configuration begins with jobs. Jobs are the most fundamental element of a  .gitlab-ci.yml file.

    Jobs can output an archive of files and directories. This output is known as a job artifact. The expire_in keyword determines how long GitLab keeps the job artifacts. Here, it shows 24 hrs to retain the artifacts.

    Step 4 – Schedule the pipeline

    To schedule the pipeline, go to the left panel and click on the Build option. There are several sub-options in the Build option, click on the Pipeline Schedules.

    Click on the button “New Schedule” to create a schedule for the pipeline.

    To add a pipeline schedule, we need to fill in the details displayed on this page.

    1. Description – Provide the description of the project
    2. Interval Pattern – Select one of the preconfigured intervals, or enter a custom interval in cron notation. Here, I have used 30 16 * * *, which means the job is scheduled to run every day at 4:30 PM.
    3. Cron TimeZone – Mention the timezone in which the job should run. Here, I have used [UTC+1]Dublin timezone.
    4. Target branch or tag – Select the branch or tag for the pipeline. Here, I have selected the “main” branch.

    Click on the “Save pipeline schedule”.

    Step 5 – Verify that the job is scheduled

    Below is the image of the newly created pipeline. This shows all the necessary details like description, target, last pipeline, next run, and owner.

    The “Next Run” shows the expected time to run the pipeline. Here, it shows that the run is going to start.

    This image shows that the run has started, and it is in a pending state right now.

    Step 6 – Run the tests in the GitLab pipeline

    The pipeline runs automatically as per the time specified in the “Interval Pattern”. The below image shows that the tests are running in the GitLab pipeline.

    Step 7 – Check the status of the pipeline

    Once the Status of the pipeline changes to either failed or passed, that means the tests are already executed.

    As you can see, the Status is passed, its green colour. This means all the tests present in the test suite are executed and passed. If any test fails in the test suite, the final execution status will be brown. The reason for the brown colour is we have mentioned allow_failure: true.

    Below is the execution status report in the GitLab pipeline.

    I have added an artifact also in the .gitalb-ci.yml, which is highlighted in the image. This artifact creates a folder with the name “SpringBoot_Report” and the reports in this folder come from the path /target/site. This artifact gives us the option to download the reports or browse the report. This report will be available for 24 hours only as mentioned in the gitlab-ci.yml.

    Step 8 – Download the report

    Once, will click on the download button, it will download “SpringBoot_Report.zip”. Unzip the folder and it looks like something as shown below:

    Example of SureFire-Report.html

    Example of Project Summary Report

    How to schedule a cron job?

    Five fields that are separated by whitespace make up a scheduling item. By adding more than one entry, you can schedule a job for more than one time.

    MinuteHourDay of MonthMonthDay of week

    MINUTE (0-59), HOUR (0-23), DAY (1-31), MONTH (1-12), DAY OF THE WEEK (0-6)

    Each field can contain an exact value or use a set of special expressions:

    • The asterisk indicates all valid values. So, a job that runs every day has a * in the third field.
    • A dash separates ranges of values. For example, a job that runs every hour from 9:00 a.m. to 5:00 p.m. would have 9-17 in the second field.
    • Intervals are specified with a slash /. A job that runs every 15 minutes has H/15 in the first field. Note that the in the first field has a special meaning. If you wanted a job to run every 15 minutes, you could configure it as 0/15, which would make it run at the start of every hour.
    • Finally, you can specify multiple values with a comma. So, a job that runs Monday, Wednesday, and Friday would have 1,3,5 in the fifth field.

    Here are several special predefined values that can be used to substitute the expressions in the cron.

    EntryDescriptionDescription
    @yearlyRun at any time during the yearH H H H *
    @annuallyRun at any time during the yearH H H H *
    @monthlyRun at any time during the monthH H H * *
    @weeklyRun at any time during the weekH H * * H
    @dailyRun at any time during the dayH H * * *
    @hourlyRun at any time during the hourH * * * *

    Here are the most common examples of cron job schedules that can be found in almost any crontab on Linux :

    ScheduleJob
    * * * * *Run cron job every minute
    H/5 * * * *Run cron job every 5 minutes
    H/30 * * * *Run cron job every 30 minutes
    0 * * * *Run cron job every hour
    0 H/3 * * *Run cron job every 3 hours
    0 13 * * *Run cron job every day at 1pm
    30 2 * * *Run cron job every day at 2:30 am
    0 0 * * *Run cron job every day at midnight
    0 0 * * 0Run cron job every Sunday
    0 0 * * 1Run cron job every Monday
    0 0 1 * *Run cron job every first day of every month
    0 0 1 1 *Run cron job every first of January every year

    Congratulations. This tutorial has explained the steps to schedule the pipeline in GitLab CI/CD. Happy Learning!!

    How to send SOAP request in Postman?

    HOME

    In this tutorial, we will send a SOAP Request in Postman.

    What is a SOAP Request?

    POST requests are used to send data to the API server to create or update a resource. The data sent to the server is stored in the request body of the HTTP request.
    HTTP POST request provides additional data from the client to the server message body.

    We will use the following URL for this Postman tutorial.

    https://www.dataaccess.com/webservicesserver/NumberConversion.wso
    

    Sample Request Body

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <NumberToWords xmlns="http://www.dataaccess.com/webservicesserver/">
          <ubiNum>1525</ubiNum>
        </NumberToWords>
      </soap:Body>
    </soap:Envelope>
    

    To create the a SOAP request in Postman, follow the following steps:

    Step 1: Create a Collection, click on Collections, and then click on the “+” plus button.

    Step 2:  Provide a name to the collection – “API Testing”.

    Step 3: To create a new request, click on “Add a request” if it is a new Collection. Otherwise, click on the 3 dots and select “Add request”.

    Step 4: Once you create a new request, then you will get the following window:

    Step 5: Enter the “name” in the request. Here, the name is “SOAP_Request”.

    Step 6: Enter the “URL” in the address bar.

    Step 7: Now, select the “POST” request from the list of request methods.

    Step 8 – Add a Request body to the Post request

    For this, select the Body tab.

    Now in the Body tab, select raw and select XML as the format type from the drop-down menu, as shown in the image below. This is done because we need to send the request in the appropriate format that the server expects. Copy and paste the request body example mentioned at the beginning of the tutorial to the postman request Body. 

    Step 9: Add “Content-Type” to the Header.

    Here, Content-Type is text/xml; charset=utf-8.

    Step 10: Press the “Send” button.

    Step 11: Once you press the send button, you will get the response from the server. Make sure you have a proper internet connection; otherwise, you will not get a response.

    Status

    You can check the status code. Here, we got the status code 200, which means we got a successful response to the request. In the case of new resource creation, the status code should be 201. But as this is a dummy API, we are getting a status code of 200.

    Body

    In the Body tab of the response box, we have multiple options to see the response in a different format.

    Format Type

    Each request has a defined response to it as defined by the Content-Type header. That response can be in any format. Such as in the above example, we have XML code file.

    Below are the various format type present in Postman.

    JSON

    HTML

    Text

    Headers

    Headers are the extra information that is transferred to the server or the client. In Postman, headers will show like key-value pairs under the headers tab. Click on the Headers link as shown in the below image:

    We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

    How to push Postman Collection scripts in GitHub

    HOME

    In this tutorial, I will explain how we can push Postman Collection scripts in GitHub.

    1. Create an empty GitHub Repository
    2. Push Postman Collections to GitHub

    Step 1 – Login to GitHub using your username and password.

    Step 2 – In the upper-right corner of any page, use the drop-down menu, and select “New repository” or left side of the page, there is a green button “New“.

    Step 3 – Type a name for your repository, and an optional description. Here, I have provided below-mentioned information:

    1. Owner – vibssingh
    2. Repository name – Postman_GitHub_Integration
    3. Description – This repository contains the Postman Collection file (optional)

    Step 4 – Choose repository visibility

    I’m selecting the “Public” option as it is a free account. You can select the Private option for a paid account (mostly organizations). For more information, see About repositories.”

    Step 5 You can create a “README“, which is a document describing your project. For more information, see About READMEs.”

    • You can create a .gitignore file, which is a set of ignore rules. For more information, see “Ignoring files.
    • You can choose to add a software license for your project. For more information, see “Licensing a repository.”

    Below is the screenshot of the new repository in GitHub.

    Congratulations!!. We have just pushed Postman collection script in GitHub. Now you can clone this project and start working on it.

    What is API Chaining in Postman?

    HOME

    What is API Chaining?

    The API chaining method is to create a sequence of API calls where the output of one API request is used as the input for the next. The technique is an automated and efficient way of executing a Multistep Process.

    We will learn to get a response from one API and pass it as a request parameter in another API.

    How to create a Collection?

    Step 1: Create a Collection, click on Collections, and then click on the “+” plus button.

    Add 2 requests in the Postman

    https://reqres.in/api/users?page=1
    

    https://reqres.in/api/users/4
    
    {
        "name": "Test",
        "job": "zion resident"
    }
    

    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    
    var jsonData = pm.response.json();
    value = jsonData.data[2].first_name
    console.log(value)
    
    pm.environment.set("Username", value);
    

    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    

    Allure Report for Cucumber7, Selenium and JUnit5

    HOME

    The previous tutorial explained the generation of Allure Report with Cucumber5, Selenium and JUnit4 in a Maven project. In this tutorial, I will explain the steps to create an Allure Report with Cucumber7, Selenium, and JUnit5 in a Maven project.

    Prerequisite:

    1. Java 11 or above installed
    2. Eclipse or IntelliJ IDE installed
    3. Maven Installed
    4. Environment variables JAVA_HOME and ALLURE_HOME are correctly configured

    In this tutorial, I’ll create an Allure Report for the testing of web applications using Cucumber7, and Selenium 4 with JUnit5.

    Dependency List

    1. Cucumber Java – 7.6.0
    2. Cucumber JUnit Platform Engine – 7.6.0
    3. Java 11
    4. Maven – 3.8.1
    5. Selenium – 4.3.0
    6. Allure JUnit5 – 2.21.0
    7. AspectJ Weaver – 1.9.7

    Implementation Steps

    1. Add Cucumber, Selenium, JUnit5, and Allure-JUnit5 dependencies in pom.xml
    2. Create Pages and Test Code for the pages
    3. Execute the Tests
    4. Generate the Allure Report

    Project Structure

    Step 1 – Add dependencies in pom.xml

    The Cucumber, Selenium, JUnit5, WebDriverMananger, and Allure-JUnit5 dependencies are added to the pom.xml.

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>com.example</groupId>
        <artifactId>Cucumber7Junit5</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>jar</packaging>
     
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <cucumber.version>7.6.0</cucumber.version>
            <selenium.version>4.3.0</selenium.version>
            <webdrivermanager.version>5.2.1</webdrivermanager.version>
            <junit.jupiter.version>5.9.0</junit.jupiter.version>
            <apache.common.version>2.4</apache.common.version>
            <projectlombok.version>1.18.24</projectlombok.version>
            <maven.compiler.plugin.version>3.10.1</maven.compiler.plugin.version>
            <maven.surefire.plugin.version>3.0.0-M7</maven.surefire.plugin.version>
            <maven.compiler.source.version>11</maven.compiler.source.version>
            <maven.compiler.target.version>11</maven.compiler.target.version>
    		<allure.junit5.version>2.21.0</allure.junit5.version>
    		<allure.version>2.19.0</allure.version>
    		<allure.maven.version>2.11.2</allure.maven.version>
    		<aspectj.version>1.9.9.1</aspectj.version>
        </properties>
     
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>io.cucumber</groupId>
                    <artifactId>cucumber-bom</artifactId>
                    <version>${cucumber.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.junit</groupId>
                    <artifactId>junit-bom</artifactId>
                    <version>${junit.jupiter.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
     
        <dependencies>
     
            <dependency>
                <groupId>io.cucumber</groupId>
                <artifactId>cucumber-java</artifactId>
                <scope>test</scope>
            </dependency>
     
            <dependency>
                <groupId>io.cucumber</groupId>
                <artifactId>cucumber-junit-platform-engine</artifactId>
                <scope>test</scope>
            </dependency>
     
            <!-- JUnit Platform -->
            <dependency>
                <groupId>org.junit.platform</groupId>
                <artifactId>junit-platform-suite</artifactId>
                <scope>test</scope>
            </dependency>
     
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
                <scope>test</scope>
            </dependency>
     
            <!-- Selenium -->
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>${selenium.version}</version>
            </dependency>
     
            <!-- Web Driver Manager -->
            <dependency>
                <groupId>io.github.bonigarcia</groupId>
                <artifactId>webdrivermanager</artifactId>
                <version>${webdrivermanager.version}</version>
            </dependency>
     
            <!-- Apache Common -->
            <dependency>
                <groupId>org.apache.directory.studio</groupId>
                <artifactId>org.apache.commons.io</artifactId>
                <version>${apache.common.version}</version>
            </dependency>
     
     <!--Allure Reporting Dependency-->
    		<dependency>
    			<groupId>io.qameta.allure</groupId>
    			<artifactId>allure-junit5</artifactId>
    			<version>${allure.junit5.version}</version>
    			<scope>test</scope>
    		</dependency>
    		
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${projectlombok.version}</version>
                <scope>provided</scope>
            </dependency>
    		
        </dependencies>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven.compiler.plugin.version}</version>
                    <configuration>
                        <source>${maven.compiler.source.version}</source>
                        <target>${maven.compiler.target.version}</target>
                    </configuration>
                </plugin>
               
               <plugin>
    
    				<artifactId>maven-surefire-plugin</artifactId>
    				<version>${maven.surefire.plugin.version}</version>
    				<configuration>
    					<properties>
    						<property>
    							<name>listener</name>
    							<value>io.qameta.allure.junit5.AllureJunit5</value>
    						</property>
    					</properties>
    					<argLine>
                                -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                                -Dcucumber.options="--plugin io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm"
                            </argLine>
    					<systemProperties>
    						<property>
    							<name>allure.results.directory</name>
    							<value>${project.build.directory}/allure-results</value>
    						</property>
    						<property>
    							<name>junit.jupiter.extensions.autodetection.enabled</name>
    							<value>true</value>
    						</property>
    					</systemProperties>
    				</configuration>
    				<dependencies>
    					<dependency>
    						<groupId>org.aspectj</groupId>
    						<artifactId>aspectjweaver</artifactId>
    						<version>${aspectj.version}</version>
    					</dependency>
    					<dependency>
    						<groupId>io.cucumber</groupId>
    						<artifactId>cucumber-junit-platform-engine</artifactId>
    						<version>${cucumber.version}</version>
    					</dependency>
    				</dependencies>
    			</plugin>
    			
                <plugin>
    				<groupId>io.qameta.allure</groupId>
    				<artifactId>allure-maven</artifactId>
    				<version>${allure.maven.version}</version>
    				<configuration>
    					<reportVersion>2.4.1</reportVersion>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>
    

    Step 2 – Create Step Definition, feature file, and Test Runner Classes

    There is another tutorial that explains the project structure as well as the feature file and corresponding Step Definitions, please refer to this tutorial – Integration of Cucumber7 with Selenium and JUnit5.

    Step 3 – Execute the Tests

    Use the below command to run the tests

    mvn clean test 
    

    The output of the above program is

    Step 4 – Generate the Allure Report

    Once the test execution is finished, a folder named allure-results will be generated in the target folder.

    To generate the Allure Report, first, go to the target folder.

    cd target
    

    Now, use the below command to generate the Allure Report

    allure serve 
    

    This will generate the beautiful Allure Test Report as shown below.

    Allure Report Dashboard

    The overview page hosts several default widgets representing the basic characteristics of your project and test environment.

    1. Statistics – overall report statistics.
    2. Launches – if this report represents several test launches, statistics per launch will be shown here.
    3. Behaviours – information on results aggregated according to stories and features.
    4. Executors – information on test executors that were used to run the tests.
    5. History Trend – if tests accumulate some historical data, its trend will be calculated and shown on the graph.
    6. Environment – information on the test environment.

    Categories in Allure Report

    The categories tab gives you a way to create custom defect classifications to apply for test results. There are two categories of defects – Product Defects (failed tests) and Test Defects (broken tests).

    Suites in Allure Report

    On the Suites tab a standard structural representation of executed tests, grouped by suites and classes can be found.

    Graphs in Allure Report

    Graphs allow you to see different statistics collected from the test data: status breakdown or severity and duration diagrams.

    Timeline in Allure Report

    The timeline tab visualizes retrospective test execution, allure adaptors collect precise timings of tests, and here on this tab, they are arranged accordingly to their sequential or parallel timing structure.

    Behaviors of Allure Report

    This tab groups test results according to Epic, Feature, Story, Test Severity, Test Description, Test Steps, and so on.

    Packages in Allure Report

    The packages tab represents a tree-like layout of test results, grouped by different packages.

    Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

    How to Schedule a Jenkins Job

    Last Updated On

    HOME

    In this post, we’ll show you how to schedule Jenkins jobs, and we’ll review some specific scenarios.

    Table of Contents

    1. Jenkins Job Scheduling Syntax
    2. Add a Schedule to a Jenkins Job
      1. Create a new project using the Maven project plugin
      2. Go to the Build section of the new job
      3. Go to the Build Triggers
      4. Verify the Build History

    Jenkins Job Scheduling Syntax

    Let’s first have a look at the Jenkins task scheduling setup. You don’t need to be familiar with Linux’s command line environment to understand it, but it resembles the cron syntax quite a bit.

    Five fields that are separated by whitespace make up a scheduling item. By adding more than one entry, you can schedule a job for more than one time.

    Minute Hour Day of Month Month Day of week

    MINUTE (0-59), HOUR (0-23), DAY (1-31), MONTH (1-12), DAY OF THE WEEK (0-6)

    Each field can contain an exact value or use a set of special expressions:

    • The asterisk indicates all valid values. So, a job that runs every day has a * in the third field.

    • A dash separates ranges of values. For example, a job that runs every hour from 9:00 a.m. to 5:00 p.m. would have 9-17 in the second field.

    • Intervals are specified with a slash /. A job that runs every 15 minutes has H/15 in the first field. Note that the in the first field has a special meaning. If you wanted a job to run every 15 minutes, you could configure it as 0/15, which would make it run at the start of every hour. However, if you configure too many jobs this way, you can overload your Jenkins controller. Ultimately, the H tells Jenkins to pick a minute based on a hash of the job name. 

    • Finally, you can specify multiple values with a comma. So, a job that runs Monday, Wednesday, and Friday would have 1,3,5 in the fifth field.

    Here are the several special predefined values that can be used to substitute the expressions in Jenkins cron.

    Entry Description Description
    @yearly Run at any time during the year H H H H *
    @annually Run at any time during the year H H H H *
    @monthly Run at any time during the month H H H * *
    @weekly Run at any time during the week H H * * H
    @daily Run at any time during the day H H * * *
    @hourly Run at any time during the hour H * * * *

    Here are the most common examples of cron job schedules that can be found in almost any crontab on Linux (use H in the examples below to spread the load evenly in Jenkins):

    Schedule Job
    * * * * * Run cron job every minute
    H/5 * * * * Run cron job every 5 minutes
    H/30 * * * * Run cron job every 30 minutes
    0 * * * * Run cron job every hour
    0 H/3 * * * Run cron job every 3 hours
    0 13 * * * Run cron job every day at 1pm
    30 2 * * * Run cron job every day at 2:30 am
    0 0 * * * Run cron job every day at midnight
    0 0 * * 0 Run cron job every Sunday
    0 0 * * 1 Run cron job every Monday
    0 0 1 * * Run cron job every first day of every month
    0 0 1 1 * Run cron job every first of January every year

    Add a Schedule to a Jenkins Job

    Step 1: Create a new project using the Maven project plugin

    In the General section, enter the project description in the Description box.

    Step 2: Go to the Build section of the new job

    • In the Root POM textbox, enter the full path to pom.xml
    • In the Goals and options section, enter “clean test”

    Click on the Apply and Save buttons.

    Step 3: Go to the Build Triggers

    Select the Build periodically option and mention the schedule.

    This will open the scheduling text area.

    H/5 * * * *
    

    This schedule means that the job will run every 5 minutes.

    Click on the Apply and Save buttons.

    Step 4: Verify the Build History

    Here is a screenshot of a couple of builds on our system. The timestamps show that you’ve scheduled a job to run every five minutes.

    Below is the Build History.

    In this post, we covered Jenkin’s job scheduling abilities, and we covered how to configure jobs for different intervals. 

    Integration of Selenium with TestNG

    HOME

    In this tutorial, I’ll create a Framework for the testing of web applications using Selenium Webdriver with TestNG.

    1. Selenium- 4.21.0
    2. Java 17
    3. TestNG – 7.10.2
    4. Maven – 3.9.6
    5. Maven Surefire – 3.2.5
    6. Maven Compiler – 3.13.0

    Implementation Steps

    Step 1- Download and Install Java

    Selenium needs Java to be installed on the system to run the tests. Click here to learn How to install Java.

    Step 2 – Download and setup Eclipse IDE on the system

    The Eclipse IDE (integrated development environment) provides strong support for Java developers, which is needed to write Java code. Click here to learn 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 a 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 that is used to define project structure, dependencies, build, and test management. Click here to learn How to install Maven.

    Step 4 – Create a new Maven Project

    Click here to learn How to create a Maven project

    Below is the Maven project structure. Here,

    Group Id – com.example
    Artifact Id – Selenium_TestNGDemo
    Version – 0.0.1-SNAPSHOT
    Package – com. example. Selenium_TestNGDemo

    Step 5 – Add Selenium and TestNG dependencies to the project

    As this is a Maven project, we can add the dependencies in POM.xml as shown below.

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.example</groupId>
    	<artifactId>SeleniumTestNG_Demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<selenium.version>4.21.0</selenium.version>
    		<testng.version>7.10.2</testng.version>
    		<maven.compiler.plugin.version>3.13.0</maven.compiler.plugin.version>
    		<maven.compiler.source.version>17</maven.compiler.source.version>
    		<maven.compiler.target.version>17</maven.compiler.target.version>
    		<maven.surefire.plugin.version>3.2.5</maven.surefire.plugin.version>
    	</properties>
    
    	<dependencies>
    
    		<!-- Selenium -->
    		<dependency>
    			<groupId>org.seleniumhq.selenium</groupId>
    			<artifactId>selenium-java</artifactId>
    			<version>${selenium.version}</version>
    		</dependency>
    
    		<!-- TestNG -->
    		<dependency>
    			<groupId>org.testng</groupId>
    			<artifactId>testng</artifactId>
    			<version>${testng.version}</version>
    			<scope>test</scope>
    		</dependency>
    
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>${maven.compiler.plugin.version}</version>
    				<configuration>
    					<source>${maven.compiler.source.version}</source> 
    					<target>${maven.compiler.target.version}</target> 
    				</configuration>
    			</plugin>
    			 <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>${maven.surefire.plugin.version}</version>
                  <configuration>
                        <suiteXmlFiles>
                            <suiteXmlFile>testng.xml</suiteXmlFile>
                        </suiteXmlFiles>
                 </configuration>          
            </plugin>
          </plugins>
      </build>
    </project>
    

    After the addition of dependencies in pom.xml, the Maven Dependencies folder will be updated automatically with all the JAR file related to the dependencies.

    Step 6 – Create a Test file under src/test/java

    @BeforeMethod – This annotated method will be run before each test method i.e say there are three test methods (i.e test cases), then @BeforeMethod annotated method will be called thrice before each test method.

    @AfterMethod – methods under this annotation will be executed after each Test method.

    @Test – The annotated method is part of a test case.

    Description –  You can describe your test case under the description, stating what it does.

    description = "This test validates title of login functionality"
    

    Priority – You can prioritize the order of your test methods by defining a priority. Based on the defined priority, the test shall execute in that order.

    priority = 0
    

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    
    import java.time.Duration;
    
    public class BaseTests {
    
        public static WebDriver driver;
        public final static int TIMEOUT = 10;
    
        @BeforeMethod
        public void setup() {
    
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            options.addArguments("--no-sandbox");
            options.addArguments("--disable-dev-shm-usage");
            options.addArguments("--headless");
            driver = new ChromeDriver(options);
            driver.manage().window().maximize();
            driver.get("https://opensource-demo.orangehrmlive.com/");
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(TIMEOUT));
    
        }
    
        @AfterMethod
        public void tearDown() {
            driver.quit();
        }
    
    }
    
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    public class LoginPageTests extends BaseTests{
    	 
        @Test
        public void invalidCredentials() {
       
    	    LoginPage objLoginPage = new LoginPage(driver);
        	objLoginPage.login("admin$$", "admin123");
        	 
        	// Verify Error Message
        	 Assert.assertEquals("Invalid credentials",objLoginPage.getErrorMessage());
        
        }
        
        @Test
        public void validLogin() {
       
    	    LoginPage objLoginPage = new LoginPage(driver);
        	objLoginPage.login("Admin", "admin123");
        	 
        	HomePage objHomePage = new HomePage(driver);
        	
        	// Verify Home Page
        	Assert.assertEquals("Dashboard",objHomePage.getHomePageText());
        
        }
        
    }
    
    

    Step 7 – Test Execution through TestNG

    Go to the Runner class and right-click Run As TestNG Test. The tests will run as TestNG tests (in Eclipse).

    Step 8 – Run the tests from TestNG.xml

    Create a TestNG.xml as shown below and run the tests as TestNG.

    <?xml version = "1.0"encoding = "UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name = "Suite1">
      <test name = "TestNG Demo">
        <classes>
              <class name = "com.example.Selenium_TestNGDemo.TestNG_Demo"/>
         </classes>  
       </test>
    </suite>
    

    Step 9 – TestNG Report Generation

    TestNG generates various types of reports under test-output folder like emailable-report.html, index.html, testng-results.xml.

    We are interested in the “emailable-report.html” report. Open “emailable-report.html“, as this is an HTML report, and open it with the browser. The below image shows emailable-report.html.

    TestNG also produces an index.html report, and it resides under the test-output folder. The below image shows the index.html report. This is the latest theme of the report.

    The links present on the left side are clickable. I have clicked the Times link, and you can see the details on the right side.

    That’s it! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

    How to generate Newman Report in Jenkins

    Last Updated On

    HOME

    Postman contains a full-featured testing sandbox that enables you to write and execute JavaScript-based tests for your API. You can then integrate Postman with your CI/CD build system using Newman, the command-line collection runner for Postman. In this tutorial, we are going to learn how we can create a Newman Report in Jenkins.

    Table of Contents

    Prerequisite:

    • Jenkins installed on the machine
    • NodeJS installed on the machine

    Implementation Steps

    Step 1: Download the NodeJS Plugin

    To generate a Performance Report in Jenkins, we need to download NodeJS Plugin. Please refer to this tutorial to install the plugin – How to install Plugins in Jenkins.

    Go to Manage Jenkins > Manage Plugins and install the NodeJS plugin.

    Step 3: Create a new FreeStyle project

    1. Give the Name of the projectPostman_Demo
    2. Click on the FreeStyle project. 
    3. Click on the OK button.

    In the General section, enter the project description in the Description box.

    Step 4: Source Code Management

    Select Source Code Management as None if the project is locally present on the machine.

    Step 6: Select Execute Windows batch command

    In the Build Steps section, select Execute Windows batch command.

    Use the below command to go to the path where the JMeter is placed in your system.

    cd C:\Users\Vibha\Desktop\Postman
    newman run --disable-unicode API_Newman_PassedTests.json --reporters htmlextra --reporter-htmlextra-export ./results/report.html
    
    

    Step 7: Select “Publish HTML reports” from “Post Build Actions”

    We have created a new project Postman_Demo” with the configuration to run the Postman scripts.

    Step 8: Execute the tests

    Let’s execute it now by clicking on the “Build Now” button. 

    Right-click on Build Number (here in my case it is #1).

    Click on Console Output to see the result.

    Below is the HTML Report generated in Jenkins.

    	
    System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
    

    Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

    Additional Tutorials

    What is Collection in Postman?
    Data Driven Testing in Postman
     How to import Collection into Postman?
     How to run Postman requests from the command line
     How to generate Newman HTML Report?

    LinkedHashMap in Java

    HOME

    The LinkedHashMap Class is just like HashMap with an additional feature of maintaining an order of elements inserted into it. However, the linked hash map is based on both a hash table and a linked list to enhance the functionality of the hash map.

    Create a LinkedHashMap object as shown below from:-

    import java.util.LinkedHashMap;
    

    Syntax of LinkedHashMap

    LinkedHashMap<String, String> employeeDetail = new LinkedHashMap<String, String>();
    
    LinkedHashMap<String, String> employeeDetail = new LinkedHashMap<>();
    
    LinkedHashMap<String, Integer> employeeDetail = new LinkedHashMap<String, Integer>();
    

    Adding the Elements

    Below is an example where we are adding items to HashMap by using put() method.

    import java.util.LinkedHashMap;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // Printing all entries inside Map
            System.out.println("Linked HashMap :" + linkedHashMap);
    
        }
    }
    

    Accessing an Element

    To access a value in the LinkedHashMap, use the get() method and refer to its key:-

    import java.util.LinkedHashMap;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // Printing all entries inside Map
            System.out.println("Linked HashMap :" + linkedHashMap);
    
            // Access a value
            System.out.println("Access Value of Key Patrick :" + linkedHashMap.get("Patrick"));
    
        }
    }
    
    

    Removing an Element

    To remove an item, use the remove() method and refer to the key:

    import java.util.LinkedHashMap;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // Printing all entries inside Map
            System.out.println("Linked HashMap :" + linkedHashMap);
    
            // Removing the mapping with Key Brendan
            linkedHashMap.remove("Brendan");
    
            // Printing the updated map
            System.out.println("Updated Map :" + linkedHashMap);
    
        }
    }
    

    To remove all items, use the clear() method:-

    import java.util.LinkedHashMap;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // Printing all entries inside Map
            System.out.println("Linked HashMap :" + linkedHashMap);
    
            // Removing the mapping with Key Brendan
            linkedHashMap.clear();
    
            // Printing the updated map
            System.out.println("Updated Map :" + linkedHashMap);
    
        }
    }
    

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // For-each loop for traversal over Map
            for (Map.Entry<String, String> mapElement : linkedHashMap.entrySet()) {
    
                String key = mapElement.getKey();
    
                // Finding the value
                // using getValue() method
                String value = mapElement.getValue();
    
                // Printing the key-value pairs
                System.out.println(key + " : " + value);
            }
        }
    }
    

    Methods in LinkedHashMap

    import java.util.LinkedHashMap;
    
    public class LinkedHashMap_Demo {
        public static void main(String a[]) {
    
            // Creating an empty LinkedHashMap
            LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
    
            // Adding entries in Map using put() method
            linkedHashMap.put("Tim", "DBA");
            linkedHashMap.put("Cillian", "SDET");
            linkedHashMap.put("Patrick", "BA");
            linkedHashMap.put("Brendan", "Dev");
    
            // Getting and printing value for a specific key
            System.out.println("Getting value for key 'Patrick' :" + linkedHashMap.get("Patrick"));
    
            // Getting size of Map using size() method
            System.out.println("Size of the map :" + linkedHashMap.size());
    
            // Checking whether Map is empty or not
            System.out.println("Is map empty? :" + linkedHashMap.isEmpty());
    
            // Using containsKey() method to check for a value
            System.out.println("Contains value 'SDET' "  + linkedHashMap.containsValue("SDET"));
    
            // Using containsKey() method to check for a key
            System.out.println("Contains key 'Brendan'? :" + linkedHashMap.containsKey("Brendan"));
    
            // Removing entry using remove() method
            System.out.println("Delete element 'Brendan' :" + linkedHashMap.remove("Brendan"));
    
            // Printing mappings to the console
            System.out.println("Mappings of LinkedHashMap :" + linkedHashMap);
            }
    }
    

    We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!