<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anudeep</title>
    <description>The latest articles on DEV Community by Anudeep (@asaianudeep).</description>
    <link>https://dev.to/asaianudeep</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F613436%2F9ff0d1d4-b922-40c6-ba07-d342f317a666.png</url>
      <title>DEV Community: Anudeep</title>
      <link>https://dev.to/asaianudeep</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/asaianudeep"/>
    <language>en</language>
    <item>
      <title>Why Choose TestBeats Over Direct Slack Webhooks for Test Notifications</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Tue, 10 Feb 2026 18:25:14 +0000</pubDate>
      <link>https://dev.to/asaianudeep/why-choose-testbeats-over-direct-slack-webhooks-for-test-notifications-42pk</link>
      <guid>https://dev.to/asaianudeep/why-choose-testbeats-over-direct-slack-webhooks-for-test-notifications-42pk</guid>
      <description>&lt;p&gt;When teams automate tests, getting meaningful results into Slack is essential. Many projects start by sending simple alerts using &lt;strong&gt;Slack incoming webhooks&lt;/strong&gt; — a direct way to push messages to a channel when tests run or fail. But while webhooks are straightforward, they’re just a delivery mechanism — they don’t add structure, analysis, context, or insights to your test results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TestBeats&lt;/strong&gt;, by contrast, is a dedicated test reporting platform that takes your raw automation results and turns them into actionable information before they hit Slack. Rather than only sending a basic pass/fail message via a webhook, TestBeats processes, analyzes, and enriches your test data first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Context &amp;amp; Insight
&lt;/h2&gt;

&lt;p&gt;With TestBeats, Slack messages aren’t just notifications — they’re summaries with meaning. The platform can package test failures with AI-powered summaries, categorize errors (like new failures, flaky tests, or recurring issues), and highlight what matters most. This means your team spends less time deciphering logs in Slack and more time fixing real issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unified &amp;amp; Structured Reporting
&lt;/h2&gt;

&lt;p&gt;Slack webhooks simply send whatever payload you give them — but you’re responsible for formatting, parsing, and contextualizing that data. TestBeats collects results from all major test frameworks (JUnit, Mocha, Playwright, Cypress, etc.), normalizes them, and provides structured reports. Teams get consistent, easy-to-read summaries rather than fragmented raw notifications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seamless Toolchain Integration
&lt;/h2&gt;

&lt;p&gt;Slack webhooks are a low-level notification channel; integrating them well typically requires custom scripts or tooling to wrap your test runners and format messages. TestBeats handles this orchestration for you — you publish your test results once, and it sends smart, configurable notifications to Slack (and other platforms).&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Collaboration &amp;amp; Workflow
&lt;/h2&gt;

&lt;p&gt;Because TestBeats understands test results across runs and time, it helps teams track trends, historical failures, and patterns — things that simple Slack messages can’t deliver on their own. This broader visibility improves collaboration and speeds decision-making.&lt;/p&gt;

&lt;h2&gt;
  
  
  In summary
&lt;/h2&gt;

&lt;p&gt;: if your goal is simple alert delivery, Slack webhooks can do that. But if you want context-rich, structured, and actionable test reporting that helps your whole team understand and act on test outcomes more efficiently, &lt;strong&gt;TestBeats offers a smarter, more powerful solution — integrating Slack not just as a channel, but as part of a full test reporting workflow.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>playwright</category>
      <category>testing</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Slack Test Reporting</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Wed, 12 Nov 2025 05:44:24 +0000</pubDate>
      <link>https://dev.to/asaianudeep/slack-test-reporting-3992</link>
      <guid>https://dev.to/asaianudeep/slack-test-reporting-3992</guid>
      <description>&lt;p&gt;In the world of continuous integration and delivery (CI/CD), fast feedback is crucial. Waiting for someone to manually check a dashboard for test results can slow down your entire team. This is where &lt;a href="https://testbeats.com/" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt; and its powerful Slack integration step in, bringing test visibility directly to your team's communication hub.&lt;/p&gt;

&lt;p&gt;TestBeats is an AI-Powered Test Analysis Platform that unifies test results from various frameworks (like Cypress, Selenium, Playwright, and PyTest) and delivers enhanced reports instantly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pkxte7yscacucti3opn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pkxte7yscacucti3opn.png" alt="Slack TestBeats" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Report Tests to Slack?
&lt;/h2&gt;

&lt;p&gt;The core benefit of using TestBeats with Slack is simple: instant, actionable collaboration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get Results Where You Work&lt;/strong&gt;: Instead of forcing developers and QAs to check a separate reporting tool, TestBeats pushes a summary of every test run directly into a designated Slack channel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Powered Insights&lt;/strong&gt;: TestBeats doesn't just send a pass/fail count; it uses AI to summarize test failures, highlight the most common errors, and categorize issues (e.g., newly failed, recurring, or flaky tests). This immediate context accelerates troubleshooting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Actionable Alerts &amp;amp; Context&lt;/strong&gt;: The Slack notification includes a clean summary along with crucial links and metadata. You get one-click access to detailed logs, artifacts, and the full report.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Tagging&lt;/strong&gt;: TestBeats can even tag the right on-call engineers directly in the Slack alert, ensuring the correct person is notified immediately to address new failures.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Simple Setup
&lt;/h2&gt;

&lt;p&gt;Getting automated test results into Slack with TestBeats is designed to be straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Centralize Results&lt;/strong&gt;: Run your tests using any popular framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Slack&lt;/strong&gt;: Set up a webhook URL for your target Slack channel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publish&lt;/strong&gt;: Use the TestBeats Command Line Interface (CLI) to send your test results (e.g., JUnit, TestNG, or Cucumber files) to the TestBeats platform, which then automatically formats and pushes the smart report to your configured Slack webhook.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx testbeats publish --slack &amp;lt;slack-url&amp;gt; --junit &amp;lt;file-path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By integrating TestBeats with Slack, you transform passive test reports into active, collaborative alerts, ensuring that everyone on the team has the real-time quality status needed to ship better software faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>slack</category>
      <category>testing</category>
      <category>analytics</category>
      <category>automation</category>
    </item>
    <item>
      <title>From Requests to Reports: Clean Logging in API Testing</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Sun, 04 May 2025 09:19:19 +0000</pubDate>
      <link>https://dev.to/asaianudeep/from-requests-to-reports-clean-logging-in-api-testing-2dod</link>
      <guid>https://dev.to/asaianudeep/from-requests-to-reports-clean-logging-in-api-testing-2dod</guid>
      <description>&lt;p&gt;While many testers are familiar with the basics of API testing—validating status codes, parsing response bodies, and testing CRUD operations—&lt;strong&gt;expert-level API testing&lt;/strong&gt; goes far beyond that. To build a resilient and maintainable test suite, testers must adopt advanced practices like &lt;strong&gt;structured logging&lt;/strong&gt;, &lt;strong&gt;traceability&lt;/strong&gt;, and &lt;strong&gt;clear reporting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we explore logging best practices that are largely tool-agnostic, but we'll demonstrate them using &lt;a href="https://pactumjs.github.io/" rel="noopener noreferrer"&gt;PactumJS&lt;/a&gt;, a powerful and extensible API testing tool, along with &lt;a href="https://mochajs.org/" rel="noopener noreferrer"&gt;Mocha&lt;/a&gt;, a popular JavaScript test framework. For logging, we’ll use &lt;a href="https://getpino.io/" rel="noopener noreferrer"&gt;Pino&lt;/a&gt;, one of the fastest and most reliable structured loggers for Node.js.&lt;/p&gt;

&lt;p&gt;Here is the sample repo &lt;a href="https://dev.toactum-mocha-boilerplate"&gt;https://github.com/pactumjs/pactum-mocha-boilerplate&lt;/a&gt; to see the code in live action.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why Logging Matters in API Testing
&lt;/h2&gt;

&lt;p&gt;Running thousands of API tests is meaningless if, when something fails, you can’t answer the following:&lt;/p&gt;

&lt;p&gt;❓ What failed?&lt;/p&gt;

&lt;p&gt;❓ Why did it fail?&lt;/p&gt;

&lt;p&gt;❓ When did it start failing?&lt;/p&gt;

&lt;p&gt;❓ Is it a consistent or intermittent failure?&lt;/p&gt;

&lt;p&gt;Without structured and persistent logging, diagnosing failures becomes time-consuming and unreliable. Reporting+Logging helps testers &lt;strong&gt;see the full picture&lt;/strong&gt;, improves debugging speed, and strengthens collaboration across the team.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤓 Concept: See the Full Picture with Perfect Logging
&lt;/h3&gt;

&lt;p&gt;In real-world API automation suites—especially those integrated into CI/CD pipelines—you need more than just a test failure message. You need context:&lt;/p&gt;

&lt;p&gt;📤 Request payload&lt;/p&gt;

&lt;p&gt;📥 Response body and headers&lt;/p&gt;

&lt;p&gt;🔄 Dynamic variables passed between steps&lt;/p&gt;

&lt;p&gt;Without these, troubleshooting is reduced to guesswork.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧰 Solution: Pino + PactumJS Event Logging
&lt;/h3&gt;

&lt;p&gt;To implement clean and contextual logging, we’ll use Pino to persist logs and hook into PactumJS’s event system to automatically log request and response details after every API interaction.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Set Up a Custom Logger
&lt;/h4&gt;

&lt;p&gt;Create a logger using pino, and write all logs to a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// logger.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pino&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pino&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pino&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pino-pretty&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`logs/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;.log`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;translateTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UTC:yyyy-mm-dd HH:MM:ss.l o&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Hook Into Pactum Events
&lt;/h4&gt;

