Karate Framework: Master of API Test Automation ?

Ish MishraIsh Mishra
3 min read

For all API developers and testers, a not-so-new API testing framework is gaining significant attention as we enter 2021.

So, what makes this framework stand out? Isn't RestAssured sufficient? And why are we even spending our time reading about it?

Well, to begin with, the Karate framework has entered the inner radar of ThoughtWorks, making it deserving of our attention.

Let’s explore a few features it provides:

BDD Syntax and a true DSL

The scripts in Karate look very similar to Cucumber-Gherkin feature files, but they are the actual scripts and do not require explicit mapping to an underlying code.

In the excerpt below, the Karate-DSL provides keywords that perform all API-related requests, as well as keywords for assertions.

@debugs
Feature: Test for the home page

Background: Define URL
Given url "https://localhost/" 

Scenario: Get all the tags and assert
Given path 'tags' When method Get Then status 200 
And match response.tags contains ['test'] 
And match response.tags !contains ['truck'] 
And match response.tags contains any ['fish','dog','SIDA'] 
And match response.tags == "#array" 
And match each response.tags == "#string"

Java knowledge is not necessary, and even non-programmers can write tests.

This makes Karate quite fascinating. It has a very short learning curve, and all those manual testers who aren't into coding can easily pick it up.

Don't get me wrong, knowledge of Java or JavaScript will undoubtedly enable one to fully utilize the framework.

For example we want to verify the format of a timestamp field in the JSON response. We create a function in JavaScript and call Java code inside it.

function fn(s) {
var SimpleDateFormat = Java.type("java.text.SimpleDateFormat");
var sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.ms'Z'");
try {
sdf.parse(s).time;
return true;
} catch(e) {
karate.log('*** invalid date string:', s);
return false;
}
}

Create a feature file and use it to validate the date format of a field within your JSON response:

Scenario: Get 10 articles and assert and validate schema
* def timeValidator = read('com/learn/timeValidator.js') 
Given params {limit: 10, offset: 0} 
Given path 'articles' 
When method 
Get Then status 200 
And match **each response.data ==
**"""
{
"createdAt": "#? timeValidator(_)",
"updatedAt": "#? timeValidator(_)"

}
"""

You can even directly call the Java methods in the Karate feature file.

Scripts can call other scripts, making all your feature files reusable and allowing data to be passed from one to another.

Background: Define URL
    Given url  apiUrl
   * def tokenResponse = callonce read('classpath:com/learn/CreateToken.feature')
    * def token = tokenResponse.authToken

  Scenario: Create a new article

    Given header Authorization = 'Token ' + token
    And path 'articles'
    And request articlesRequestBody
    When method Post
    Then status 200

Native support for reading YAML and even CSV files — and you can use them for data-driven test

Ideal for testing the highly dynamic responses from GraphQL API-s because of Karate’s built-in text-manipulation and JsonPath capabilities

And so many more..


Dear Readers,

I hope you are enjoying the content I provide on my blog. As a passionate writer and dedicated software developer, I strive to create valuable and informative articles that resonate with you. Today, I would like to extend an invitation to support my work and help me continue producing high-quality content.

I have set up a Buy Me a Coffee page, a platform that allows readers like you to show their appreciation by making a small donation. Your contribution, no matter how big or small, goes a long way in supporting my efforts and keeping the blog running. You can also sponsor using the links at the bottom of this page.

0
Subscribe to my newsletter

Read articles from Ish Mishra directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Ish Mishra
Ish Mishra

"Welcome to Bits8Byte. I'm Ish, a passionate software engineer with a deep love for technology and a knack for problem-solving. Through this blog, I aim to share my insights, experiences, and discoveries in the ever-evolving world of software development. Having worked in the industry for 9 years, I have had the opportunity to explore various programming languages, frameworks, and tools. I believe in continuous learning and strive to stay up-to-date with the latest industry trends and best practices. In this blog, you can expect to find practical tips, tutorials, and thought-provoking articles. I will also delve into the challenges faced in software development and share my insights on overcoming them. I encourage you to join the conversation by leaving comments, asking questions, and sharing your own experiences. Together, we can grow and inspire each other in our software development journeys.