<?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: joehom sum</title>
    <description>The latest articles on DEV Community by joehom sum (@joehom_sum_e64272f38d9618).</description>
    <link>https://dev.to/joehom_sum_e64272f38d9618</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%2F3064739%2F1f39a757-99a3-416b-b359-46158bbe946e.jpg</url>
      <title>DEV Community: joehom sum</title>
      <link>https://dev.to/joehom_sum_e64272f38d9618</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joehom_sum_e64272f38d9618"/>
    <language>en</language>
    <item>
      <title>Why I Built tat: A Tiny API Test Tool for Real Integration Work and fits With AI Workflows</title>
      <dc:creator>joehom sum</dc:creator>
      <pubDate>Tue, 14 Apr 2026 14:18:12 +0000</pubDate>
      <link>https://dev.to/joehom_sum_e64272f38d9618/why-i-built-tat-a-tiny-api-test-tool-for-real-integration-work-and-fits-with-ai-workflows-4b99</link>
      <guid>https://dev.to/joehom_sum_e64272f38d9618/why-i-built-tat-a-tiny-api-test-tool-for-real-integration-work-and-fits-with-ai-workflows-4b99</guid>
      <description>&lt;p&gt;Recently, I was assigned to integrate with an API from another internal application. This was not a typical frontend-to-backend task where I could click around in a browser and verify the flow visually. It was server-to-server communication, mostly around client credentials, access tokens, request payload validation, and checking whether the API contract was still behaving the way I expected.&lt;/p&gt;

&lt;p&gt;That kind of work sounds simple on paper. In reality, it becomes repetitive very quickly.&lt;/p&gt;

&lt;p&gt;Every time the API changed, I had to test the flow again. Sometimes I needed to retrieve an access token using a user ID and password. Sometimes I needed to use client credentials. Then I had to call the actual endpoint, verify the input and output, and make sure nothing had silently broken before I started writing the integration code in my own application.&lt;/p&gt;

&lt;p&gt;Of course, Postman can do this. Many teams use it. I have used it too.&lt;/p&gt;

&lt;p&gt;But I built tat because Postman was not a good fit for the way I wanted to work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem Was Not "Can I Call the API?"
&lt;/h2&gt;

&lt;p&gt;The problem was workflow.&lt;/p&gt;

&lt;p&gt;When I am working on integration, I do not just want to send one request and look at one response. I want a repeatable way to prove that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication still works&lt;/li&gt;
&lt;li&gt;the request shape is correct&lt;/li&gt;
&lt;li&gt;the API returns the fields I need&lt;/li&gt;
&lt;li&gt;the response still matches the assumptions in my integration code&lt;/li&gt;
&lt;li&gt;I can rerun the same checks after every API change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a very different need from manual API exploration.&lt;/p&gt;

&lt;p&gt;Manual tools are useful when I am learning an API for the first time. But once the work becomes repeatable, I want something that behaves more like a test and less like a dashboard.&lt;/p&gt;

&lt;p&gt;That was the gap tat was built to fill.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing Piece: Testing the Flow, Not the Endpoint
&lt;/h2&gt;

&lt;p&gt;It took me a while to realise this, but the problem was not just tooling.&lt;/p&gt;

&lt;p&gt;It was the way I was thinking about API testing.&lt;/p&gt;

&lt;p&gt;Most tools push you toward testing endpoints individually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call auth endpoint&lt;/li&gt;
&lt;li&gt;call resource endpoint&lt;/li&gt;
&lt;li&gt;check response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that is not how integration actually works.&lt;/p&gt;

&lt;p&gt;In reality, I am always doing something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;get access token&lt;/li&gt;
&lt;li&gt;call API A&lt;/li&gt;
&lt;li&gt;extract an ID from the response&lt;/li&gt;
&lt;li&gt;call API B using that ID&lt;/li&gt;
&lt;li&gt;validate the final result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not endpoint testing.&lt;/p&gt;

&lt;p&gt;That is a &lt;strong&gt;flow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Flow-Based API Testing
&lt;/h2&gt;