&lt;p&gt;Use Pactum’s built-in AFTER_RESPONSE event to capture and log each request/response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// event.logger.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pactum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./logger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pactumEvents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EVENT_TYPES&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;pactumEvents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EVENT_TYPES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AFTER_RESPONSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;`Request: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, every test execution will generate rich logs that capture all HTTP activity in a structured format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Pro Tip&lt;/strong&gt;: Always stream logs to a file rather than printing to the console. Log files are easier to archive, reference later, or integrate with monitoring/reporting tools.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Sample Logs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;13.741&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;INFO &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;51775&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Setting&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;14.522&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;INFO &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;51775&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;challenger&lt;/span&gt;
    &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;method&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://apichallenges.eviltester.com/challenger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;statusCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;responseTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;780&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;headers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-challenger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3f9331e7-8f26-45bf-af46-0ffd9582a64d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;15.345&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nc"&gt;INFO &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;51775&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;
    &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;method&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://apichallenges.eviltester.com/todos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;headers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-CHALLENGER&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3f9331e7-8f26-45bf-af46-0ffd9582a64d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;process payroll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;doneStatus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;statusCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;responseTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;822&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;headers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-challenger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3f9331e7-8f26-45bf-af46-0ffd9582a64d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;process payroll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;doneStatus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📝 Reporting: Make Logs Actionable
&lt;/h2&gt;

&lt;p&gt;Logging is only &lt;strong&gt;half the story&lt;/strong&gt; — reporting turns those logs into &lt;strong&gt;insights&lt;/strong&gt;. Once your logs capture rich request and response data, the next step is to organize and deliver that information in a way that your team can actually use. Actionable reporting ensures test results don’t go unnoticed and helps drive faster decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤓 Concept: Automated Reporting with Context
&lt;/h3&gt;

&lt;p&gt;Once tests are run, logs and results need to be visible and shareable. Reporting tools help teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect regressions early&lt;/li&gt;
&lt;li&gt;Share real-time feedback in Slack/Teams&lt;/li&gt;
&lt;li&gt;Build test history and trends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧪 Tool: TestBeats for Result Publishing&lt;/p&gt;

&lt;p&gt;We’ll use &lt;a href="https://testbeats.com/" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt; to push test reports (e.g., JUnit XML) directly to Slack or dashboards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx testbeats@latest publish &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--slack&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ secrets.SLACK_WEBHOOK_URL &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--junit&lt;/span&gt; reports/junit.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This integration ensures your team doesn’t need to hunt through CI logs—they’ll be notified of test outcomes instantly, along with rich failure context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv5jat7o2264frlm7kfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv5jat7o2264frlm7kfz.png" alt="TestBeats App Dashboard" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o43hdqw8jz8tz534bio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1o43hdqw8jz8tz534bio.png" alt="TestBeats Test Logs" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack Alert&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgn8ec49hkz2oby0i1ex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgn8ec49hkz2oby0i1ex.png" alt="TestBeats Slack" width="800" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Logging is not just about debugging&lt;/strong&gt;—it’s about observability, accountability, and collaboration. Whether you're building a simple smoke suite or a complex regression pipeline, structured logs help you move from confusion to clarity.&lt;/p&gt;

&lt;p&gt;By combining &lt;strong&gt;PactumJS&lt;/strong&gt;, &lt;strong&gt;Mocha&lt;/strong&gt;, and &lt;strong&gt;Pino&lt;/strong&gt;, and by integrating tools like &lt;strong&gt;TestBeats&lt;/strong&gt;, you can build a robust E2E testing workflow that gives you complete visibility from requests to reports.&lt;/p&gt;

</description>
      <category>pactum</category>
      <category>api</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Test Reporting Tools - Exploring the Best</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Mon, 07 Oct 2024 09:40:02 +0000</pubDate>
      <link>https://dev.to/asaianudeep/test-reporting-tools-exploring-the-best-64m</link>
      <guid>https://dev.to/asaianudeep/test-reporting-tools-exploring-the-best-64m</guid>
      <description>&lt;p&gt;In the ever-evolving landscape of software development, effective testing is paramount. As organizations strive for higher quality and faster releases, the need for robust test reporting tools becomes increasingly important. This article explores three notable tools: ReportPortal, Test Observability, and TestBeats, highlighting their features and benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://reportportal.io/" rel="noopener noreferrer"&gt;Report Portal&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;ReportPortal is an open-source test automation dashboard designed to provide real-time reporting and analysis for automated tests. It consolidates results from various testing frameworks and provides a interface for teams to monitor their testing efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Source&lt;/strong&gt;: Open-source tools often have vibrant communities that contribute to the project, providing support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Analytics&lt;/strong&gt;: Offers live reporting, enabling quick identification of issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with Multiple Frameworks&lt;/strong&gt;: Supports various testing frameworks like JUnit, TestNG, and Cucumber, enhancing versatility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Historical Data Analysis&lt;/strong&gt;: Facilitates trend identification and proactive issue resolution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Complexity&lt;/strong&gt;: Initial setup and configuration can be time-consuming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure Maintenance&lt;/strong&gt;: Maintaining within an organization’s infrastructure can lead to challenges with uptime and reliability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost of Infrastructure&lt;/strong&gt;: Organizations may incur additional costs associated with hosting, scaling, and maintaining the infrastructure needed to run ReportPortal effectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://testbeats.com/" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;TestBeats is an innovative open source reporting tool designed to enhance the way teams publish and analyze test results from various automation testing frameworks. By integrating with communication platforms like &lt;strong&gt;Slack&lt;/strong&gt;, &lt;strong&gt;Microsoft Teams&lt;/strong&gt;, &lt;strong&gt;Google Chat&lt;/strong&gt; and more, TestBeats ensures that teams stay informed and can collaborate more efficiently. It brings &lt;strong&gt;AI-powered&lt;/strong&gt; reporting to deliver smart analysis and rapid insights on test failures.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/test-results-reporter" rel="noopener noreferrer"&gt;
        test-results-reporter
      &lt;/a&gt; / &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;
        testbeats
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publishes test results to Microsoft Teams, Google Chat &amp;amp; Slack
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;blockquote&gt;
&lt;p&gt;This npm package has been renamed from &lt;a href="https://www.npmjs.com/package/test-results-reporter" rel="nofollow noopener noreferrer"&gt;test-results-reporter&lt;/a&gt; to &lt;a href="https://www.npmjs.com/package/testbeats" rel="nofollow noopener noreferrer"&gt;testbeats&lt;/a&gt;. test-results-reporter will soon be phased out, and users are encouraged to transition to testbeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats%2Fraw%2Fmain%2Fassets%2Flogo.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Publish test results to Microsoft Teams, Google Chat, Slack and many more.&lt;/h4&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/test-results-parser" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7873a7a72fdc299e87aac6f9a92e4f8c54be5cd1a0fcafbc4b18e338b7cf7936/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7061727365723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://bundlephobia.com/result?p=testbeats" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8a59cbbd5e1808a201f03f3c3310eac22e3dde663e78601435994b1ab61ecbeb/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1c176a4f1d5cba4a61f0e636c53a363b5aef0a7cb616180bbe8ea650cc0eb3a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f746573742d726573756c74732d7265706f727465722f7465737462656174733f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562"&gt;&lt;img src="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562" alt="Downloads"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;TestBeats&lt;/strong&gt; is a tool designed to streamline the process of publishing test results from various automation testing frameworks to communication platforms like &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;teams&lt;/strong&gt; and more for easy access and collaboration. It unifies your test reporting to build quality insights and make faster decisions.&lt;/p&gt;
&lt;p&gt;It supports all major automation testing frameworks and tools.&lt;/p&gt;
&lt;p&gt;Read more about the project at &lt;a href="https://testbeats.com" rel="nofollow noopener noreferrer"&gt;https://testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sample Reports&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Alerts in Slack&lt;/h4&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-slack-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Results in Portal&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We use &lt;a href="https://github.com/test-results-reporter/testbeats/discussions" rel="noopener noreferrer"&gt;Github Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions. Head over to it and feel free to start a discussion. We are always happy to help 😊.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Like this project! Star it on &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐. Your support…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Source&lt;/strong&gt;: Open-source tools often have vibrant communities that contribute to the project, providing support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration with Multiple Platforms&lt;/strong&gt;: TestBeats can publish test results to popular communication platforms like Slack, Teams, and Google Chat, fostering better team collaboration and quick access to insights.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wide Tool Support&lt;/strong&gt;: TestBeats supports various automation testing tools such as Selenium, Cypress, Playwright, RestAssured, and PactumJS, making it highly versatile. Handles numerous test result formats, including TestNG, JUnit, Cucumber, Mocha, XUnit, NUnit, and MSTest, ensuring flexibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Powered Reporting&lt;/strong&gt;: TestBeats AI-driven insights help in identifying test failures quickly, providing actionable intelligence that helps in rapid decision-making.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easy Setup&lt;/strong&gt;: TestBeats offers a straightforward installation process that enables teams to quickly get started with minimal configuration, allowing for rapid adoption in testing workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steady Growth&lt;/strong&gt;: The tool is experiencing consistent growth, driven by a dedicated community that continues to contribute and enhance its capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.browserstack.com/" rel="noopener noreferrer"&gt;Test Observability&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Test Observability by BrowserStack is a tool aimed at providing comprehensive test reporting, debugging, and analytics for automation tests. It promises real-time test reporting, AI-driven test failure analysis, and flake detection to improve automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep Insights&lt;/strong&gt;: Offers granular views of test execution for quick diagnosis of issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Debugging&lt;/strong&gt;: Provides contextual information that reduces debugging time when you run your tests in BrowserStack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wide Tool Support&lt;/strong&gt;: It supports various automation testing tools.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Complexity&lt;/strong&gt;: Initial setup and configuration can be time-consuming.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: While BrowserStack offers a free tier, the advanced features and full capabilities of Test Observability are expensive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency on BrowserStack&lt;/strong&gt;: The tool is optimized for use with BrowserStack's infrastructure, which means that teams using other testing environments might not get the full benefit of its features.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As the demand for high-quality software grows, so does the importance of effective test reporting tools. ReportPortal, Test Observability, and TestBeats each offer unique advantages and drawbacks tailored to different organizational needs. By carefully evaluating the pros and cons, teams can choose the right tool to enhance their testing strategies, improve collaboration, and ultimately deliver better software products. Whether your focus is on real-time reporting, deep insights, or metric-driven analysis, these tools can help drive your testing efforts to new heights.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
      <category>qa</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Supercharge Your Test Results with AI-Driven Insights from TestBeats</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Thu, 08 Aug 2024 17:14:20 +0000</pubDate>
      <link>https://dev.to/asaianudeep/supercharge-your-test-results-with-ai-driven-insights-from-testbeats-4lhh</link>
      <guid>https://dev.to/asaianudeep/supercharge-your-test-results-with-ai-driven-insights-from-testbeats-4lhh</guid>
      <description>&lt;p&gt;Automation testing is the backbone of any robust CI/CD pipeline, but the flood of test results can quickly become overwhelming. Identifying patterns, understanding recurring issues, and keeping track of test failures can consume valuable time and resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://testbeats.com" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt;&lt;/strong&gt; — a tool designed to transform the way we handle automation test results by integrating AI-powered insights directly into your communication channels.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/test-results-reporter" rel="noopener noreferrer"&gt;
        test-results-reporter
      &lt;/a&gt; / &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;
        testbeats
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publishes test results to Microsoft Teams, Google Chat &amp;amp; Slack
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;blockquote&gt;
&lt;p&gt;This npm package has been renamed from &lt;a href="https://www.npmjs.com/package/test-results-reporter" rel="nofollow noopener noreferrer"&gt;test-results-reporter&lt;/a&gt; to &lt;a href="https://www.npmjs.com/package/testbeats" rel="nofollow noopener noreferrer"&gt;testbeats&lt;/a&gt;. test-results-reporter will soon be phased out, and users are encouraged to transition to testbeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats%2Fraw%2Fmain%2Fassets%2Flogo.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Publish test results to Microsoft Teams, Google Chat, Slack and many more.&lt;/h4&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/test-results-parser" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7873a7a72fdc299e87aac6f9a92e4f8c54be5cd1a0fcafbc4b18e338b7cf7936/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7061727365723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://bundlephobia.com/result?p=testbeats" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8a59cbbd5e1808a201f03f3c3310eac22e3dde663e78601435994b1ab61ecbeb/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1c176a4f1d5cba4a61f0e636c53a363b5aef0a7cb616180bbe8ea650cc0eb3a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f746573742d726573756c74732d7265706f727465722f7465737462656174733f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562"&gt;&lt;img src="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562" alt="Downloads"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;TestBeats&lt;/strong&gt; is a tool designed to streamline the process of publishing test results from various automation testing frameworks to communication platforms like &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;teams&lt;/strong&gt; and more for easy access and collaboration. It unifies your test reporting to build quality insights and make faster decisions.&lt;/p&gt;
&lt;p&gt;It supports all major automation testing frameworks and tools.&lt;/p&gt;
&lt;p&gt;Read more about the project at &lt;a href="https://testbeats.com" rel="nofollow noopener noreferrer"&gt;https://testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sample Reports&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Alerts in Slack&lt;/h4&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-slack-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Results in Portal&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We use &lt;a href="https://github.com/test-results-reporter/testbeats/discussions" rel="noopener noreferrer"&gt;Github Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions. Head over to it and feel free to start a discussion. We are always happy to help 😊.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Like this project! Star it on &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐. Your support…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  AI-Powered Failure Summary
&lt;/h2&gt;

