<?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: Abhilash Biradar</title>
    <description>The latest articles on DEV Community by Abhilash Biradar (@abhilashbbbbb).</description>
    <link>https://dev.to/abhilashbbbbb</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2717693%2Ffcb6c1c1-982b-4d7b-b08f-f5aba759f11a.jpg</url>
      <title>DEV Community: Abhilash Biradar</title>
      <link>https://dev.to/abhilashbbbbb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhilashbbbbb"/>
    <language>en</language>
    <item>
      <title>Beautiful HTML Reports for Your httpYac API Tests — Zero Dependencies</title>
      <dc:creator>Abhilash Biradar</dc:creator>
      <pubDate>Mon, 27 Jul 2026 16:21:37 +0000</pubDate>
      <link>https://dev.to/abhilashbbbbb/beautiful-html-reports-for-your-httpyac-api-tests-zero-dependencies-236h</link>
      <guid>https://dev.to/abhilashbbbbb/beautiful-html-reports-for-your-httpyac-api-tests-zero-dependencies-236h</guid>
      <description>&lt;p&gt;You run your httpYac tests in CI. Everything passes. You share the results with your team. They ask: &lt;em&gt;"Can we see a report?"&lt;/em&gt; You stare at the terminal output and sigh.&lt;/p&gt;

&lt;p&gt;That's the problem &lt;code&gt;httpyac-plugin-reporter-html&lt;/code&gt; solves.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is httpYac?
&lt;/h2&gt;

&lt;p&gt;If you haven't used &lt;a href="https://httpyac.github.io/" rel="noopener noreferrer"&gt;httpYac&lt;/a&gt; yet, think of it as the CLI-powered sibling of the REST Client VS Code extension. You write your API calls in plain &lt;code&gt;.http&lt;/code&gt; files — method, URL, headers, body, assertions — and run them from the terminal or in CI/CD pipelines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;### Get user profile
GET https://api.example.com/users/42
Authorization: Bearer {{token}}

?? status == 200
?? body name != null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;httpyac send &lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's fast, scriptable, and integrates beautifully with any pipeline. The missing piece? A shareable, human-readable report.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter &lt;code&gt;httpyac-plugin-reporter-html&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This plugin hooks into the httpYac lifecycle and generates a &lt;strong&gt;single standalone HTML file&lt;/strong&gt; after your tests complete. Open it in any browser — no server, no internet, no dependencies. Everything — CSS, JavaScript, test data — is inlined.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futo48hg8nfihk557m4j9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futo48hg8nfihk557m4j9.png" alt="Report overview" width="800" height="407"&gt;&lt;/a&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkt3gc41xceg86q45wy0g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkt3gc41xceg86q45wy0g.png" alt="Expanded card with test assertions" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Install and Run in 2 Minutes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Install the plugin:&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;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; httpyac-plugin-reporter-html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;httpYac &lt;strong&gt;automatically discovers&lt;/strong&gt; the plugin — no extra config needed. Just run your tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;httpyac send &lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;report.html&lt;/code&gt; is written to your project root. Done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional config in &lt;code&gt;.httpyac.config.js&lt;/code&gt;:&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="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="na"&gt;htmlReporter&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 API Test Report&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;outputFile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reports/test-report.html&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;h2&gt;
  
  
  What the Report Actually Shows
&lt;/h2&gt;

&lt;p&gt;This isn't a wall of green checkmarks. Each test region gets a card with everything you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;9-stat hero bar&lt;/strong&gt; — requests, passed, failed, skipped, duration + test-level totals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color-coded cards&lt;/strong&gt; — green (2xx), amber (3xx), orange (4xx), red (5xx)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collapsible panels&lt;/strong&gt; — request headers, request body, response headers, response body (pretty-printed JSON)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assertion badges&lt;/strong&gt; — every &lt;code&gt;??&lt;/code&gt; assertion gets its own badge; failed ones show the actual error message inline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata per request&lt;/strong&gt; — source file + line number, timestamp, &lt;code&gt;@title&lt;/code&gt; and &lt;code&gt;@description&lt;/code&gt; from your &lt;code&gt;.http&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side filter &amp;amp; search&lt;/strong&gt; — filter by outcome or HTTP status class, search by URL / name / file — no page reload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non-HTTP regions (AMQP, MQTT, gRPC, WebSocket) are automatically skipped — the report stays focused on HTTP requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Drop It Into GitHub Actions
&lt;/h2&gt;

&lt;p&gt;The report is CI-ready out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api-tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run httpYac tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpyac send **/*.http --all&lt;/span&gt;
        &lt;span class="na"&gt;continue-on-error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;   &lt;span class="c1"&gt;# still upload the report even if tests fail&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload HTML report&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-test-report&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;report.html&lt;/span&gt;
          &lt;span class="na"&gt;retention-days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;if: always()&lt;/code&gt; is important — you want the report even when tests fail.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configuration Options
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"httpYac HTML Report"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Title shown in the report header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;outputFile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"report.html"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output path relative to workspace root&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;The plugin hooks into the &lt;code&gt;responseLogging&lt;/code&gt; lifecycle event — not &lt;code&gt;onResponse&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This distinction matters. &lt;code&gt;onResponse&lt;/code&gt; fires immediately after the HTTP response arrives — &lt;strong&gt;before&lt;/strong&gt; &lt;code&gt;??&lt;/code&gt; assertions have run. Collecting results there gives you empty test data every time.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;responseLogging&lt;/code&gt; fires &lt;strong&gt;after&lt;/strong&gt; the full execute loop including all assertions. By the time the plugin collects the result, every &lt;code&gt;??&lt;/code&gt; assertion has been evaluated and the full status (&lt;code&gt;SUCCESS&lt;/code&gt;, &lt;code&gt;FAILED&lt;/code&gt;, &lt;code&gt;ERROR&lt;/code&gt;, &lt;code&gt;SKIPPED&lt;/code&gt;) is available on the region.&lt;/p&gt;

&lt;p&gt;The report is written progressively after each request — so even if a run is interrupted mid-way, you get a partial report with whatever completed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It, Star It, Break It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/httpyac-plugin-reporter-html" rel="noopener noreferrer"&gt;httpyac-plugin-reporter-html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/AbhilashBiradar/httpyac-plugin-reporter-html" rel="noopener noreferrer"&gt;AbhilashBiradar/httpyac-plugin-reporter-html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use httpYac in your projects, give the plugin a try and let me know how it goes in the comments. Found a bug? Have a feature idea — JSON export, multiple output formats, Slack webhook? Open an issue or send a PR.&lt;/p&gt;

&lt;p&gt;Happy testing. 🧪&lt;/p&gt;

</description>
      <category>node</category>
      <category>testing</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
