<?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: Liudas</title>
    <description>The latest articles on DEV Community by Liudas (@liudasjan).</description>
    <link>https://dev.to/liudasjan</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%2F3690294%2F310fa4b4-8338-49ee-9a08-c9cd4beff0e8.jpg</url>
      <title>DEV Community: Liudas</title>
      <link>https://dev.to/liudasjan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liudasjan"/>
    <language>en</language>
    <item>
      <title>Idempotency and Concurrency in APIs: API Testing Rule 7/10</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Fri, 02 Oct 2026 09:45:25 +0000</pubDate>
      <link>https://dev.to/liudasjan/idempotency-and-concurrency-in-apis-api-testing-rule-710-5f67</link>
      <guid>https://dev.to/liudasjan/idempotency-and-concurrency-in-apis-api-testing-rule-710-5f67</guid>
      <description>&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%2Fbuodj68m1y1uhd430rqs.jpeg" 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%2Fbuodj68m1y1uhd430rqs.jpeg" alt=" " width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A payment request that works once may still charge the customer twice.&lt;/p&gt;

&lt;p&gt;State-changing API operations must be tested beyond the first successful request. Creates, updates, transfers, and deletes can behave incorrectly when clients retry after a timeout, replay a completed request, or send identical operations concurrently.&lt;/p&gt;

&lt;p&gt;API testing should verify repeated requests after success, retries after lost responses, concurrent requests using the same idempotency key, different updates against the same resource, and updates based on stale data. The expected behavior may be deduplication, conflict detection, serialization, or returning the original result, depending on the API contract.&lt;/p&gt;

&lt;p&gt;For payment APIs, reusing the same idempotency key and request must not create a second transaction. The same protection should work when identical requests reach different service instances at the same time. Similarly, concurrent updates must not silently overwrite valid changes made by another client.&lt;/p&gt;

&lt;p&gt;Do not verify only the HTTP response. Inspect the final resource state, transactions, emitted events, audit records, external side effects, and asynchronous jobs. Two successful responses must not create duplicate payments, repeated orders, lost updates, or partially completed operations.&lt;/p&gt;

&lt;p&gt;Testing idempotency, retry safety, replay protection, and concurrency is essential for reliable APIs and distributed systems. Rentgen is an API discovery tool built to test what an endpoint actually does beyond one successful request.&lt;/p&gt;

&lt;p&gt;Read the complete API testing white paper: &lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automation Before Automation.&lt;/p&gt;

</description>
      <category>apitesting</category>
      <category>qa</category>
      <category>testing</category>
      <category>api</category>
    </item>
    <item>
      <title>API Testing Rule 6/10: APIs Must Fail Predictably</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 30 Sep 2026 12:40:07 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-610-apis-must-fail-predictably-16jj</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-610-apis-must-fail-predictably-16jj</guid>
      <description>&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%2Fp3fdzr0p0012mgqm4xc3.jpeg" 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%2Fp3fdzr0p0012mgqm4xc3.jpeg" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API failures are inevitable, but they should never be unpredictable. Invalid requests, missing resources, authentication failures, rate limits, dependency outages, and internal errors are different conditions. They should return different and meaningful HTTP status codes instead of collapsing into a generic 500 Internal Server Error.&lt;/p&gt;

&lt;p&gt;Predictable API error handling allows clients to understand what happened and decide whether to fix the request, authenticate, retry later, or stop. Similar failures should produce consistent status codes, stable error structures, and useful messages without exposing sensitive implementation details.&lt;/p&gt;

&lt;p&gt;For example, a missing resource should return 404 Not Found, a malformed request should return 400 Bad Request, and a rate-limited client should receive 429 Too Many Requests. A 500 Internal Server Error should indicate that the server failed while processing an otherwise valid request—not that the client submitted invalid data.&lt;/p&gt;

&lt;p&gt;API testing should cover validation errors, missing resources, authentication and authorization failures, unsupported operations, rate-limit violations, timeouts, dependency failures, and unexpected internal errors. Testers should verify that error responses are consistent, actionable, secure, and easy for API clients to interpret.&lt;/p&gt;

&lt;p&gt;Any reproducible request that consistently generates a 5xx response should be investigated as a potential defect. Reliable APIs are not defined only by successful responses. Predictable failure handling is a core part of API reliability, REST API design, and software quality.&lt;/p&gt;

&lt;p&gt;Rentgen is an API discovery tool built to explore failure paths beyond the expected request and expose assumptions before they become production incidents.&lt;/p&gt;