&lt;p&gt;TestBeats enhances your workflow by providing an AI-Powered Failure Summary—a short, precise summary that captures all the key points from your test failures. Instead of wading through pages of detailed test results, you get a clear snapshot of what’s happening with your tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Analysis of Test Failures
&lt;/h2&gt;

&lt;p&gt;TestBeats goes beyond simple test result aggregation by offering a Smart Analysis feature that categorizes and summarizes your test failures in an intuitive way. Here's what you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭕ &lt;strong&gt;Newly Failed Tests&lt;/strong&gt;: Easily spot tests that have started failing in the latest run.&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;Always Failing Tests&lt;/strong&gt;: Identify tests that have been consistently failing, signaling the need for deeper investigation.&lt;/li&gt;
&lt;li&gt;🟡 &lt;strong&gt;Flaky Tests&lt;/strong&gt;: Detect tests that fail intermittently, helping to distinguish between genuine issues and environmental or timing-related problems.&lt;/li&gt;
&lt;li&gt;🟢 &lt;strong&gt;Recovered Tests&lt;/strong&gt;: Celebrate small victories by tracking tests that were failing but have now passed.&lt;/li&gt;
&lt;li&gt;🟥 &lt;strong&gt;Error Clusters&lt;/strong&gt;: Group similar test failures together, making it easier to understand systemic issues or common problem areas.&lt;/li&gt;
&lt;li&gt;🟠 &lt;strong&gt;Recurring Errors&lt;/strong&gt;: Highlight tests that are failing due to the same error across multiple runs, pointing to unresolved issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Integrated Notifications for Your Workflow
&lt;/h2&gt;

&lt;p&gt;TestBeats doesn’t just stop at summarizing your test failures — it also integrates seamlessly with your team’s communication tools, including Microsoft Teams, Slack, and Google Chat.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Integrating TestBeats is quick and straightforward, allowing you to get up and running in just a few minutes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is an example of &lt;strong&gt;Cypress&lt;/strong&gt; tests reported to &lt;strong&gt;Slack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr6c5x64nx3zjl1yuzkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr6c5x64nx3zjl1yuzkb.png" alt="TestBeats Slack Alert with AI Failure Summary and Smart Analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read more about it at &lt;a href="https://docs.testbeats.com/" rel="noopener noreferrer"&gt;docs.testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>testbeats</category>
      <category>testing</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>On-Call for QA Engineers</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Sat, 10 Sep 2022 05:28:43 +0000</pubDate>
      <link>https://dev.to/asaianudeep/on-call-for-qa-engineers-1c91</link>
      <guid>https://dev.to/asaianudeep/on-call-for-qa-engineers-1c91</guid>
      <description>&lt;p&gt;QA Engineers spend a considerable amount of &lt;strong&gt;time&lt;/strong&gt; and &lt;strong&gt;effort&lt;/strong&gt; in developing automation frameworks and even more on adding tests and maintaining them. &lt;/p&gt;

&lt;p&gt;Given the flaky nature of these end-to-end automation tests, most of the teams design &lt;strong&gt;alerting&lt;/strong&gt; mechanisms for test failures.&lt;/p&gt;

&lt;p&gt;Communication platforms like slack or microsoft teams are becoming the new &lt;strong&gt;graveyard&lt;/strong&gt; for these alerts as most engineers end-up ignoring them over a period of time. The primary reasons for ignoring these alerts are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excess Alerts&lt;/li&gt;
&lt;li&gt;Lack of Visibility&lt;/li&gt;
&lt;li&gt;Poor Accountability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the following sections, sample config files of &lt;a href="https://test-results-reporter.github.io/" rel="noopener noreferrer"&gt;Test Results Reporter&lt;/a&gt; cli tool are shared to follow the best practices while sending your test results to slack, microsoft teams or any other communication platforms.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/test-results-reporter" rel="noopener noreferrer"&gt;
        test-results-reporter
      &lt;/a&gt; / &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;
        testbeats
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publishes test results to Microsoft Teams, Google Chat &amp;amp; Slack
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;blockquote&gt;
&lt;p&gt;This npm package has been renamed from &lt;a href="https://www.npmjs.com/package/test-results-reporter" rel="nofollow noopener noreferrer"&gt;test-results-reporter&lt;/a&gt; to &lt;a href="https://www.npmjs.com/package/testbeats" rel="nofollow noopener noreferrer"&gt;testbeats&lt;/a&gt;. test-results-reporter will soon be phased out, and users are encouraged to transition to testbeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jSva3o7f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Publish test results to Microsoft Teams, Google Chat, Slack and many more.&lt;/h4&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/workflows/Build/badge.svg?branch=main"&gt;&lt;img src="https://github.com/test-results-reporter/testbeats/workflows/Build/badge.svg?branch=main" alt="Build"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/40696f45d696ba670e58552e6b3cb6f815c3c787ca4ed4b0357047829162d68e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7265706f727465723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f6164732d6f6c64"&gt;&lt;img src="https://camo.githubusercontent.com/40696f45d696ba670e58552e6b3cb6f815c3c787ca4ed4b0357047829162d68e/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7265706f727465723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f6164732d6f6c64" alt="Downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a49fb6871c695fd2f1498a67172457a549c5cb96ae1744d65c7ceb0fd6b0f5ae/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f7465737462656174733f6c6f676f3d6e706d"&gt;&lt;img src="https://camo.githubusercontent.com/a49fb6871c695fd2f1498a67172457a549c5cb96ae1744d65c7ceb0fd6b0f5ae/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f7465737462656174733f6c6f676f3d6e706d" alt="Downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/224e02bec05be175415f5dcdc1957a7be3b0ded44ce0a24ed2a0b7d157665a63/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473"&gt;&lt;img src="https://camo.githubusercontent.com/224e02bec05be175415f5dcdc1957a7be3b0ded44ce0a24ed2a0b7d157665a63/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473" alt="Size"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/92364e69d67898263e41718972b0a2cba7fec1caa933c843a4ff34e2061abd08/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64654a532d25334525334431342e302e302d627269676874677265656e3f6c6f676f3d6e6f64652e6a73"&gt;&lt;img src="https://camo.githubusercontent.com/92364e69d67898263e41718972b0a2cba7fec1caa933c843a4ff34e2061abd08/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64654a532d25334525334431342e302e302d627269676874677265656e3f6c6f676f3d6e6f64652e6a73" alt="NodeJs"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0c8cca9ad841d6fb430d62c409c2d71548d3d95b653b2b0714c7e549546c3a83/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f746573742d726573756c74732d7265706f727465722f7465737462656174733f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc2bd7abaa0536bf7a640d46e1bea9110a74095aa79d9356c880682c24cb8622/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562"&gt;&lt;img src="https://camo.githubusercontent.com/bc2bd7abaa0536bf7a640d46e1bea9110a74095aa79d9356c880682c24cb8622/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562" alt="Downloads"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Get Started&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;TestBeats is a tool designed to streamline the process of publishing test results from various automation testing frameworks to communication platforms like &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;teams&lt;/strong&gt; and more for easy access and collaboration. It unifies your test reporting to build quality insights and make faster decisions.&lt;/p&gt;
&lt;p&gt;Read more about the project at &lt;a href="https://testbeats.com" rel="nofollow noopener noreferrer"&gt;https://testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sample Reports&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Alerts in Slack&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FfxtUAkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Results in Portal&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iGPFs_a4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We use &lt;a href="https://github.com/test-results-reporter/testbeats/discussions" rel="noopener noreferrer"&gt;Github Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions. Head over to it and feel free to start a discussion. We are always happy to help 😊.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Like this project! Star it on &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐. Your support means a lot to us.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Excess Alerts
&lt;/h2&gt;

