<?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>API! API! API! 👏</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Mon, 19 Oct 2026 07:35:50 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-api-api-1a9m</link>
      <guid>https://dev.to/liudasjan/api-api-api-1a9m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi87prnqdx73yxsjmbzf0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi87prnqdx73yxsjmbzf0.gif" alt=" " width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been working in software long enough, you probably understand Steve Ballmer’s enthusiasm. 😄&lt;/p&gt;

&lt;p&gt;APIs are everywhere.&lt;/p&gt;

&lt;p&gt;Mobile applications communicate with backend services through APIs. Websites retrieve and modify data through APIs. Enterprise systems exchange information through APIs. Cloud platforms expose almost everything through APIs, and even physical devices increasingly provide APIs for integration and automation.&lt;/p&gt;

&lt;p&gt;The graphical interface may be what the user sees, but in many systems, the real work happens underneath it.&lt;/p&gt;

&lt;p&gt;I started testing APIs around 2008. Almost two decades later, the technologies have changed enormously, but many of the problems haven’t.&lt;/p&gt;

&lt;p&gt;Unexpected inputs. Incorrect access decisions. Broken HTTP semantics. Server errors. And, of course, the legendary 200 OK when absolutely nothing is OK.&lt;/p&gt;

&lt;p&gt;In 2017, Dylan Beattie even turned these frustrations into a brilliant parody of Bon Jovi’s You Give Love a Bad Name, called You Give REST a Bad Name.&lt;/p&gt;

&lt;p&gt;Some API problems are apparently timeless. 😄&lt;/p&gt;

&lt;p&gt;And that’s exactly why we build &lt;a href="https://rentgen.io" rel="noopener noreferrer"&gt;https://rentgen.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API! API! API! 👏&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mwnl8at0ovta2v9y0aj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mwnl8at0ovta2v9y0aj.gif" alt=" " width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>qa</category>
      <category>testing</category>
      <category>restapi</category>
    </item>
    <item>
      <title>API Regression Testing: Turn Every Production Bug Into a Reusable API Test</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 08 Oct 2026 08:32:47 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-regression-testing-turn-every-production-bug-into-a-reusable-api-test-2m2p</link>
      <guid>https://dev.to/liudasjan/api-regression-testing-turn-every-production-bug-into-a-reusable-api-test-2m2p</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%2F3zhecow68lmyu4vg2ylf.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%2F3zhecow68lmyu4vg2ylf.jpeg" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A production API defect should surprise you only once.&lt;/p&gt;

&lt;p&gt;Every production bug reveals an assumption that was not tested. After fixing it, reproduce the original request, verify the correction, and turn the scenario into a reusable API regression test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is especially important for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API authorization failures&lt;/li&gt;
&lt;li&gt;Input validation bugs&lt;/li&gt;
&lt;li&gt;HTTP protocol errors&lt;/li&gt;
&lt;li&gt;API performance issues&lt;/li&gt;
&lt;li&gt;Pagination problems&lt;/li&gt;
&lt;li&gt;Security vulnerabilities&lt;/li&gt;
&lt;li&gt;Data integrity failures&lt;/li&gt;
&lt;li&gt;Third-party integration defects
A code fix solves the problem today. A reusable API test helps prevent the same defect from returning in a future release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal of API testing is not only to find and fix bugs. It is also to preserve what the team learned and continuously expand the system’s regression coverage.&lt;/p&gt;

&lt;p&gt;This is the tenth rule in The Power of Ten Rules for Testing HTTP APIs.&lt;/p&gt;

&lt;p&gt;Read the complete article: &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>api</category>
      <category>testingapi</category>
      <category>restapi</category>
    </item>
    <item>
      <title>Your API Can Create the Customer—and Still Be Broken</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:03:53 +0000</pubDate>
      <link>https://dev.to/liudasjan/your-api-can-create-the-customer-and-still-be-broken-1ocj</link>
      <guid>https://dev.to/liudasjan/your-api-can-create-the-customer-and-still-be-broken-1ocj</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%2Fb2ap4bt0ge64wtb9av4t.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%2Fb2ap4bt0ge64wtb9av4t.jpeg" alt=" " width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A successful POST /customers response does not prove that your API is correct.&lt;/p&gt;

&lt;p&gt;It only proves that one business operation worked under one specific set of conditions.&lt;/p&gt;

&lt;p&gt;Modern APIs are not just business functions. They are also implementations of a communication protocol. Clients depend on more than the response body:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP methods&lt;/li&gt;
&lt;li&gt;status codes&lt;/li&gt;
&lt;li&gt;request and response headers&lt;/li&gt;
&lt;li&gt;content types&lt;/li&gt;
&lt;li&gt;authentication behavior&lt;/li&gt;
&lt;li&gt;caching directives&lt;/li&gt;
&lt;li&gt;content negotiation&lt;/li&gt;
&lt;li&gt;idempotency&lt;/li&gt;
&lt;li&gt;consistent error handling
When these rules are violated, the API may appear healthy during a happy-path test while still breaking clients, integrations, SDKs, proxies, gateways, or production workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A simple example
&lt;/h3&gt;