&lt;p&gt;Read the complete API testing white paper: &lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automation Before Automation.&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>api</category>
      <category>automation</category>
    </item>
    <item>
      <title>API Testing Rule 5/10: Every Collection Endpoint Must Have Bounded Results</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 29 Sep 2026 10:16:12 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-510-every-collection-endpoint-must-have-bounded-results-1k0a</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-510-every-collection-endpoint-must-have-bounded-results-1k0a</guid>
      <description>&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%2F7reiqgy2lr04di5zsxqi.jpeg" 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%2F7reiqgy2lr04di5zsxqi.jpeg" alt=" " width="799" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /customers&lt;/code&gt; may work perfectly with 100 records. But what happens when the dataset grows to one million?&lt;/p&gt;

&lt;p&gt;Pagination alone is not enough. Collection endpoints should enforce a maximum page size and predictable defaults. API testing should verify what happens when pagination parameters are omitted, extremely large limits are requested, complex filtering and sorting are combined with pagination, or large collections are retrieved repeatedly.&lt;/p&gt;

&lt;p&gt;Without server-enforced limits, a single valid request can consume excessive database, memory, network, and client resources. An endpoint that returns unbounded results is a scalability and reliability defect waiting to become a production incident.&lt;/p&gt;

&lt;p&gt;In the complete white paper, we explain how to test pagination, maximum page sizes, cursor-based navigation, filtering, sorting, performance under large datasets, and protection against excessive requests.&lt;/p&gt;

&lt;p&gt;Read the complete white paper: &lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automation Before Automation.&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>api</category>
      <category>rest</category>
    </item>
    <item>
      <title>API Testing Rule 4/10: Authentication Authorization</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Mon, 28 Sep 2026 06:53:05 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-410-authentication-authorization-4npl</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-410-authentication-authorization-4npl</guid>
      <description>&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%2Flvriv6uz2o295glnhalj.jpeg" 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%2Flvriv6uz2o295glnhalj.jpeg" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A valid token proves identity, not permission.&lt;/p&gt;

&lt;p&gt;Testing whether a user can access their own profile is not enough. Repeat the same request with another user’s resource ID and verify that access is denied.&lt;/p&gt;

&lt;p&gt;Check different roles, owned and unowned resources, cross-tenant access, read/update/delete operations, and predictable IDs.&lt;/p&gt;

&lt;p&gt;Authentication can work perfectly while authorization fails completely.&lt;/p&gt;

&lt;p&gt;Rentgen helps discover these issues by testing API behavior beyond the expected authenticated request.&lt;/p&gt;

&lt;p&gt;Read the complete white paper:&lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automation Before Automation.&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>qa</category>
      <category>rest</category>
    </item>
    <item>
      <title>I Made a Physical Notebook for Software Testers. Yes, in 2026.</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Fri, 18 Sep 2026 17:51:40 +0000</pubDate>
      <link>https://dev.to/liudasjan/i-made-a-physical-notebook-for-software-testers-yes-in-2026-3nkn</link>
      <guid>https://dev.to/liudasjan/i-made-a-physical-notebook-for-software-testers-yes-in-2026-3nkn</guid>
      <description>&lt;p&gt;We have Jira. Notion. Confluence. Test management systems. AI assistants. Automated test suites running in CI/CD. So naturally, I made a paper notebook.&lt;/p&gt;

&lt;p&gt;Not because I suddenly became nostalgic for the 1990s, and definitely not because I think QA teams should start documenting test cases with a pen. The reason is much simpler: after many years in software testing, I still find that some of my best testing happens before I open another tool.&lt;/p&gt;

&lt;p&gt;When I start testing something new, I usually need to understand the problem first. What changed? What can go wrong? What assumptions are we making? What don't I understand yet? What did I just observe that looks strange?&lt;/p&gt;

&lt;p&gt;And somewhere between Slack, Jira, browser tabs, API clients, DevTools, and documentation, those thoughts disappear surprisingly quickly. So I created the QA Notebook.&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%2Fknza5exlvyz6l4a8s2o3.jpg" 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%2Fknza5exlvyz6l4a8s2o3.jpg" alt=" " width="800" height="987"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a test case repository. That was probably the most important rule when I started designing it. I didn't want another place where a tester writes:&lt;/p&gt;

&lt;p&gt;Step 1: Click Login&lt;br&gt;
Step 2: Enter username&lt;br&gt;
Step 3: Enter password&lt;br&gt;
Expected result: User is logged in&lt;/p&gt;