&lt;p&gt;During the initial phases, looking at these alerts in your slack channels or any other place is going to be a fancy experience. After some days, we get used to ignoring them if there are more alerts than we can handle. Due to this, the &lt;strong&gt;real problems&lt;/strong&gt; are lost in the noise.&lt;/p&gt;

&lt;p&gt;One way to solve this is by sending the failure alerts to a &lt;strong&gt;different channel&lt;/strong&gt; by keeping your primary channel clean and out of noise.&lt;/p&gt;

&lt;h4&gt;
  
  
  Primary Channel
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2csHoufj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-test-summary-slim.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2csHoufj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-test-summary-slim.png%3Fraw%3Dtrue" alt="Slack Test Summary Slim" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Failure Channel
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PGASTbpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-failure-details.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PGASTbpQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-failure-details.png%3Fraw%3Dtrue" alt="Slack Failure Details" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Config
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"slack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;primary-channel-webhook-url&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"publish"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test-summary-slim"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"slack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;failure-channel-webhook-url&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"publish"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"failure-details"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lack of Visibility
&lt;/h2&gt;

&lt;p&gt;Test Failure Analysis is where value is realised and quality is improved. It is highly critical for the velocity of your releases. Failures happen for a wide variety of reasons and keeping a track of these failure reasons is a tedious task. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://reportportal.io/" rel="noopener noreferrer"&gt;ReportPortal&lt;/a&gt; is an AI powered test results portal. It uses the collected history of executions and fail patterns to achieve hands-free analysis of your latest results. With auto analysing power, it helps to distinguish between real failures and noise (&lt;em&gt;known failures or flaky tests&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;It provides the following failure categories&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product Bug (&lt;strong&gt;PB&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Automation Bug (&lt;strong&gt;AB&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;System Issue (&lt;strong&gt;SI&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;No Defect (&lt;strong&gt;ND&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;To Investigate (&lt;strong&gt;TI&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://test-results-reporter.github.io/extensions/report-portal-analysis.html" rel="noopener noreferrer"&gt;Report Portal Analysis&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZZ81CzoP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-report-portal-analysis.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZZ81CzoP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-report-portal-analysis.png%3Fraw%3Dtrue" alt="Slack Report Portal Analysis" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Config
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"report-portal-analysis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;report-portal-base-url&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"api_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;api-key&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;project-id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"launch_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;launch-id&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Poor Accountability
&lt;/h2&gt;

&lt;p&gt;Investigating and fixing the test failures is the most important part of maintaining automation test suites. It makes the automation &lt;strong&gt;healthy&lt;/strong&gt; and &lt;strong&gt;trustworthy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One way we often see to infuse accountability is by asking the test owners (&lt;em&gt;who has written or adopted the tests&lt;/em&gt;) to look at the failures. In this approach, the knowledge is restricted and creates a dependency on others.&lt;/p&gt;

&lt;p&gt;Another way is to make the entire team responsible for all test failures. It would be a disaster, if the entire team tries to investigate the same failure at the same time or no one takes a look at them assuming others are investigating. It would be worth creating a roster for the person to look at the failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto tagging&lt;/strong&gt; the person who is on-call to investigate the test failures would definitely help in maintaining the automation suites healthy. &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://test-results-reporter.github.io/extensions/mentions.html" rel="noopener noreferrer"&gt;Mentions&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--paNCV1Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-mentions.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--paNCV1Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/test-results-reporter/test-results-reporter.github.io/blob/main/docs/assets/images/slack/slack-mentions.png%3Fraw%3Dtrue" alt="Slack Mentions" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Config
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mentions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"schedule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"layers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"rotation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"every"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"week"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"slack_uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ULA15K66N"&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Anudeep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"slack_uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ULA15K66M"&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>slack</category>
      <category>results</category>
      <category>reporting</category>
      <category>automation</category>
    </item>
    <item>
      <title>Report Automation Test Results to Google Chat</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Mon, 18 Jul 2022 14:27:06 +0000</pubDate>
      <link>https://dev.to/asaianudeep/report-automation-test-results-to-google-chat-1g7m</link>
      <guid>https://dev.to/asaianudeep/report-automation-test-results-to-google-chat-1g7m</guid>
      <description>&lt;p&gt;In the previous &lt;a href="https://dev.to/asaianudeep/report-test-results-to-slack-or-microsoft-teams-2597"&gt;post&lt;/a&gt; we have seen the integration of test results to &lt;strong&gt;microsoft teams&lt;/strong&gt; and &lt;strong&gt;slack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will check on reporting your test results to &lt;strong&gt;Google Chat&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/test-results-reporter" rel="noopener noreferrer"&gt;
        test-results-reporter
      &lt;/a&gt; / &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;
        testbeats
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publishes test results to Microsoft Teams, Google Chat &amp;amp; Slack
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;blockquote&gt;
&lt;p&gt;This npm package has been renamed from &lt;a href="https://www.npmjs.com/package/test-results-reporter" rel="nofollow noopener noreferrer"&gt;test-results-reporter&lt;/a&gt; to &lt;a href="https://www.npmjs.com/package/testbeats" rel="nofollow noopener noreferrer"&gt;testbeats&lt;/a&gt;. test-results-reporter will soon be phased out, and users are encouraged to transition to testbeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats%2Fraw%2Fmain%2Fassets%2Flogo.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Publish test results to Microsoft Teams, Google Chat, Slack and many more.&lt;/h4&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/test-results-parser" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7873a7a72fdc299e87aac6f9a92e4f8c54be5cd1a0fcafbc4b18e338b7cf7936/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7061727365723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://bundlephobia.com/result?p=testbeats" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8a59cbbd5e1808a201f03f3c3310eac22e3dde663e78601435994b1ab61ecbeb/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1c176a4f1d5cba4a61f0e636c53a363b5aef0a7cb616180bbe8ea650cc0eb3a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f746573742d726573756c74732d7265706f727465722f7465737462656174733f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562"&gt;&lt;img src="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562" alt="Downloads"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;TestBeats&lt;/strong&gt; is a tool designed to streamline the process of publishing test results from various automation testing frameworks to communication platforms like &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;teams&lt;/strong&gt; and more for easy access and collaboration. It unifies your test reporting to build quality insights and make faster decisions.&lt;/p&gt;
&lt;p&gt;It supports all major automation testing frameworks and tools.&lt;/p&gt;
&lt;p&gt;Read more about the project at &lt;a href="https://testbeats.com" rel="nofollow noopener noreferrer"&gt;https://testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sample Reports&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Alerts in Slack&lt;/h4&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-slack-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Results in Portal&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We use &lt;a href="https://github.com/test-results-reporter/testbeats/discussions" rel="noopener noreferrer"&gt;Github Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions. Head over to it and feel free to start a discussion. We are always happy to help 😊.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Like this project! Star it on &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐. Your support…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://testbeats.com" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt; is a command line tool that can publish test results to numerous communication platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create an incoming webhook url for a chat space - &lt;a href="https://developers.google.com/chat/how-tos/webhooks#create_a_webook" rel="noopener noreferrer"&gt;docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a config file either in &lt;code&gt;json&lt;/code&gt; or &lt;code&gt;js&lt;/code&gt; format.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"inputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;chat-incoming-webhook-url&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"junit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"path/to/junit-results.xml"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install Node.js in your system.&lt;/li&gt;
&lt;li&gt;Run this command to report the results.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx test-results-reporter publish &lt;span class="nt"&gt;-c&lt;/span&gt; path/to/config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>chat</category>
      <category>teams</category>
      <category>slack</category>
    </item>
    <item>
      <title>Report test results to slack or microsoft teams</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Tue, 26 Apr 2022 10:27:36 +0000</pubDate>
      <link>https://dev.to/asaianudeep/report-test-results-to-slack-or-microsoft-teams-2597</link>
      <guid>https://dev.to/asaianudeep/report-test-results-to-slack-or-microsoft-teams-2597</guid>
      <description>&lt;p&gt;Sharing the test results to the right places at the right time is very important when you are working in a high velocity organisations.&lt;/p&gt;

&lt;p&gt;And also having the right platform where teams can discuss transparently on the test failures is also equally important.&lt;/p&gt;