&lt;p&gt;Imagine a customer API that correctly supports:&lt;br&gt;
&lt;code&gt;POST /customers&lt;br&gt;
GET /customers/{id}&lt;br&gt;
PUT /customers/{id}&lt;br&gt;
DELETE /customers/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The main business scenarios work. Customers can be created, retrieved, updated, and deleted.&lt;/p&gt;

&lt;p&gt;But what happens when you test the protocol around those operations?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does PATCH return an appropriate response if it is unsupported?&lt;/li&gt;
&lt;li&gt;Does OPTIONS describe the endpoint correctly?&lt;/li&gt;
&lt;li&gt;Does HEAD behave consistently with GET?&lt;/li&gt;
&lt;li&gt;Is an invalid Content-Type rejected?&lt;/li&gt;
&lt;li&gt;Is an unsupported Accept header handled correctly?&lt;/li&gt;
&lt;li&gt;Are authentication failures represented consistently?&lt;/li&gt;
&lt;li&gt;Are cache directives present where they should be?&lt;/li&gt;
&lt;li&gt;Does repeating an idempotent request produce a predictable result?&lt;/li&gt;
&lt;li&gt;Do all endpoints return errors in a consistent format?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not cosmetic details. They are part of the API contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business logic is only half the API
&lt;/h3&gt;

&lt;p&gt;A common testing pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send a valid request.&lt;/li&gt;
&lt;li&gt;Check for 200 or 201.&lt;/li&gt;
&lt;li&gt;Verify a few fields in the response.&lt;/li&gt;
&lt;li&gt;Move on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That test may be useful, but it covers only one path through the system.&lt;/p&gt;

&lt;p&gt;An API consumer also relies on predictable protocol behavior. For example, a client may use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content-Type to describe the request body;&lt;/li&gt;
&lt;li&gt;Accept to negotiate the response format;&lt;/li&gt;
&lt;li&gt;status codes to decide whether to retry;&lt;/li&gt;
&lt;li&gt;headers to control caching;&lt;/li&gt;
&lt;li&gt;authentication responses to refresh credentials;&lt;/li&gt;
&lt;li&gt;idempotency guarantees to safely repeat operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those behaviors are inconsistent, the business operation can still succeed while the integration remains unreliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The infrastructure excuse
&lt;/h3&gt;

&lt;p&gt;One of the most common assumptions is:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“The framework, API gateway, or infrastructure handles that.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes it does. Sometimes it does not. Even when a framework provides defaults, the final behavior may be changed by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;custom middleware;&lt;/li&gt;
&lt;li&gt;reverse proxies;&lt;/li&gt;
&lt;li&gt;gateway configuration;&lt;/li&gt;
&lt;li&gt;authentication layers;&lt;/li&gt;
&lt;li&gt;endpoint-specific code;&lt;/li&gt;
&lt;li&gt;error handlers;&lt;/li&gt;
&lt;li&gt;caching policies;&lt;/li&gt;
&lt;li&gt;deployment differences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The API consumer does not care which layer caused the behavior. They experience the final HTTP response.&lt;/p&gt;

&lt;p&gt;That is why protocol behavior needs to be tested at the API boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  What protocol-level API testing should cover
&lt;/h3&gt;

&lt;p&gt;At minimum, test both valid and invalid protocol usage:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP methods&lt;/strong&gt;&lt;br&gt;
Verify supported methods and confirm that unsupported methods return appropriate responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OPTIONS and HEAD&lt;/strong&gt;&lt;br&gt;
These methods are often ignored, incorrectly configured, or inconsistent across endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content-Type&lt;/strong&gt;&lt;br&gt;
Check whether the API rejects unsupported, missing, or misleading content types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accept and content negotiation&lt;/strong&gt;&lt;br&gt;
Test how the API behaves when clients request supported, unsupported, or malformed response formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication behavior&lt;/strong&gt;&lt;br&gt;
Do not test only successful authentication. Also verify expired credentials, missing credentials, invalid tokens, insufficient permissions, and consistent error responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response headers&lt;/strong&gt;&lt;br&gt;
Headers can affect caching, security, client behavior, observability, and interoperability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching directives&lt;/strong&gt;&lt;br&gt;
Check whether Cache-Control, ETag, Last-Modified, and related behavior match the endpoint’s requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt;&lt;br&gt;
If an operation is expected to be idempotent, repeat it and verify that the outcome remains predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error consistency&lt;/strong&gt;&lt;br&gt;
Equivalent protocol failures should not produce completely different response formats depending on which endpoint was called.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;p&gt;Protocol defects often survive ordinary functional testing because the happy path does not expose them.&lt;/p&gt;