&lt;p&gt;What I actually needed was a way to test APIs as a &lt;strong&gt;sequence of dependent steps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of writing isolated checks, I wanted to describe a real integration journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data from one response flows into the next request&lt;/li&gt;
&lt;li&gt;each step depends on the previous one&lt;/li&gt;
&lt;li&gt;the whole sequence represents one business scenario&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticate&lt;/li&gt;
&lt;li&gt;list workspaces&lt;/li&gt;
&lt;li&gt;find a specific workspace&lt;/li&gt;
&lt;li&gt;extract its ID&lt;/li&gt;
&lt;li&gt;use that ID to fetch related data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much closer to how systems behave in production.&lt;/p&gt;

&lt;p&gt;Once I started thinking this way, the design of tat became much clearer.&lt;/p&gt;

&lt;p&gt;tat is not just about sending requests.&lt;/p&gt;

&lt;p&gt;It is about &lt;strong&gt;testing flows&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Use Case Was Very Specific
&lt;/h2&gt;

&lt;p&gt;This project came from a practical situation, not from trying to build a general-purpose API platform.&lt;/p&gt;

&lt;p&gt;I needed a lightweight way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define HTTP requests in a file&lt;/li&gt;
&lt;li&gt;inject tokens and environment values&lt;/li&gt;
&lt;li&gt;run setup steps before tests&lt;/li&gt;
&lt;li&gt;assert that important fields exist or match expected values&lt;/li&gt;
&lt;li&gt;capture values from one response and reuse them in the next request&lt;/li&gt;
&lt;li&gt;chain multiple requests into a single flow&lt;/li&gt;
&lt;li&gt;run everything from the command line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters a lot.&lt;/p&gt;

&lt;p&gt;I wanted a tool that fits naturally into a CLI workflow. I spend a lot of time in the terminal. My code editor, scripts, Git workflow, and AI coding assistant already live there. If my API testing tool also works well in that environment, the whole loop becomes faster.&lt;/p&gt;

&lt;p&gt;That is why tat is JSON-driven and CLI-first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Postman Still Was Not the Right Fit
&lt;/h2&gt;

&lt;p&gt;To be fair, Postman is not limited to the GUI. It also has Newman and the Postman CLI, so this was never about saying, "Postman cannot run from the command line."&lt;/p&gt;

&lt;p&gt;It can.&lt;/p&gt;

&lt;p&gt;The issue for me was that it still was not the shape of workflow I wanted.&lt;/p&gt;

&lt;p&gt;First, I wanted my test definitions to live as plain files in the project, in a format that was simple and purpose-built for API checks. I did not want the source of truth to revolve around Postman collections, exported artifacts, or a workspace-centric model. I wanted something easy to diff, review, generate, and keep close to the integration code.&lt;/p&gt;

&lt;p&gt;Second, I wanted a flow that worked naturally with AI coding assistants. If I ask an agent to create a tat test for an endpoint, the mapping is very direct: generate a JSON file, add variables, assertions, captures, and run it. That is simpler than asking an agent to manage a richer collection format designed for a broader Postman ecosystem.&lt;/p&gt;

&lt;p&gt;Third, I wanted the execution loop to stay lightweight and local.&lt;/p&gt;

&lt;p&gt;Most importantly, I wanted the result of one request to feed directly into the next.&lt;/p&gt;

&lt;p&gt;That is where flow-based testing really matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workflow I Wanted
&lt;/h2&gt;

&lt;p&gt;The workflow in my head was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the API details from the other team&lt;/li&gt;
&lt;li&gt;Ask AI to generate a tat test file&lt;/li&gt;
&lt;li&gt;Run the test from the CLI&lt;/li&gt;
&lt;li&gt;Validate each step in the flow&lt;/li&gt;
&lt;li&gt;Adjust until the API behaviour is fully understood&lt;/li&gt;
&lt;li&gt;Use that verified flow to build the integration code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where a tiny tool is better than a large platform.&lt;/p&gt;

&lt;p&gt;I did not need dashboards or visual flows.&lt;/p&gt;

&lt;p&gt;I needed a &lt;strong&gt;repeatable execution flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;tat gives me that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What tat Actually Does
&lt;/h2&gt;

