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 seasoned Software Engineer with 11+ years of experience in software development, automation, and AI/ML. I have a deep passion for technology, problem-solving, and continuous learning, and I created this blog to share my insights, experiences, and discoveries in the ever-evolving world of software engineering. Throughout my career, I’ve worked extensively with Java (Spring Boot), Python (FastAPI), AI/ML, Cloud Computing (AWS), DevOps, Docker, Kubernetes, and Test Automation frameworks. My journey has led me to explore microservices architecture, API development, observability (OpenTelemetry, Prometheus), and AI-powered solutions. On this blog, you’ll find practical tutorials, in-depth technical discussions, and real-world problem-solving strategies. I’ll also share my experiences working on high-performance microservices, AI applications, cloud deployments, and automation frameworks, along with best practices to help fellow developers and engineers. I encourage you to join the conversation—leave comments, ask questions, and share your thoughts! Let’s learn, innovate, and grow together in this exciting journey of software development.