&lt;p&gt;We already have enough tools for storing things like that. I wanted something for the part of testing that happens before everything becomes structured and repeatable. Each testing session starts with a few simple questions: What am I testing? What changed? What can go wrong? What are the known risks? What did I learn? What is still uncertain? And finally: Do I have enough confidence to move forward?&lt;/p&gt;

&lt;p&gt;Yes. No. Or with known risks.&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%2Fyrfgixf2tr534noie5jz.jpg" 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%2Fyrfgixf2tr534noie5jz.jpg" alt=" " width="800" height="981"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page next to it is intentionally mostly empty. Because testing doesn't always fit into predefined fields. Sometimes you need to draw a flow. Sometimes you write down three API responses. Sometimes you discover a weird state transition and draw arrows everywhere. Sometimes you have a hypothesis that turns out to be completely wrong ten minutes later. That's fine. The notebook should help the investigation, not force the investigation to fit the notebook. Good testing starts with questions, not test cases&lt;/p&gt;

&lt;p&gt;One thing I've tried to put throughout the notebook is small reminders that interrupt the usual testing routine.&lt;/p&gt;

&lt;p&gt;For example: A 200 OK response can be a bug. &lt;br&gt;
Test what developers didn't think about.&lt;br&gt;
Every assumption is a potential test case.&lt;br&gt;
If the UI prevents something, check whether the backend prevents it too. A passing test only tells you what happened under one set of conditions.&lt;/p&gt;

&lt;p&gt;These aren't supposed to be profound quotes hanging on an office wall. They're there because sometimes one question is enough to send your testing in a completely different direction.&lt;/p&gt;

&lt;p&gt;You might be testing a perfectly normal form, see a reminder about boundaries and suddenly try the value just above the documented maximum.&lt;/p&gt;

&lt;p&gt;You might be testing permissions and notice: A disabled button is not an authorization control. So instead of stopping at the UI, you inspect the API. That is exactly what I wanted this notebook to do: occasionally give the tester one more idea. Bugs need investigation, not just tickets. I also added dedicated bug investigation pages.&lt;/p&gt;

&lt;p&gt;When something strange happens, my first instinct isn't necessarily to immediately create a Jira ticket. First I want to understand what I actually found.&lt;/p&gt;

&lt;p&gt;What happened? What did I expect? Can I reproduce it? What changed? What evidence do I have? What am I assuming? What is the smallest reproducible case? That last question is particularly useful.&lt;/p&gt;

&lt;p&gt;A giant broken workflow involving twelve steps, three users and two services isn't very helpful if you can reduce the same problem to one request. So the investigation pages have space to work through that before turning the finding into a polished bug report.&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%2Fo2ucgur8t75j0pxlbdo7.jpg" 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%2Fo2ucgur8t75j0pxlbdo7.jpg" alt=" " width="800" height="986"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also wanted the notebook to generate testing ideas. There are reference sections scattered through it rather than putting 150 pages of blank templates together and calling it a QA notebook.&lt;/p&gt;

&lt;p&gt;There's SFDIPOT for when you think you've run out of things to test: Structure, Function, Data, Interfaces, Platform, Operations and Time.&lt;/p&gt;

&lt;p&gt;There are reminders to look beyond functional behavior into performance, security, reliability, usability, accessibility, compatibility, scalability, recoverability, availability, localization and observability.&lt;/p&gt;

&lt;p&gt;There are sections specifically about API testing: authentication, authorization, input validation, headers, CORS, status codes, rate limits, oversized requests and other things that are very easy to forget when the happy path works perfectly.&lt;/p&gt;

&lt;p&gt;Toward the end I added practical reminders about decision table testing and state transition testing, because interesting bugs often don't live in a single condition or state. They live in combinations and transitions.&lt;/p&gt;

&lt;p&gt;The notebook ended up being 162 pages, but the goal was never to create a QA textbook. It's something that should sit next to the laptop while you're actually testing.&lt;/p&gt;

&lt;p&gt;Why paper? This is probably the strange part.&lt;/p&gt;

&lt;p&gt;I work in IT. I build automation. I use AI. I write Playwright tests. I work with APIs and CI/CD. And I still like writing things down.&lt;/p&gt;

&lt;p&gt;There is something different about having a notebook open next to the keyboard while investigating a system. I don't have to decide where the note belongs. I don't need to create a ticket. I don't need to format anything. I don't need another browser tab. I can just write: "Why did this return 200?" Circle it. Test something else. Come back to it twenty minutes later. Maybe it becomes a bug. Maybe it becomes a test. Maybe it becomes nothing because my assumption was wrong. That's testing.&lt;/p&gt;