&lt;p&gt;These test results come in different forms like &lt;strong&gt;JUnit&lt;/strong&gt;, &lt;strong&gt;TestNG&lt;/strong&gt;, &lt;strong&gt;xUnit&lt;/strong&gt; and many more from testing tools like &lt;strong&gt;Selenium&lt;/strong&gt;, &lt;strong&gt;Cypress&lt;/strong&gt; or &lt;strong&gt;RestAssured&lt;/strong&gt;. Similarly organisations use different communication platforms like &lt;strong&gt;Slack&lt;/strong&gt;, &lt;strong&gt;Microsoft Teams&lt;/strong&gt;., etc for sending different kinds of alerts.&lt;/p&gt;

&lt;h2&gt;
  
  
  TestBeats
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://testbeats.com" rel="noopener noreferrer"&gt;TestBeats&lt;/a&gt; is a command line tool that solves this problem elegantly. It allows us to publish test results to different entities. Even it allows us to customise the report to include hyperlinks, reportportal analysis, mentioning users based on a on-call schedule and more.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/test-results-reporter" rel="noopener noreferrer"&gt;
        test-results-reporter
      &lt;/a&gt; / &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;
        testbeats
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Publishes test results to Microsoft Teams, Google Chat &amp;amp; Slack
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;blockquote&gt;
&lt;p&gt;This npm package has been renamed from &lt;a href="https://www.npmjs.com/package/test-results-reporter" rel="nofollow noopener noreferrer"&gt;test-results-reporter&lt;/a&gt; to &lt;a href="https://www.npmjs.com/package/testbeats" rel="nofollow noopener noreferrer"&gt;testbeats&lt;/a&gt;. test-results-reporter will soon be phased out, and users are encouraged to transition to testbeats.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats/raw/main/assets/logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats%2Fraw%2Fmain%2Fassets%2Flogo.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Publish test results to Microsoft Teams, Google Chat, Slack and many more.&lt;/h4&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/test-results-reporter/testbeats/actions/workflows/build.yml/badge.svg" alt="Build"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/test-results-parser" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7873a7a72fdc299e87aac6f9a92e4f8c54be5cd1a0fcafbc4b18e338b7cf7936/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f746573742d726573756c74732d7061727365723f6c6f676f3d6e706d266c6162656c3d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://bundlephobia.com/result?p=testbeats" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8a59cbbd5e1808a201f03f3c3310eac22e3dde663e78601435994b1ab61ecbeb/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f746573746265617473" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/test-results-reporter/testbeats/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1c176a4f1d5cba4a61f0e636c53a363b5aef0a7cb616180bbe8ea650cc0eb3a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f746573742d726573756c74732d7265706f727465722f7465737462656174733f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562"&gt;&lt;img src="https://camo.githubusercontent.com/7ba72704ebe4013454c897b3bf973c0d5d1fd6ea34df44ddfc44273cd4223b71/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f746573742d726573756c74732d7265706f727465722f7465737462656174732f746f74616c3f6c6f676f3d676974687562" alt="Downloads"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;TestBeats&lt;/strong&gt; is a tool designed to streamline the process of publishing test results from various automation testing frameworks to communication platforms like &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;teams&lt;/strong&gt; and more for easy access and collaboration. It unifies your test reporting to build quality insights and make faster decisions.&lt;/p&gt;
&lt;p&gt;It supports all major automation testing frameworks and tools.&lt;/p&gt;
&lt;p&gt;Read more about the project at &lt;a href="https://testbeats.com" rel="nofollow noopener noreferrer"&gt;https://testbeats.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sample Reports&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Alerts in Slack&lt;/h4&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-slack-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-slack-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Results in Portal&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/test-results-reporter/testbeats./assets/testbeats-failure-summary.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftestbeats.%2Fassets%2Ftestbeats-failure-summary.png" alt="testbeats-failure-summary"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;We use &lt;a href="https://github.com/test-results-reporter/testbeats/discussions" rel="noopener noreferrer"&gt;Github Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions. Head over to it and feel free to start a discussion. We are always happy to help 😊.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Like this project! Star it on &lt;a href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐. Your support…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/test-results-reporter/testbeats" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Sample Reports
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Slack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftest-results-reporter.github.io%2Fblob%2Fmain%2Fdocs%2Fassets%2Fimages%2Fslack%2Fslack-hyperlinks.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftest-results-reporter.github.io%2Fblob%2Fmain%2Fdocs%2Fassets%2Fimages%2Fslack%2Fslack-hyperlinks.png%3Fraw%3Dtrue" alt="slack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Teams
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftest-results-reporter.github.io%2Fblob%2Fmain%2Fdocs%2Fassets%2Fimages%2Fteams%2Fteams-report-portal-analysis.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftest-results-reporter%2Ftest-results-reporter.github.io%2Fblob%2Fmain%2Fdocs%2Fassets%2Fimages%2Fteams%2Fteams-report-portal-analysis.png%3Fraw%3Dtrue" alt="teams"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>slack</category>
      <category>teams</category>
      <category>test</category>
      <category>testbeats</category>
    </item>
    <item>
      <title>Top clickbait titles</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Fri, 25 Mar 2022 12:11:31 +0000</pubDate>
      <link>https://dev.to/asaianudeep/top-clickbait-titles-3fba</link>
      <guid>https://dev.to/asaianudeep/top-clickbait-titles-3fba</guid>
      <description>&lt;p&gt;🙂&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API Integration Testing Made Easy</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Fri, 22 Oct 2021 14:37:51 +0000</pubDate>
      <link>https://dev.to/asaianudeep/api-integration-testing-made-easy-1lcp</link>
      <guid>https://dev.to/asaianudeep/api-integration-testing-made-easy-1lcp</guid>
      <description>&lt;p&gt;Writing integration tests for API's is challenging in a micro-services world as it involves multiple API's from multiple components.&lt;/p&gt;

&lt;p&gt;In this article we will be focusing on the two major challenges of writing API Integration Testing. It also talks about how to overcome them by using modern testing tools and techniques. We will be using &lt;strong&gt;PactumJS&lt;/strong&gt; to write automated API integration test cases.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pactumjs" rel="noopener noreferrer"&gt;
        pactumjs
      &lt;/a&gt; / &lt;a href="https://github.com/pactumjs/pactum" rel="noopener noreferrer"&gt;
        pactum
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      REST API Testing Tool for all levels in a Test Pyramid
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pactumjs/pactum./assets/logo-icon-small.svg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpactumjs%2Fpactum.%2Fassets%2Flogo-icon-small.svg" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PactumJS&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pactumjs/pactum/workflows/Build/badge.svg?branch=master"&gt;&lt;img src="https://github.com/pactumjs/pactum/workflows/Build/badge.svg?branch=master" alt="Build"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c3195ff63edc49cd793a2b98d4baebfecbdd9588f3b1026626938c68b847bd21/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636c696d6174652f636f7665726167652f41536169416e75646565702f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/c3195ff63edc49cd793a2b98d4baebfecbdd9588f3b1026626938c68b847bd21/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636c696d6174652f636f7665726167652f41536169416e75646565702f70616374756d" alt="Coverage"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d905a2fda3d07fe6cb06cb396018deb228fd848c73893c0deef4605f58e4e870/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/d905a2fda3d07fe6cb06cb396018deb228fd848c73893c0deef4605f58e4e870/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f70616374756d" alt="Downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a7e5774027ae0918e841acf20ea98f81b993075e40e596f12348c702fb27c81b/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/a7e5774027ae0918e841acf20ea98f81b993075e40e596f12348c702fb27c81b/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f70616374756d" alt="Size"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d4f46c194adbe1ea503e637ba6a7bd3934d6e0ecd37127444b42545721fee402/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/d4f46c194adbe1ea503e637ba6a7bd3934d6e0ecd37127444b42545721fee402/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f70616374756d" alt="Platform"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pactumjs/pactum/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/25ce0b0c842c1408f6789231f6b051b9a7c6ff17f58cecb15f6115dfd2c4cbf7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f70616374756d6a732f70616374756d3f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a href="https://twitter.com/pactumjs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8b17666fc7c9275809caf9b71c3e407b2f061a98e7b5cc097b60817f52ecac14/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f70616374756d6a733f6c6162656c3d466f6c6c6f77267374796c653d736f6369616c" alt="Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;REST API Testing Tool for all levels in a Test Pyramid&lt;/h4&gt;
&lt;/div&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://pactumjs.github.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Fdemo.gif" alt="PactumJS Demo"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;

&lt;p&gt;&lt;strong&gt;PactumJS&lt;/strong&gt; is a REST API Testing Tool used to automate e2e, integration, contract &amp;amp; component (&lt;em&gt;or service level&lt;/em&gt;) tests.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Swift&lt;/li&gt;
&lt;li&gt;🎈 Lightweight&lt;/li&gt;
&lt;li&gt;🚀 Simple &amp;amp; Powerful&lt;/li&gt;
&lt;li&gt;🛠️ Compelling Mock Server&lt;/li&gt;
&lt;li&gt;💎 Elegant Data Management&lt;/li&gt;
&lt;li&gt;🔧 Extendable &amp;amp; Customizable&lt;/li&gt;
&lt;li&gt;📚 Clear &amp;amp; Comprehensive Testing Style&lt;/li&gt;
&lt;li&gt;🔗 Component, Contract &amp;amp; E2E testing of APIs&lt;/li&gt;
&lt;/ul&gt;