&lt;p&gt;They may only appear when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a mobile client sends a different header;&lt;/li&gt;
&lt;li&gt;an SDK retries a request;&lt;/li&gt;
&lt;li&gt;a proxy caches a response;&lt;/li&gt;
&lt;li&gt;a browser sends an OPTIONS request;&lt;/li&gt;
&lt;li&gt;a client negotiates a different representation;&lt;/li&gt;
&lt;li&gt;a token expires mid-flow;&lt;/li&gt;
&lt;li&gt;an integration uses an unsupported method;&lt;/li&gt;
&lt;li&gt;a request is repeated after a timeout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, the API may be “functionally correct” according to its internal business logic, but incorrect from the consumer’s perspective.&lt;/p&gt;

&lt;p&gt;That is still a defect.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical rule
&lt;/h3&gt;

&lt;p&gt;When testing an endpoint, do not ask only:&lt;/p&gt;

&lt;p&gt;“Did the operation work?”&lt;/p&gt;

&lt;p&gt;Also ask:&lt;/p&gt;

&lt;p&gt;“Did the API behave correctly as an HTTP protocol implementation?”&lt;/p&gt;

&lt;p&gt;This changes the test mindset from checking isolated outcomes to examining the full contract around every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Rentgen fits
&lt;/h3&gt;

&lt;p&gt;Rentgen is designed to explore this space before teams invest time in large automation suites.&lt;/p&gt;

&lt;p&gt;Starting from a single request, it can generate structured checks around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invalid input;&lt;/li&gt;
&lt;li&gt;boundary values;&lt;/li&gt;
&lt;li&gt;missing fields;&lt;/li&gt;
&lt;li&gt;malformed payloads;&lt;/li&gt;
&lt;li&gt;header variations;&lt;/li&gt;
&lt;li&gt;authentication behavior;&lt;/li&gt;
&lt;li&gt;method handling;&lt;/li&gt;
&lt;li&gt;protocol-level edge cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace contract tests, integration tests, or CI regression suites. The goal is to expose assumptions early—before they become permanent gaps in the test strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final thought
&lt;/h3&gt;

&lt;p&gt;An API is not correct merely because it can create a customer.&lt;/p&gt;

&lt;p&gt;It is correct when it behaves predictably across the protocol that consumers depend on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Test the business logic—but test the protocol around it too.&lt;/strong&gt;&lt;/em&gt;&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;

</description>
      <category>api</category>
      <category>apitesting</category>
      <category>restapi</category>
      <category>qa</category>
    </item>
    <item>
      <title>API Abuse Prevention: API Testing Rule 8/10</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:14:55 +0000</pubDate>
      <link>https://dev.to/liudasjan/api-abuse-prevention-api-testing-rule-810-91</link>
      <guid>https://dev.to/liudasjan/api-abuse-prevention-api-testing-rule-810-91</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%2F334v3ui8d1nekp0ltmin.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%2F334v3ui8d1nekp0ltmin.jpeg" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A valid API request can still take down a service.&lt;/p&gt;

&lt;p&gt;API abuse is not always malicious. Retry storms, broken integrations, excessive polling, misconfigured automation, and large data requests can generate enough traffic to exhaust shared resources. Each request may be valid on its own, but the combined effect can increase latency, consume database connections, and reduce availability for every other consumer.&lt;/p&gt;

&lt;p&gt;Every API should defend itself against excessive resource consumption. API testing should cover rate limits, quotas, expensive operations, concurrent requests, large-volume retrieval, retry behavior, resource exhaustion, and fair allocation between consumers.&lt;/p&gt;

&lt;p&gt;For example, an expensive search or report endpoint may work correctly under normal traffic but become a serious reliability problem when a client repeatedly calls it hundreds of times per second. The same applies to endpoints that return large collections or allow aggressive polling without meaningful restrictions.&lt;/p&gt;

&lt;p&gt;Protection may be implemented in the application, API gateway, infrastructure, or a combination of these layers. What matters is the observable result: one consumer must not be able to significantly degrade availability for everyone else.&lt;/p&gt;

&lt;p&gt;Testing should verify not only that limits exist, but also that the API responds predictably when those limits are exceeded. Clients should receive clear failure responses, while the service remains stable and available.&lt;/p&gt;

&lt;p&gt;An API that assumes all consumers will behave correctly is an API that has not been fully tested.&lt;/p&gt;

&lt;p&gt;This is Rule 8 of The Power of Ten Rules for Testing HTTP APIs. Read the complete research article for the full explanation and testing guidance: &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;Rentgen is an API discovery tool built to reveal behavior beyond normal usage assumptions and expose reliability risks before they become production incidents.&lt;/p&gt;

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

</description>
      <category>api</category>
      <category>apitesting</category>
      <category>rentgen</category>
      <category>restapi</category>
    </item>
    <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>
  </channel>
</rss>