&lt;p&gt;The notebook doesn't need to preserve every thought forever. It needs to help me think while the investigation is happening. Automation Before Automation. There's a line in the notebook that probably summarizes the whole idea better than anything else: Think first. Test second. Automate when it makes sense. I'm obviously not against automation. Quite the opposite.&lt;/p&gt;

&lt;p&gt;But automation becomes much more useful after we understand what behavior matters, what risks we're protecting against and what conditions are worth checking repeatedly.&lt;/p&gt;

&lt;p&gt;Before asking "How do we automate this?", somebody still has to ask: "What should we test?" That's the space I wanted the QA Notebook to live in. Not instead of Jira. Not instead of Playwright. Not instead of AI. Just next to the keyboard. With a pen. And preferably a tester who keeps asking one more question.&lt;/p&gt;

&lt;p&gt;QA Notebook — Think. Test. Question. Write it down.&lt;/p&gt;

&lt;p&gt;by Liudas Jankauskas&lt;br&gt;
&lt;a href="https://www.amazon.com/QA-Notebook-Liudas-Jankauskas/dp/B0HH6MNG4Z" rel="noopener noreferrer"&gt;https://www.amazon.com/QA-Notebook-Liudas-Jankauskas/dp/B0HH6MNG4Z&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qanotebook</category>
      <category>qa</category>
      <category>testing</category>
      <category>test</category>
    </item>
    <item>
      <title>API Testing Rule #3: Response Codes Are Part of the Functionality</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:12:27 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-3-response-codes-are-part-of-the-functionality-2hk7</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-3-response-codes-are-part-of-the-functionality-2hk7</guid>
      <description>&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%2Fx5l4qozpgf6vnboto1u6.jpeg" 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%2Fx5l4qozpgf6vnboto1u6.jpeg" alt=" " width="799" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An API does not communicate only through its response body. The HTTP status code is also part of its contract.&lt;/p&gt;

&lt;p&gt;A successful request should not return the same status code as an authentication failure, invalid input, a missing resource, or an unsupported HTTP method. Clients, monitoring tools, and other services rely on these distinctions.&lt;/p&gt;

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

&lt;p&gt;201 Created for a successfully created resource&lt;br&gt;
400 Bad Request for invalid input&lt;br&gt;
401 Unauthorized for missing or invalid authentication&lt;br&gt;
403 Forbidden for insufficient permissions&lt;br&gt;
404 Not Found for an unavailable resource&lt;br&gt;
405 Method Not Allowed for an unsupported method&lt;br&gt;
429 Too Many Requests when rate limits are exceeded&lt;br&gt;
500 Internal Server Error only for unexpected server failures&lt;br&gt;
Incorrect response codes can hide bugs, confuse API consumers, and expose information about protected resources.&lt;/p&gt;

&lt;p&gt;Response code testing should cover both successful and unsuccessful scenarios. An API that returns the wrong status code is not behaving correctly, even if the response body looks reasonable.&lt;/p&gt;

&lt;p&gt;Rentgen helps explore these cases automatically from a working cURL request, including invalid input, authentication failures, unsupported methods, and unexpected responses.&lt;/p&gt;

&lt;p&gt;HTTP status codes are not decoration. They are functionality.&lt;/p&gt;

&lt;p&gt;Full white paper:&lt;br&gt;
&lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>apitesting</category>
      <category>qa</category>
      <category>http</category>
    </item>
    <item>
      <title>API Testing Rule #2: Every Endpoint Must Be Tested With Invalid Input</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 15 Sep 2026 11:41:41 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-2-every-endpoint-must-be-tested-with-invalid-input-4hmo</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-2-every-endpoint-must-be-tested-with-invalid-input-4hmo</guid>
      <description>&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%2Fkbq1p54naasmgwrunz5a.jpeg" 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%2Fkbq1p54naasmgwrunz5a.jpeg" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A successful request proves only that the happy path works. It does not tell you how the API behaves when the input is incomplete, malformed, unexpected, or too large.&lt;/p&gt;

&lt;p&gt;Most real defects appear when application assumptions are violated. That is why every endpoint should be tested not only with valid data, but also with invalid input.&lt;/p&gt;