&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/pactumjs/pactum/master/assets/rainbow.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Frainbow.png" alt="----------"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This readme offers an basic introduction to the library. Head over to the full documentation at &lt;a href="https://pactumjs.github.io" rel="nofollow noopener noreferrer"&gt;https://pactumjs.github.io&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/api-testing" rel="nofollow noopener noreferrer"&gt;API Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/integration-testing" rel="nofollow noopener noreferrer"&gt;Integration Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/component-testing" rel="nofollow noopener noreferrer"&gt;Component Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/contract-testing" rel="nofollow noopener noreferrer"&gt;Contract Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/e2e-testing" rel="nofollow noopener noreferrer"&gt;E2E Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/mock-server" rel="nofollow noopener noreferrer"&gt;Mock Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;We use Github &lt;a href="https://github.com/pactumjs/pactum/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; install pactum as a dev dependency&lt;/span&gt;
npm install --save-dev pactum

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; install a test runner to run pactum tests&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; mocha / jest / cucumber&lt;/span&gt;
npm install --save-dev mocha&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;or you can simply use&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npx pactum-init&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/pactumjs/pactum/master/assets/rainbow.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Frainbow.png" alt="----------"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Usage&lt;/h1&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pactumjs/pactum" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;These are the two things of many that I personally felt challenging while writing API Integration Tests.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Passing data across tests.&lt;/li&gt;
&lt;li&gt;Retry on failed expectations.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;It's always better to have an example to understand the core concepts of a topic under discussion.&lt;/p&gt;

&lt;p&gt;Let's take a simple example of an e-commerce application with the following API endpoints for processing an order.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/orders&lt;/code&gt; (&lt;em&gt;for placing an order&lt;/em&gt;) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt; &lt;code&gt;/api/payments&lt;/code&gt; (&lt;em&gt;for making a payment&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/api/payments/{payment_id}&lt;/code&gt; (&lt;em&gt;for fetching the status of payment&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;p&gt;To make things clear, the requests and responses shown below are overly simplified.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1 - Place Order
&lt;/h4&gt;

&lt;p&gt;A user comes in and makes a &lt;strong&gt;POST&lt;/strong&gt; request to &lt;code&gt;/api/orders&lt;/code&gt; with the following payload to place an order.&lt;/p&gt;

&lt;h5&gt;
  
  
  Request Payload
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"product"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PlayStation 5"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;At the time of writing this article, it's highly impossible to buy the above product. At-least in some places.&lt;/em&gt; 🙂&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the server responds with the following response body which contains the order &lt;code&gt;id&lt;/code&gt;. &lt;/p&gt;

&lt;h5&gt;
  
  
  Response
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1f4c99e9-12df-45d4-b455-98418f4e3b1e"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This order &lt;code&gt;id&lt;/code&gt; is dynamically generated by the API server. We need to grab it and pass it to the other endpoints like &lt;strong&gt;payments&lt;/strong&gt; to complete the order.&lt;/p&gt;

&lt;p&gt;Using any testing library, we can save the response in a variable and use them later. It works but not efficient. Because when we write integration tests for large scale applications, it forces us to pass significant amount of data between tests and API calls. Declaring intermediary variables will damage the readability of the code.&lt;/p&gt;

&lt;p&gt;To overcome this challenge PactumJS comes with a concept of &lt;a href="https://pactumjs.github.io/#/integration-testing?id=stores" rel="noopener noreferrer"&gt;Data Store&lt;/a&gt; to pass data between API calls across tests.&lt;/p&gt;

&lt;p&gt;Let's look at the test first.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PlayStation 5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OrderID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The above test will make a &lt;strong&gt;POST&lt;/strong&gt; request to &lt;code&gt;/api/orders&lt;/code&gt; with given &lt;code&gt;json&lt;/code&gt; payload and once the response is received it expects the status should be &lt;code&gt;200&lt;/code&gt; and &lt;strong&gt;stores&lt;/strong&gt; the value of &lt;code&gt;id&lt;/code&gt; into a special variable called &lt;code&gt;OrderID&lt;/code&gt; which is internal to PactumJS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2 - Make Payment
&lt;/h4&gt;

&lt;p&gt;The next step is to make the payment. Now the user makes a &lt;strong&gt;POST&lt;/strong&gt; request to &lt;code&gt;/api/payments&lt;/code&gt; with the following payload.&lt;/p&gt;

&lt;h5&gt;
  
  
  Request Payload
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"order_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1f4c99e9-12df-45d4-b455-98418f4e3b1e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"card_info"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1111-1111-1111-1111"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"11/11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cvv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"111"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now the API responds with the following response body which contains payment &lt;code&gt;id&lt;/code&gt;. &lt;/p&gt;

&lt;h5&gt;
  
  
  Response
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a32fce50-d4e8-4d95-b16f-57fd13fbb7df"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now let's talk about the test case.&lt;/p&gt;

&lt;p&gt;As you observed, the &lt;code&gt;order id&lt;/code&gt; from the previous request is included in the request payload.&lt;/p&gt;

&lt;p&gt;To get the value of special internal variable, PactumJS uses a special pattern - &lt;code&gt;$S{&amp;lt;variable-name&amp;gt;}&lt;/code&gt; to access it.&lt;/p&gt;

&lt;p&gt;Let's look at the test.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/payments&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$S{OrderID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;card_info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1111-1111-1111-1111&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expiry&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;11/11&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cvv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;111&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PaymentID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PactumJS will internally replace &lt;code&gt;$S{OrderID}&lt;/code&gt; with &lt;code&gt;1f4c99e9-12df-45d4-b455-98418f4e3b1e&lt;/code&gt; before making the request.&lt;/p&gt;

&lt;p&gt;In the above test case we are also saving the payment &lt;code&gt;id&lt;/code&gt; into the special variable &lt;code&gt;PaymentId&lt;/code&gt; using the &lt;strong&gt;stores&lt;/strong&gt; method. Using the payment &lt;code&gt;id&lt;/code&gt; we can track the status of the payment. So this brings us to the final step of our integration test.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3 - Wait for Payment to be completed.
&lt;/h4&gt;

&lt;p&gt;To get the status of the payment, user makes a &lt;strong&gt;GET&lt;/strong&gt; request to the &lt;code&gt;/api/payments/{payment_id}&lt;/code&gt; endpoint.&lt;/p&gt;

&lt;p&gt;The API responds with the following response body. &lt;/p&gt;

&lt;h5&gt;
  
  
  Response
&lt;/h5&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in-progress"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you see, the status is still &lt;code&gt;in-progress&lt;/code&gt;. We need to wait for few seconds for the payment to be completed.&lt;/p&gt;

&lt;p&gt;Including hard waits is a bad practice in testing. PactumJS comes with a concept of &lt;a href="https://pactumjs.github.io/#/integration-testing?id=retry-mechanism" rel="noopener noreferrer"&gt;retry mechanism&lt;/a&gt; which retries on failed expectations. It is similar to &lt;strong&gt;fluent wait&lt;/strong&gt; in selenium.&lt;/p&gt;

&lt;p&gt;Let's look at the test case.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/payments/{id}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withPathParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$S{PaymentID}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;By default it retries &lt;code&gt;3&lt;/code&gt; times with a delay of &lt;code&gt;1000ms&lt;/code&gt; between each retry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complete Test
&lt;/h2&gt;