&lt;p&gt;tat is a tiny API testing CLI where tests are written in JSON.&lt;/p&gt;

&lt;p&gt;You define suites and tests, then run them from the terminal. A test can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;send HTTP requests&lt;/li&gt;
&lt;li&gt;interpolate variables like {{token}}&lt;/li&gt;
&lt;li&gt;load environment values from a file&lt;/li&gt;
&lt;li&gt;run a setup command before tests&lt;/li&gt;
&lt;li&gt;assert on status code, headers, body fields, and response time&lt;/li&gt;
&lt;li&gt;capture values from a response and reuse them in later requests&lt;/li&gt;
&lt;li&gt;chain multiple steps into a single flow&lt;/li&gt;
&lt;li&gt;produce console, JSON, or JUnit output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That design came directly from the problem I was facing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Without Installing
&lt;/h2&gt;

&lt;p&gt;If you just want to see a real flow run end-to-end before installing anything, I put together a sample project you can open directly in StackBlitz:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://stackblitz.com/github/nanotinydev/tat-sample-api?file=README.md" rel="noopener noreferrer"&gt;Try tat in StackBlitz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It boots a small sample API and runs a flow against it: authenticate, call an endpoint, capture a value from the response, and feed it into the next request. No local install, no setup — just click and watch the flow pass.&lt;/p&gt;

&lt;p&gt;That is the fastest way to feel the difference between "testing endpoints" and "testing flows."&lt;/p&gt;




&lt;h2&gt;
  
  
  Why CLI-Friendly Matters More Than It Sounds
&lt;/h2&gt;

&lt;p&gt;When a tool works naturally in the terminal, a few good things happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it is easier to automate&lt;/li&gt;
&lt;li&gt;it is easier to commit into a repo&lt;/li&gt;
&lt;li&gt;it is easier to review changes in Git&lt;/li&gt;
&lt;li&gt;it is easier to run in CI later&lt;/li&gt;
&lt;li&gt;it is easier for AI coding agents to generate and execute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For flow-based testing, this is especially important.&lt;/p&gt;

&lt;p&gt;Because flows are repeatable, they become part of your development loop, not just a one-time check.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Tool Is Small on Purpose
&lt;/h2&gt;

&lt;p&gt;I called it Tiny API Test for a reason.&lt;/p&gt;

&lt;p&gt;I was not trying to compete with large API tools.&lt;/p&gt;

&lt;p&gt;I was trying to remove friction from a narrow but common developer problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I need to verify this API flow properly before I integrate it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That problem appears often in internal systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Wanted From the Outcome
&lt;/h2&gt;

&lt;p&gt;The real output I wanted was not just "test passed."&lt;/p&gt;

&lt;p&gt;I wanted confidence.&lt;/p&gt;

&lt;p&gt;Confidence that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the authentication flow works&lt;/li&gt;
&lt;li&gt;the data flow between APIs is correct&lt;/li&gt;
&lt;li&gt;the assumptions in my integration code are valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I can run a flow and see it pass, I can move forward with integration work much more safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Most API tools help you test endpoints.&lt;/p&gt;

&lt;p&gt;tat helps you test flows.&lt;/p&gt;

&lt;p&gt;Because in real systems, nothing happens one endpoint at a time.&lt;/p&gt;

&lt;p&gt;Everything is connected.&lt;/p&gt;

&lt;p&gt;And if your tests do not reflect that, you are only testing part of the system.&lt;/p&gt;

&lt;p&gt;I built tat to close that gap.&lt;/p&gt;

&lt;p&gt;Verify the flow first, then build with confidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Try tat in StackBlitz (no install):&lt;/strong&gt; &lt;a href="https://stackblitz.com/github/nanotinydev/tat-sample-api?file=README.md" rel="noopener noreferrer"&gt;https://stackblitz.com/github/nanotinydev/tat-sample-api?file=README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npm i -g @nanotiny/tiny-api-test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🛠 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/nanotinydev/tat" rel="noopener noreferrer"&gt;https://github.com/nanotinydev/tat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://nanotinydev.github.io/tat/" rel="noopener noreferrer"&gt;https://nanotinydev.github.io/tat/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>testdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