&lt;p&gt;For a user creation endpoint, a valid request might look like this:&lt;br&gt;
&lt;code&gt;{&lt;br&gt;
  "name": "John Smith",&lt;br&gt;
  "email": "john@example.com",&lt;br&gt;
  "phone": "+971501234567"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That request confirms that valid data is accepted. However, it does not answer more important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when a required field is missing?&lt;/li&gt;
&lt;li&gt;What happens when email contains an invalid value?&lt;/li&gt;
&lt;li&gt;What happens when a string is replaced with a number?&lt;/li&gt;
&lt;li&gt;Are null values accepted?&lt;/li&gt;
&lt;li&gt;Are empty strings rejected?&lt;/li&gt;
&lt;li&gt;Are unexpected properties ignored or stored?&lt;/li&gt;
&lt;li&gt;What happens when the payload is extremely large?&lt;/li&gt;
&lt;li&gt;Does malformed JSON result in a controlled error?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common API defect is returning HTTP 500 Internal Server Error when the client sends invalid input. The server should reject malformed data with a clear client error, not fail internally.&lt;/p&gt;

&lt;p&gt;Oversized values are another important example. An API may accept a user name containing several megabytes of text and return a successful response. The problem might appear later in a report, mobile application, search index, integration, or analytics pipeline.&lt;/p&gt;

&lt;p&gt;This makes invalid input testing more than a validation check. It is also a reliability, security, and operational stability check.&lt;/p&gt;

&lt;p&gt;At minimum, every endpoint should be tested with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing required fields&lt;/li&gt;
&lt;li&gt;Invalid formats&lt;/li&gt;
&lt;li&gt;Incorrect data types&lt;/li&gt;
&lt;li&gt;null values&lt;/li&gt;
&lt;li&gt;Empty values&lt;/li&gt;
&lt;li&gt;Boundary values&lt;/li&gt;
&lt;li&gt;Oversized strings&lt;/li&gt;
&lt;li&gt;Oversized payloads&lt;/li&gt;
&lt;li&gt;Malformed JSON&lt;/li&gt;
&lt;li&gt;Unexpected properties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The expected result should normally be a controlled 4xx response with a meaningful validation message.&lt;/p&gt;

&lt;p&gt;Invalid input should never cause application crashes, database corruption, service instability, unbounded memory consumption, or unexpected HTTP 500 responses.&lt;/p&gt;

&lt;p&gt;With Rentgen, this type of testing does not require a large test suite to be written manually. Start with a working cURL request, describe what the fields represent, and let the tool explore variations around the expected input.&lt;/p&gt;

&lt;p&gt;The goal is not only to prove that valid requests work. The goal is to discover what happens when the assumptions behind those requests are wrong.&lt;/p&gt;

&lt;p&gt;That is where many serious API defects begin.&lt;/p&gt;

&lt;p&gt;This is the second rule from The Power of Ten – Rules for Testing HTTP APIs:&lt;br&gt;
&lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>apitesting</category>
      <category>qa</category>
      <category>rest</category>
    </item>
    <item>
      <title>API Testing Rule #1: Treat Every Endpoint as an Attack Surface</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Sun, 06 Sep 2026 08:06:03 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-testing-rule-1-treat-every-endpoint-as-an-attack-surface-3d3d</link>
      <guid>https://dev.to/liudasjan/api-testing-rule-1-treat-every-endpoint-as-an-attack-surface-3d3d</guid>
      <description>&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%2Fgetpvnb64j3fq3skaq3c.jpg" 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%2Fgetpvnb64j3fq3skaq3c.jpg" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Internal” describes an endpoint’s current audience. It is not a security boundary.&lt;/p&gt;

&lt;p&gt;Internal APIs often become dependencies for mobile apps, other teams, partners, automation scripts, and future services. If a request can reach an endpoint, that endpoint must be tested independently.&lt;/p&gt;

&lt;p&gt;At minimum, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication requirements&lt;/li&gt;
&lt;li&gt;Authorization and ownership boundaries&lt;/li&gt;
&lt;li&gt;Invalid input handling&lt;/li&gt;
&lt;li&gt;Supported HTTP methods&lt;/li&gt;
&lt;li&gt;Response code correctness&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Sensitive information disclosure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CORS should not be treated as protection for the API. It restricts certain browser requests but does not stop scripts, custom clients, or server-to-server communication.&lt;/p&gt;

&lt;p&gt;Rentgen is not another general-purpose API client. It is an API discovery tool that starts with one working cURL request and systematically explores behavior beyond the expected path.&lt;/p&gt;

&lt;p&gt;This is the first rule from The Power of Ten – Rules for Testing HTTP APIs: &lt;a href="https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html" rel="noopener noreferrer"&gt;https://qaontime.com/research/the-power-of-ten-rules-for-testing-http-apis.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>qa</category>
      <category>api</category>
    </item>
    <item>
      <title>StackHawk and Rentgen: Same API World, Different Layers</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 27 Aug 2026 04:22:50 +0000</pubDate>
      <link>https://dev.to/liudasjan/stackhawk-and-rentgen-same-api-world-different-layers-49h3</link>
      <guid>https://dev.to/liudasjan/stackhawk-and-rentgen-same-api-world-different-layers-49h3</guid>
      <description>&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%2Fzlgly5fym2g5zviv9rzw.jpeg" 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%2Fzlgly5fym2g5zviv9rzw.jpeg" alt=" " width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;StackHawk and Rentgen can look similar because both test APIs, send imperfect input, and analyze backend behavior. There is some real overlap, especially when malformed requests expose weak validation, unexpected server errors, or incorrect authentication behavior. However, the tools begin at different moments and answer different questions.&lt;/p&gt;

&lt;p&gt;Rentgen starts with one working cURL request and turns it into structured API hygiene checks. It explores missing fields, wrong data types, boundary values, malformed payloads, invalid authentication, unsupported methods, and inconsistent responses. The goal is to give developers and QA engineers a fast reality check before a test suite, CI pipeline, or formal security process exists.&lt;/p&gt;

&lt;p&gt;StackHawk approaches the same API from an application security perspective. It provides structured DAST across running applications and APIs, integrates with development pipelines, and helps teams identify, prioritize, and manage security findings. This becomes especially valuable when security testing needs to be systematic and repeatable across the wider application.&lt;/p&gt;

&lt;p&gt;These tools do not need to compete. Rentgen can expose fragile API behavior while an endpoint is still being built, helping remove basic validation and error-handling problems early. StackHawk can then focus on broader and deeper security weaknesses as part of a mature DevSecOps workflow.&lt;/p&gt;

&lt;p&gt;This is Automation Before Automation.&lt;/p&gt;

&lt;p&gt;The full comparison is available on Rentgen API Stories: &lt;a href="https://rentgen.io/api-stories/StackHawk-and-Rentgen-API-security-scanning-and-API-hygiene-before-automation.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/StackHawk-and-Rentgen-API-security-scanning-and-API-hygiene-before-automation.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>security</category>
      <category>testing</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>ffuf vs Rentgen: Same HTTP Space, Completely Different Job</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 26 Aug 2026 07:20:05 +0000</pubDate>
      <link>https://dev.to/liudasjan/ffuf-vs-rentgen-same-http-space-completely-different-job-40jh</link>
      <guid>https://dev.to/liudasjan/ffuf-vs-rentgen-same-http-space-completely-different-job-40jh</guid>
      <description>&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%2Fgcasfd7sja391kuadvnk.jpeg" 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%2Fgcasfd7sja391kuadvnk.jpeg" alt=" " width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve seen ffuf and Rentgen mentioned in the same breath a few times, which kind of makes sense on the surface: both deal with HTTP, both involve changing inputs, both can produce weird responses.&lt;/p&gt;

&lt;p&gt;But they’re not really for the same job.&lt;/p&gt;

&lt;p&gt;ffuf is mainly a discovery tool. You use it when you want to find things: paths, subdomains or vhosts, parameters, files, endpoints, response differences that might point to something interesting. It’s great when the question is basically, “what’s here?”&lt;/p&gt;

&lt;p&gt;Rentgen starts from a different place. You already have a working API request. You paste in the cURL, and then the tool starts checking how that endpoint behaves when the input stops being clean or expected.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing fields&lt;/li&gt;
&lt;li&gt;wrong data types&lt;/li&gt;
&lt;li&gt;broken or invalid auth&lt;/li&gt;
&lt;li&gt;malformed JSON&lt;/li&gt;
&lt;li&gt;oversized values&lt;/li&gt;
&lt;li&gt;unsupported methods&lt;/li&gt;
&lt;li&gt;other not-quite-valid input&lt;/li&gt;
&lt;li&gt;So even though both tools touch HTTP and mutate requests in some way, the goal is different.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With ffuf, you’re exploring the surface area.&lt;/p&gt;

&lt;p&gt;With Rentgen, you’re poking at the behavior of something you already know exists.&lt;/p&gt;

&lt;p&gt;That’s why comparing them directly never felt quite right to me. One helps you figure out where to look. The other helps you understand how a known API handles bad input.&lt;/p&gt;

&lt;p&gt;Same general space, different phase of the work.&lt;/p&gt;

&lt;p&gt;Full story here: &lt;a href="https://rentgen.io/api-stories/ffuf-and-Rentgen-web-fuzzing-and-API-hygiene-are-not-same-planet.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/ffuf-and-Rentgen-web-fuzzing-and-API-hygiene-are-not-same-planet.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>api</category>
      <category>rest</category>
    </item>
    <item>
      <title>Tusk Drift vs Rentgen: Traffic Replay vs Early API Discovery</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 04 Aug 2026 06:00:59 +0000</pubDate>
      <link>https://dev.to/liudasjan/tusk-drift-vs-rentgen-traffic-replay-vs-early-api-discovery-iol</link>
      <guid>https://dev.to/liudasjan/tusk-drift-vs-rentgen-traffic-replay-vs-early-api-discovery-iol</guid>
      <description>&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%2F6j7gi51nh0zkbwjxhqug.jpeg" 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%2F6j7gi51nh0zkbwjxhqug.jpeg" alt=" " width="799" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API quality is improving rapidly, but different tools solve different problems.&lt;/p&gt;

&lt;p&gt;Recently I looked at Tusk Drift, and I think it introduces an interesting idea: recording real production traffic and replaying it as regression tests. At first glance it may seem similar to Rentgen, but after looking closer, the two tools actually sit at different stages of the API lifecycle.&lt;/p&gt;

&lt;p&gt;They complement each other rather than compete.&lt;br&gt;
Tusk Drift starts with production traffic&lt;br&gt;
Tusk Drift records real API requests generated by users or integrations and later replays them as regression tests.&lt;br&gt;
The goal is straightforward: Did today’s code change break behavior that already existed yesterday?&lt;br&gt;
This is extremely valuable because production traffic often exercises scenarios nobody thought to automate manually. Instead of maintaining hundreds of regression tests yourself, you can reuse what users are already doing.&lt;br&gt;
For mature systems, that’s a powerful safety net.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rentgen starts with a single request
&lt;/h2&gt;

&lt;p&gt;Rentgen works much earlier.&lt;br&gt;
It doesn’t need production traffic.&lt;br&gt;
It doesn’t need historical traces.&lt;br&gt;
It doesn’t even need an existing test suite.&lt;br&gt;
It starts from one working cURL request (or a request imported from Postman, Swagger, logs, or another client).&lt;br&gt;
From there Rentgen automatically generates hundreds of API checks by mutating that request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing fields&lt;/li&gt;
&lt;li&gt;invalid data types&lt;/li&gt;
&lt;li&gt;boundary values&lt;/li&gt;
&lt;li&gt;oversized payloads&lt;/li&gt;
&lt;li&gt;malformed JSON&lt;/li&gt;
&lt;li&gt;unsupported HTTP methods&lt;/li&gt;
&lt;li&gt;invalid enums&lt;/li&gt;
&lt;li&gt;whitespace problems&lt;/li&gt;
&lt;li&gt;authentication scenarios&lt;/li&gt;
&lt;li&gt;protocol validation
The question Rentgen asks is completely different: How does this endpoint behave when the input stops being clean?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Different questions
&lt;/h2&gt;

&lt;p&gt;Tusk Drift asks: Has behavior changed?&lt;br&gt;
Rentgen asks: Is behavior robust?&lt;br&gt;
Those are not the same thing.&lt;br&gt;
An API can replay production traffic perfectly while still crashing on unexpected input.&lt;br&gt;
Likewise, an API may survive every malformed request Rentgen generates but still introduce regressions after future code changes.&lt;br&gt;
Both are important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different timing
&lt;/h2&gt;

&lt;p&gt;This is probably the biggest distinction.&lt;br&gt;
Tusk Drift&lt;br&gt;
Works best when:&lt;br&gt;
the service already has users&lt;br&gt;
production traffic exists&lt;br&gt;
behavior is worth protecting&lt;br&gt;
Rentgen&lt;br&gt;
Works even if:&lt;br&gt;
the endpoint was created five minutes ago&lt;br&gt;
there are no users&lt;br&gt;
there is no production traffic&lt;br&gt;
there is no regression suite&lt;br&gt;
One working request is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;p&gt;These tools actually fit together quite naturally.&lt;br&gt;
Build a new endpoint.&lt;br&gt;
Run Rentgen locally from a single cURL request.&lt;br&gt;
Fix validation gaps, unexpected 500 errors, inconsistent responses, and weak input handling.&lt;br&gt;
Deploy.&lt;br&gt;
Let users generate real traffic.&lt;br&gt;
Use Tusk Drift to replay that traffic as regression tests.&lt;br&gt;
One discovers problems before release.&lt;br&gt;
The other makes sure they never silently return.&lt;/p&gt;

&lt;h2&gt;
  
  
  No replacement story
&lt;/h2&gt;

&lt;p&gt;I don’t see these tools replacing each other.&lt;br&gt;
Tusk Drift is not trying to be an API mutation engine.&lt;br&gt;
Rentgen is not trying to record and replay production traffic.&lt;br&gt;
They’re solving different problems at different moments in the software lifecycle.&lt;br&gt;
That’s why comparing them is interesting. Not because one wins. Because together they cover more of the API quality journey.&lt;/p&gt;

&lt;p&gt;The complete comparison, including diagrams and examples, is available here: &lt;a href="https://rentgen.io/api-stories/Tusk-Drift-and-Rentgen-replaying-real-traffic-vs-breaking-one-request-early.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/Tusk-Drift-and-Rentgen-replaying-real-traffic-vs-breaking-one-request-early.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>tuskdrift</category>
      <category>apitesting</category>
      <category>api</category>
    </item>
    <item>
      <title>Apigee and Rentgen: API Management Is Not API Testing</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 29 Jul 2026 17:41:25 +0000</pubDate>
      <link>https://dev.to/liudasjan/apigee-and-rentgen-api-management-is-not-api-testing-3p54</link>
      <guid>https://dev.to/liudasjan/apigee-and-rentgen-api-management-is-not-api-testing-3p54</guid>
      <description>&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%2Fe6x6ybzlo62tcd2r2od3.jpg" 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%2Fe6x6ybzlo62tcd2r2od3.jpg" alt=" " width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work with APIs, you've probably heard of Apigee. You may also have come across Rentgen. Since both tools operate in the API space, it's easy to assume they solve similar problems. They don't.&lt;/p&gt;

&lt;p&gt;They work at different layers of the API lifecycle.&lt;/p&gt;

&lt;p&gt;Apigee manages APIs. Apigee is an API management platform. It helps organisations expose, secure, monitor and govern APIs at scale.&lt;/p&gt;

&lt;p&gt;Typical responsibilities include:&lt;/p&gt;

&lt;p&gt;API Gateway&lt;br&gt;
Authentication &amp;amp; Authorization&lt;br&gt;
Rate limiting&lt;br&gt;
Traffic management&lt;br&gt;
Policies&lt;br&gt;
Analytics&lt;br&gt;
Developer portal&lt;br&gt;
API product management&lt;/p&gt;

&lt;p&gt;When your APIs become products consumed by customers, partners or internal teams, this layer becomes essential.&lt;/p&gt;

&lt;p&gt;Rentgen tests API behaviour. Rentgen starts with a single working cURL request. Instead of managing traffic, it asks a different question: How does this endpoint behave when the input is no longer perfect?&lt;/p&gt;

&lt;p&gt;It automatically generates request variations such as:&lt;/p&gt;

&lt;p&gt;Missing required fields&lt;br&gt;
Invalid data types&lt;br&gt;
Boundary values&lt;br&gt;
Empty strings&lt;br&gt;
Malformed JSON&lt;br&gt;
Unsupported HTTP methods&lt;br&gt;
Invalid headers&lt;/p&gt;

&lt;p&gt;The goal isn't automation. The goal is understanding endpoint behaviour before automation begins. Different layers.&lt;/p&gt;

&lt;p&gt;One of the biggest misconceptions is believing that an API gateway somehow guarantees API quality. It doesn't.&lt;/p&gt;

&lt;p&gt;A gateway can enforce authentication, quotas and routing, while the backend may still:&lt;/p&gt;

&lt;p&gt;return unexpected 500 errors&lt;br&gt;
accept invalid values&lt;br&gt;
expose inconsistent validation&lt;br&gt;
produce confusing error responses&lt;/p&gt;

&lt;p&gt;These are implementation problems, not infrastructure problems. That's where endpoint-level testing becomes valuable.&lt;/p&gt;

&lt;p&gt;Rather than choosing one tool over the other, they fit naturally into different stages of API development.&lt;/p&gt;

&lt;p&gt;Build the endpoint.&lt;br&gt;
Test its behaviour with Rentgen.&lt;br&gt;
Fix validation and reliability issues.&lt;br&gt;
Publish and manage the API with Apigee.&lt;/p&gt;

&lt;p&gt;One focuses on implementation quality. The other focuses on operating APIs at scale. Both are important.&lt;/p&gt;

&lt;p&gt;If you'd like the full comparison with more examples and discussion, you can read the original article here: &lt;a href="https://rentgen.io/api-stories/Apigee-and-Rentgen-managing-API-traffic-is-not-same-as-testing-API-behavior.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/Apigee-and-Rentgen-managing-API-traffic-is-not-same-as-testing-API-behavior.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>rentgen</category>
      <category>aba</category>
      <category>qa</category>
    </item>
  </channel>
</rss>