&lt;p&gt;Now let's take a look at the entire test using &lt;a href="https://pactumjs.github.io" rel="noopener noreferrer"&gt;PactumJS&lt;/a&gt; and &lt;a href="https://mochajs.org/" rel="noopener noreferrer"&gt;mocha&lt;/a&gt;.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pactum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order PS5 and make payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;br&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PlayStation 5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OrderID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/payments&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;br&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$S{OrderID}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;card_info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1111-1111-1111-1111&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expiry&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;11/11&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cvv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;111&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PaymentID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/payments/{id}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withPathParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$S{PaymentID}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;br&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;&lt;br&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Writing readable and maintainable tests is very important to make API testing productive and enjoyable experience. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://pactumjs.github.io" rel="noopener noreferrer"&gt;PactumJS&lt;/a&gt; abstracts the challenging parts to write tests in an easy and fun way and ultimately making API Integration testing super easy.  &lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>javascript</category>
      <category>pactumjs</category>
    </item>
    <item>
      <title>API Testing Tools in JavaScript</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Sun, 06 Jun 2021 12:03:00 +0000</pubDate>
      <link>https://dev.to/asaianudeep/api-testing-tools-in-javascript-22d8</link>
      <guid>https://dev.to/asaianudeep/api-testing-tools-in-javascript-22d8</guid>
      <description>&lt;p&gt;API testing is a type of software testing that focuses on determining if APIs meet expectations. It is critical for automating testing because APIs now serve as the primary interface to application logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;p&gt;Here is the list of popular tools available in JavaScript for API Automation Testing in alphabetical order.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dareid.github.io/chakram/" rel="noopener noreferrer"&gt;Chakram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.frisbyjs.com/" rel="noopener noreferrer"&gt;Frisby.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/" rel="noopener noreferrer"&gt;PactumJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/visionmedia/supertest" rel="noopener noreferrer"&gt;SuperTest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Find other options at the end.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Chakram
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dareid" rel="noopener noreferrer"&gt;
        dareid
      &lt;/a&gt; / &lt;a href="https://github.com/dareid/chakram" rel="noopener noreferrer"&gt;
        chakram
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      REST API test framework. BDD and exploits promises
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Chakram&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/dareid/chakram" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a6cbbeac84bfd35e741236f89e47651503977a8e51430be05bb73aa37a4c1ba6/68747470733a2f2f7472617669732d63692e6f72672f6461726569642f6368616b72616d2e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt; &lt;a href="https://codeclimate.com/github/dareid/chakram" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/84c134a05bf3f25fa81b89e65009cb6b6e59c41f362cfc891b5e365e3eef6423/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f6461726569642f6368616b72616d2f6261646765732f636f7665726167652e737667" alt="Test Coverage"&gt;&lt;/a&gt; &lt;a href="https://codeclimate.com/github/dareid/chakram" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b1bd990da55ad5e136c23d05f36ab8491607b0b361bd867640d427c8141d7ad1/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f6461726569642f6368616b72616d2f6261646765732f6770612e737667" alt="Code Climate"&gt;&lt;/a&gt; &lt;a href="https://gitter.im/dareid/chakram" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/14200a520497716cce99fe8cdd5cffe9f0577d97b9a86fbeb610e1d77120f4ed/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6769747465722d6a6f696e253230636861742d627269676874677265656e2e737667" alt="Gitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chakram is no longer actively maintained, PRs are welcomed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Chakram is an API testing framework designed to perform end to end tests on JSON REST endpoints.&lt;/p&gt;
&lt;p&gt;The library offers a BDD testing style and fully exploits javascript promises - the resulting tests are simple, clear and expressive. Chakram is built on &lt;a href="https://nodejs.org/" rel="nofollow noopener noreferrer"&gt;node.js&lt;/a&gt;, &lt;a href="http://mochajs.org/" rel="nofollow noopener noreferrer"&gt;mocha&lt;/a&gt;, &lt;a href="http://chaijs.com/" rel="nofollow noopener noreferrer"&gt;chai&lt;/a&gt; and &lt;a href="https://github.com/request/request" rel="noopener noreferrer"&gt;request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This readme offers an introduction to the library. For more information, visit Chakram's &lt;a href="http://dareid.github.io/chakram/" rel="nofollow noopener noreferrer"&gt;documentation&lt;/a&gt; and &lt;a href="https://github.com/dareid/chakram/tree/master/test" rel="noopener noreferrer"&gt;tests&lt;/a&gt; which demonstrate all of Chakram's capabilities. In addition, example tests of publicly accessible APIs are available in the &lt;a href="https://github.com/dareid/chakram/tree/master/examples" rel="noopener noreferrer"&gt;examples directory&lt;/a&gt;. If required, assistance can be found in the project's &lt;a href="https://gitter.im/dareid/chakram" rel="nofollow noopener noreferrer"&gt;gitter chat room&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;HTTP specific assertions. Allows testing of
&lt;ul&gt;
&lt;li&gt;Status codes&lt;/li&gt;
&lt;li&gt;Cookie presence and value&lt;/li&gt;
&lt;li&gt;Header presence and value&lt;/li&gt;
&lt;li&gt;JSON values&lt;/li&gt;
&lt;li&gt;JSON structure (using the &lt;a href="http://json-schema.org/documentation.html" rel="nofollow noopener noreferrer"&gt;JSON schema specification&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Compression&lt;/li&gt;
&lt;li&gt;Response times&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BDD formatting and hooks (e.g. beforeEach, afterEach)&lt;/li&gt;
&lt;li&gt;Promise based&lt;/li&gt;
&lt;li&gt;Plugin…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dareid/chakram" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Chakram is a REST API testing framework offering a BDD testing style and fully exploiting promises.&lt;/p&gt;

&lt;p&gt;Chakram extends &lt;strong&gt;Chai.js&lt;/strong&gt;, adding HTTP specific assertions. It allows simple verification of returned status codes, the compression used, cookies, headers, returned JSON objects and the schema of the JSON response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HTTP assertions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;should make HTTP assertions easy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chakram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://httpbin.org/get&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gzip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;chakram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;Simple Testing Style&lt;/li&gt;
&lt;li&gt;Extendable &amp;amp; Customizable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;API Chaining is inelegant&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Frisby.js
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vlucas" rel="noopener noreferrer"&gt;
        vlucas
      &lt;/a&gt; / &lt;a href="https://github.com/vlucas/frisby" rel="noopener noreferrer"&gt;
        frisby
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Frisby is a REST API testing framework built on Jest that makes testing API endpoints easy, fast, and fun.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Frisby&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://nodei.co/npm/frisby/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0909b263519e03d4efc59b4f932879def6393eaa8ace660fc458326910dc402d/68747470733a2f2f6e6f6465692e636f2f6e706d2f6672697362792e706e67" alt="NPM"&gt;&lt;/a&gt;
&lt;a href="https://github.com/vlucas/frisby/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/vlucas/frisby/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/5210420/193491809-ecfe1741-3931-4c32-8554-483294e91592.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F5210420%2F193491809-ecfe1741-3931-4c32-8554-483294e91592.png" alt="Frisby.js"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Introduction&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Frisby.js an API testing tool built on top of
&lt;a href="https://facebook.github.io/jest/" rel="nofollow noopener noreferrer"&gt;Jest&lt;/a&gt; that makes testing API endpoints easy
fast and fun.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Install Frisby v2.x from NPM into your project:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm install --save-dev frisby joi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Creating Tests&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Simple Example&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The minimum setup to run a single test expectation.&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;frisby&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'frisby'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-en"&gt;it&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'should be a teapot'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-c"&gt;// Return the Frisby.js Spec in the 'it()' (just like a promise)&lt;/span&gt;
  &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-s1"&gt;frisby&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;get&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'http://httpbin.org/status/418'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;
    &lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;expect&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'status'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;418&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Nested Dependent HTTP Calls&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;A more complex example with nested dependent Frisby tests with Frisby's Promise-style &lt;code&gt;then&lt;/code&gt; method.&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;frisby&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'frisby'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-v"&gt;Joi&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'joi'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-en"&gt;describe&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'Posts'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-en"&gt;it&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'should return all posts and first post should have&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vlucas/frisby" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Frisby makes REST API testing easy, fast, and fun. Frisby.js comes loaded with many built-in tools for the most common things you need to test for to ensure your REST API is working as it should, and returning the correct properties, values, and types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frisby&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;frisby&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;it &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST should return a status of 201 Created&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;frisby&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://api.example.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My New Blog Post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;A cool blog post!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use &amp;amp; setup&lt;/li&gt;
&lt;li&gt;Good Community Support&lt;/li&gt;
&lt;li&gt;Extendable &amp;amp; Customizable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Only CRUD&lt;/li&gt;
&lt;li&gt;API Chaining is inelegant&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  PactumJS
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pactumjs" rel="noopener noreferrer"&gt;
        pactumjs
      &lt;/a&gt; / &lt;a href="https://github.com/pactumjs/pactum" rel="noopener noreferrer"&gt;
        pactum
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      REST API Testing Tool for all levels in a Test Pyramid
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;span&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pactumjs/pactum./assets/logo-icon-small.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpactumjs%2Fpactum.%2Fassets%2Flogo-icon-small.svg" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PactumJS&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pactumjs/pactum/workflows/Build/badge.svg?branch=master"&gt;&lt;img src="https://github.com/pactumjs/pactum/workflows/Build/badge.svg?branch=master" alt="Build"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c3195ff63edc49cd793a2b98d4baebfecbdd9588f3b1026626938c68b847bd21/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636c696d6174652f636f7665726167652f41536169416e75646565702f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/c3195ff63edc49cd793a2b98d4baebfecbdd9588f3b1026626938c68b847bd21/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636c696d6174652f636f7665726167652f41536169416e75646565702f70616374756d" alt="Coverage"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d905a2fda3d07fe6cb06cb396018deb228fd848c73893c0deef4605f58e4e870/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/d905a2fda3d07fe6cb06cb396018deb228fd848c73893c0deef4605f58e4e870/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f70616374756d" alt="Downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a7e5774027ae0918e841acf20ea98f81b993075e40e596f12348c702fb27c81b/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/a7e5774027ae0918e841acf20ea98f81b993075e40e596f12348c702fb27c81b/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f70616374756d" alt="Size"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d4f46c194adbe1ea503e637ba6a7bd3934d6e0ecd37127444b42545721fee402/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f70616374756d"&gt;&lt;img src="https://camo.githubusercontent.com/d4f46c194adbe1ea503e637ba6a7bd3934d6e0ecd37127444b42545721fee402/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f70616374756d" alt="Platform"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pactumjs/pactum/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/25ce0b0c842c1408f6789231f6b051b9a7c6ff17f58cecb15f6115dfd2c4cbf7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f70616374756d6a732f70616374756d3f7374796c653d736f6369616c" alt="Stars"&gt;&lt;/a&gt;
&lt;a href="https://twitter.com/pactumjs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8b17666fc7c9275809caf9b71c3e407b2f061a98e7b5cc097b60817f52ecac14/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f70616374756d6a733f6c6162656c3d466f6c6c6f77267374796c653d736f6369616c" alt="Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;REST API Testing Tool for all levels in a Test Pyramid&lt;/h4&gt;
&lt;/div&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://pactumjs.github.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Fdemo.gif" alt="PactumJS Demo"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;

&lt;p&gt;&lt;strong&gt;PactumJS&lt;/strong&gt; is a REST API Testing Tool used to automate e2e, integration, contract &amp;amp; component (&lt;em&gt;or service level&lt;/em&gt;) tests.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Swift&lt;/li&gt;
&lt;li&gt;🎈 Lightweight&lt;/li&gt;
&lt;li&gt;🚀 Simple &amp;amp; Powerful&lt;/li&gt;
&lt;li&gt;🛠️ Compelling Mock Server&lt;/li&gt;
&lt;li&gt;💎 Elegant Data Management&lt;/li&gt;
&lt;li&gt;🔧 Extendable &amp;amp; Customizable&lt;/li&gt;
&lt;li&gt;📚 Clear &amp;amp; Comprehensive Testing Style&lt;/li&gt;
&lt;li&gt;🔗 Component, Contract &amp;amp; E2E testing of APIs&lt;/li&gt;
&lt;/ul&gt;


&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/pactumjs/pactum/master/assets/rainbow.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Frainbow.png" alt="----------"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This readme offers an basic introduction to the library. Head over to the full documentation at &lt;a href="https://pactumjs.github.io" rel="nofollow noopener noreferrer"&gt;https://pactumjs.github.io&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/api-testing" rel="nofollow noopener noreferrer"&gt;API Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/integration-testing" rel="nofollow noopener noreferrer"&gt;Integration Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/component-testing" rel="nofollow noopener noreferrer"&gt;Component Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/contract-testing" rel="nofollow noopener noreferrer"&gt;Contract Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/e2e-testing" rel="nofollow noopener noreferrer"&gt;E2E Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pactumjs.github.io/guides/mock-server" rel="nofollow noopener noreferrer"&gt;Mock Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;We use Github &lt;a href="https://github.com/pactumjs/pactum/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt; to receive feedback, discuss ideas &amp;amp; answer questions.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; install pactum as a dev dependency&lt;/span&gt;
npm install --save-dev pactum

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; install a test runner to run pactum tests&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; mocha / jest / cucumber&lt;/span&gt;
npm install --save-dev mocha&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;or you can simply use&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npx pactum-init&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/pactumjs/pactum/master/assets/rainbow.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fpactumjs%2Fpactum%2Fmaster%2Fassets%2Frainbow.png" alt="----------"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Usage&lt;/h1&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pactumjs/pactum" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;PactumJS is a REST API Testing Tool for all levels in a Test Pyramid and used to automate e2e, integration, contract &amp;amp; component (or service level) tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;spec&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pactum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should save a new user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Basic xxxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withJson&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bolt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bolt@swift.run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight&lt;/li&gt;
&lt;li&gt;Active &amp;amp; Growing&lt;/li&gt;
&lt;li&gt;Simple &amp;amp; Powerful&lt;/li&gt;
&lt;li&gt;Compelling Mock Server&lt;/li&gt;
&lt;li&gt;Elegant Data Management&lt;/li&gt;
&lt;li&gt;Advanced Retry Mechanism&lt;/li&gt;
&lt;li&gt;Extendable &amp;amp; Customizable&lt;/li&gt;
&lt;li&gt;Clear &amp;amp; Comprehensive Testing Style&lt;/li&gt;
&lt;li&gt;Component, Contract &amp;amp; E2E testing of APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Limited Community Support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  SuperTest
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ladjs" rel="noopener noreferrer"&gt;
        ladjs
      &lt;/a&gt; / &lt;a href="https://github.com/ladjs/supertest" rel="noopener noreferrer"&gt;
        supertest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🕷 Super-agent driven library for testing node.js HTTP servers using a fluent API.   Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://ladjs.github.io/superagent/" rel="nofollow noopener noreferrer"&gt;SuperTest&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://codecov.io/gh/ladjs/supertest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d99e71ba00ec69eb131ba22f429a4ce540c3e1d8325f29b3c4afca9eaea67ea1/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f6c61646a732f7375706572746573742e737667" alt="code coverage"&gt;&lt;/a&gt;
&lt;a href="https://travis-ci.org/ladjs/supertest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/23c55ea71e4b581cec1a04c19d3921d876553db3842c7f9e0a6ee7c3b7d7e9a8/68747470733a2f2f7472617669732d63692e6f72672f6c61646a732f7375706572746573742e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://david-dm.org/ladjs/supertest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/088898c2b414fbdbb4d0d2d1f90530d5433e2fe717d3ac73b7622746a6d29d6e/68747470733a2f2f64617669642d646d2e6f72672f6c61646a732f7375706572746573742f7374617475732e737667" alt="Dependencies"&gt;&lt;/a&gt;
&lt;a href="http://makeapullrequest.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/88482ebfc5e3e4f2d667148ab6a3eb55948789f1dba71dfa0eb2e05afe02958c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="PRs Welcome"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ladjs/supertest/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/991128497f8602153bd750992763959c1103dd72572508939bb4e229c1a5a668/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c61742d737175617265" alt="MIT License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTP assertions made easy via &lt;a href="http://github.com/ladjs/superagent" rel="noopener noreferrer"&gt;superagent&lt;/a&gt;.  Maintained for &lt;a href="https://github.com/forwardemail" rel="noopener noreferrer"&gt;Forward Email&lt;/a&gt; and &lt;a href="https://github.com/ladjs" rel="noopener noreferrer"&gt;Lad&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The motivation with this module is to provide a high-level abstraction for testing
HTTP, while still allowing you to drop down to the &lt;a href="https://ladjs.github.io/superagent/" rel="nofollow noopener noreferrer"&gt;lower-level API&lt;/a&gt; provided by superagent.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Install SuperTest as an npm module and save it to your package.json file as a development dependency:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install supertest --save-dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Once installed it can now be referenced by simply calling &lt;code&gt;require('supertest');&lt;/code&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Example&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;You may pass an &lt;code&gt;http.Server&lt;/code&gt;, or a &lt;code&gt;Function&lt;/code&gt; to &lt;code&gt;request()&lt;/code&gt; - if the server is not
already listening for connections then it is bound to an ephemeral port for you so
there is no need to keep track of ports.&lt;/p&gt;
&lt;p&gt;SuperTest works with any test framework, here is an example without using any
test framework at all:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;request&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'supertest'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;express&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;require&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ladjs/supertest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;SuperTest is built on a HTTP client called SuperAgent. The motivation with this module is to provide a high-level abstraction for testing HTTP, while still allowing you to drop down to the lower-level API provided by superagent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;supertest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;john&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET /user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;responds with json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Accept&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/json/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simple &amp;amp; Powerful&lt;/li&gt;
&lt;li&gt;Good Community Support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chakram&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Frisby.js&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PactumJS&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SuperTest&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CRUD Operations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Non CRUD Operations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global Request Setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Assertions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exception Handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BDD Style&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cucumber Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inspectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retry Mechanism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Reporting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mock Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contract Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Others
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ariesb/autokin" rel="noopener noreferrer"&gt;autokin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/meeshkan/freddo" rel="noopener noreferrer"&gt;freddo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiranz/just-api" rel="noopener noreferrer"&gt;just-api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ply-ct/ply" rel="noopener noreferrer"&gt;ply&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jpthethi/teakozi" rel="noopener noreferrer"&gt;teakozi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>api</category>
      <category>pactumjs</category>
    </item>
    <item>
      <title>Boost your code coverage with API Tests</title>
      <dc:creator>Anudeep</dc:creator>
      <pubDate>Fri, 07 May 2021 17:40:26 +0000</pubDate>
      <link>https://dev.to/asaianudeep/boost-your-code-coverage-with-api-tests-13hd</link>
      <guid>https://dev.to/asaianudeep/boost-your-code-coverage-with-api-tests-13hd</guid>
      <description>&lt;p&gt;Code coverage is an important quality metric that determines the number of lines of source code that is tested &amp;amp; covered by automated tests. Usually, developers achieve code coverage close to &lt;strong&gt;80%&lt;/strong&gt; by writing &lt;strong&gt;unit tests&lt;/strong&gt; (&lt;em&gt;most popular tests to generate code coverage&lt;/em&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  Targeted Code
&lt;/h4&gt;

&lt;p&gt;In general unit tests targets happy paths, core business logic, and rarely sad paths. Most likely they can give us close to &lt;strong&gt;80%&lt;/strong&gt; of code coverage. The remaining &lt;strong&gt;20%&lt;/strong&gt; of source code might be responsible for handling external interfaces and exceptions/errors. Unit tests generally omit testing external interface logic that interacts with outside applications &amp;amp; databases.&lt;/p&gt;

&lt;p&gt;Testing the external interface logic at the early phases of SDLC is very critical for delivering a quality software product.&lt;/p&gt;

&lt;h4&gt;
  
  
  API Testing
&lt;/h4&gt;

&lt;p&gt;API testing is critical for automating testing because APIs now serve as the primary interface to application logic. API tests could greatly improve the code coverage of applications and the overall confidence in the product.&lt;/p&gt;

&lt;p&gt;Let's see how to get code coverage from API tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;In this example, we will be looking at a basic &lt;strong&gt;Node.js&lt;/strong&gt; web application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source Code
&lt;/h3&gt;

&lt;p&gt;Look at the sample web app server written in &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;express&lt;/a&gt;. (&lt;em&gt;Express is a minimal and flexible Node.js web application framework&lt;/em&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// index.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`App listening at http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To run the application, execute the below command in terminal&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  API Tests
&lt;/h3&gt;

&lt;p&gt;Look at the sample API tests written using &lt;a href="https://pactumjs.github.io/" rel="noopener noreferrer"&gt;PactumJS&lt;/a&gt; and &lt;a href="https://mochajs.org/" rel="noopener noreferrer"&gt;mocha&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pactumjs" rel="noopener noreferrer"&gt;
        pactumjs
      &lt;/a&gt; / &lt;a href="https://github.com/pactumjs/pactum" rel="noopener noreferrer"&gt;
        pactum
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      REST API Testing Tool for all levels in a Test Pyramid
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.test.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pactum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET /hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pactum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3333/hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expectBody&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run the tests, execute the below command in terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mocha app.test.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code Coverage
&lt;/h3&gt;

&lt;p&gt;We have seen how to run the application &amp;amp; execute tests against it. To generate code coverage from API tests, we will be using an npm package called &lt;a href="https://www.npmjs.com/package/nyc" rel="noopener noreferrer"&gt;nyc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Install the package globally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i nyc &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now run your application with this magical tool &lt;strong&gt;nyc&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nyc node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Output
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqyqviizmp2kwom40yx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqyqviizmp2kwom40yx.png" alt="output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run Tests&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mocha app.test.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Output
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp63k4ab8qbqgl61l0rg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp63k4ab8qbqgl61l0rg.png" alt="output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop the application by pressing &lt;code&gt;CTRL + c&lt;/code&gt;. Now the &lt;strong&gt;nyc&lt;/strong&gt; tool will generate and display the code coverage in the terminal.&lt;/p&gt;

&lt;h6&gt;
  
  
  Output
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2npwkizvxnqe0r3y8pj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2npwkizvxnqe0r3y8pj7.png" alt="output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For real and complex web applications, the code-coverage setup might not be straightforward. It might require additional steps and advanced configurations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Importance of API testing is growing day by day. Not only using these tests for validating applications but also for generating code coverage metrics is an added advantage. &lt;/p&gt;

&lt;p&gt;In most scenarios, a simple API test could cover a big chunk of source code. It means with fewer API Tests we can get more code coverage and confidence in the application.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>codequality</category>
      <category>pactumjs</category>
    </item>
  </channel>
</rss>
