<?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>Rentgen v2: AI testing grounded in actual API test results</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 28 Oct 2026 19:11:07 +0000</pubDate>
      <link>https://dev.to/liudasjan/rentgen-v2-ai-testing-grounded-in-actual-api-test-results-2e8p</link>
      <guid>https://dev.to/liudasjan/rentgen-v2-ai-testing-grounded-in-actual-api-test-results-2e8p</guid>
      <description>&lt;p&gt;I released the first version of Rentgen on November 9, 2025. On October 28, 2026, we released v2.0.0.&lt;/p&gt;

&lt;p&gt;The original workflow remains simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paste a cURL → map the fields → run API tests.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rentgen generates and executes deterministic checks for input validation, boundaries, authentication, security, and performance. That core workflow runs locally, is free, and requires no AI model.&lt;/p&gt;

&lt;p&gt;Version 2 adds AI analysis and additional test generation, OpenAPI import, and a more compact interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why add AI to an existing test engine?
&lt;/h2&gt;

&lt;p&gt;After Rentgen finishes a run, it already has useful context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original request.&lt;/li&gt;
&lt;li&gt;Field types, required fields, allowed values, and boundaries supplied through mapping.&lt;/li&gt;
&lt;li&gt;Requests that were actually executed.&lt;/li&gt;
&lt;li&gt;Actual responses and measurements.&lt;/li&gt;
&lt;li&gt;Configured expectations and test results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives a model a specific task: analyse the recorded results and identify meaningful gaps in coverage.&lt;/p&gt;

&lt;p&gt;For example, testing a required field with &lt;code&gt;null&lt;/code&gt; does not establish what happens when the field is omitted entirely. A server error from a request that changed several fields may warrant a new test that isolates one condition.&lt;/p&gt;

&lt;p&gt;The goal is to find useful next steps based on what has already happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deeper AI Testing
&lt;/h2&gt;

&lt;p&gt;Rentgen v2 supports connections to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI.&lt;/li&gt;
&lt;li&gt;Anthropic.&lt;/li&gt;
&lt;li&gt;Ollama, including models running locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You configure your provider and model connection. Rentgen prepares the analysis request automatically, so there is no prompt to write.&lt;/p&gt;

&lt;p&gt;The analysis returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A summary of observed API behaviour and coverage.&lt;/li&gt;
&lt;li&gt;Up to three important findings, with evidence and impact.&lt;/li&gt;
&lt;li&gt;Areas that need further investigation.&lt;/li&gt;
&lt;li&gt;Up to ten additional executable tests covering meaningful gaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ten is a limit, not a target. If only two useful tests remain, generating eight more variations adds noise.&lt;/p&gt;

&lt;p&gt;You can also provide additional API context, such as business rules or areas you want investigated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generated tests become part of your project
&lt;/h2&gt;

&lt;p&gt;The output is structured test data that Rentgen can use directly.&lt;/p&gt;

&lt;p&gt;You can inspect each proposed request, review its expected result, and execute it in Rentgen.&lt;/p&gt;

&lt;p&gt;AI helps discover a test, then the test runner executes and checks request deterministically.&lt;/p&gt;

&lt;p&gt;The model’s suggestion still needs review. It can misunderstand a business rule or propose an incorrect expectation. Rentgen lets you inspect and adjust the test before making it part of your ongoing coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your model connection
&lt;/h2&gt;

&lt;p&gt;AI requests go directly from your device to the provider you configure.&lt;/p&gt;

&lt;p&gt;Rentgen has no backend receiving your API requests, reports, or model credentials. Credentials are stored locally.&lt;/p&gt;

&lt;p&gt;If you connect a local Ollama model, analysis can stay on your own machine. If you choose a cloud provider, the supplied context goes to that provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAPI import
&lt;/h2&gt;

&lt;p&gt;You can now import an OpenAPI JSON file or provide its URL.&lt;/p&gt;

&lt;p&gt;Rentgen creates a folder and collection of endpoint requests from the specification. This gives you a starting point for configuring and testing an API without importing each request individually.&lt;/p&gt;

&lt;p&gt;You still supply the environment, credentials, and any values needed to make those requests work.&lt;/p&gt;

&lt;h2&gt;
  
  
  A more compact interface
&lt;/h2&gt;

&lt;p&gt;Version 2 reorganises test results into tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deeper AI Testing.&lt;/li&gt;
&lt;li&gt;Security Tests.&lt;/li&gt;
&lt;li&gt;Performance Insights.&lt;/li&gt;
&lt;li&gt;Data-Driven Tests.&lt;/li&gt;
&lt;li&gt;CRUD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes larger runs easier to navigate and keeps each suite’s results together.&lt;/p&gt;

&lt;p&gt;The release also includes the QUERY method, GUID field mapping, expanded numeric ranges, fixes for mapping persistence after errors, and other usability and stability improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What remains free?
&lt;/h2&gt;

&lt;p&gt;The deterministic API testing engine remains free.&lt;/p&gt;

&lt;p&gt;Deeper AI Testing is an optional Rentgen Pro feature, priced at &lt;strong&gt;$36 per year&lt;/strong&gt;. You bring your own model connection; cloud model usage is billed separately by your provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Rentgen v2
&lt;/h2&gt;

&lt;p&gt;Download Rentgen, import a cURL or OpenAPI specification, configure the fields, and run the deterministic tests.&lt;/p&gt;

&lt;p&gt;If you try the AI integration, I’m particularly interested in whether its additional tests find something useful beyond the existing coverage.&lt;/p&gt;

&lt;p&gt;A big thank you to &lt;strong&gt;Andrej Davidovič&lt;/strong&gt; for building features with me and helping bring this release together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rentgen.io" rel="noopener noreferrer"&gt;Download Rentgen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Rentgen-io/Rentgen" rel="noopener noreferrer"&gt;View the repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Rentgen-io/Rentgen/releases/tag/v2.0.0" rel="noopener noreferrer"&gt;Read the v2.0.0 release notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
      <category>api</category>
      <category>ai</category>
      <category>development</category>
    </item>
    <item>
      <title>I got tired of API testing comparison tables. So I built REST Atlas.</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 27 Oct 2026 18:34:58 +0000</pubDate>
      <link>https://dev.to/liudasjan/i-got-tired-of-api-testing-comparison-tables-so-i-built-rest-atlas-23dd</link>
      <guid>https://dev.to/liudasjan/i-got-tired-of-api-testing-comparison-tables-so-i-built-rest-atlas-23dd</guid>
      <description>&lt;p&gt;There is something amusing about API testing tool comparisons: the tool publishing the comparison almost always comes out looking like the best choice.&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%2Fkb20w6x1a3n34po2fd1b.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%2Fkb20w6x1a3n34po2fd1b.jpg" alt=" " width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the information is accurate. The problem is which information makes it into the table.&lt;/p&gt;

&lt;p&gt;Choose the right columns, leave out a few inconvenient capabilities, give your own terminology a dedicated row, and the result becomes fairly predictable.&lt;/p&gt;

&lt;p&gt;As someone who builds an API testing tool myself, I understand how this happens. You spend your time solving a particular problem, so naturally you consider that problem important. Your comparison starts reflecting your product’s priorities.&lt;/p&gt;

&lt;p&gt;That can help explain a product. It becomes less useful when someone is trying to understand the wider ecosystem.&lt;/p&gt;

&lt;p&gt;I wanted a place where I could explore REST API testing tools, apply consistent filters, and compare their documented capabilities using the same fields.&lt;/p&gt;

&lt;p&gt;I found directories, GitHub lists, articles, and broader ecosystem maps. Several were useful, but I couldn’t find one that worked the way I wanted.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://restatlas.org" rel="noopener noreferrer"&gt;REST Atlas&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A place to explore the REST API testing ecosystem
&lt;/h2&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%2Femrn632hmh2vofamnhu6.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%2Femrn632hmh2vofamnhu6.jpg" alt=" " width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;REST Atlas is an interactive map and directory of tools that support REST API testing.&lt;/p&gt;

&lt;p&gt;You can browse tools by category, search for particular capabilities, filter the directory, and compare tools side by side.&lt;/p&gt;

&lt;p&gt;The catalogue covers different parts of the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API clients&lt;/li&gt;
&lt;li&gt;Functional testing&lt;/li&gt;
&lt;li&gt;Test generation&lt;/li&gt;
&lt;li&gt;Contract and schema testing&lt;/li&gt;
&lt;li&gt;Security testing&lt;/li&gt;
&lt;li&gt;Performance testing&lt;/li&gt;
&lt;li&gt;Mocking&lt;/li&gt;
&lt;li&gt;Traffic recording and replay&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tool can belong to several categories. That matters because the boundaries are rarely clean. An API client might also run automated tests, provide mocks, and execute scheduled checks.&lt;/p&gt;

&lt;p&gt;The comparison includes practical information such as licensing, pricing model, interfaces, execution options, test creation, and CI/CD support.&lt;/p&gt;

&lt;p&gt;Those details often matter more than another generic “best API testing tools” article. A team that needs local execution and version-controlled test assets has different constraints from a team looking for hosted monitoring.&lt;/p&gt;

&lt;p&gt;The aim is to make those differences easier to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistent criteria, with sources people can check
&lt;/h2&gt;

&lt;p&gt;Calling a comparison “objective” is easy. Keeping the information accurate takes work.&lt;/p&gt;

&lt;p&gt;The starting principles for REST Atlas are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The same comparison fields apply to every tool.&lt;/strong&gt; Adding another product does not create a special set of columns designed around its strengths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entries include sources and a verification date.&lt;/strong&gt; Readers should be able to check where the information came from and see when it was last reviewed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown information stays unknown.&lt;/strong&gt; Missing evidence should not automatically become a red cross. “Not confirmed” and “not supported” mean different things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Licensing and pricing are separate.&lt;/strong&gt; A free plan does not make a product open source. A public repository can have restrictions. An open-source core can coexist with paid editions.&lt;/p&gt;

&lt;p&gt;The catalogue also needs to describe the scope of each entry carefully. A desktop application, its open-source core, and the vendor’s hosted platform may have different capabilities and terms.&lt;/p&gt;

&lt;p&gt;These distinctions make the data harder to maintain, but they make the comparison more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  No advertising or sponsored placements
&lt;/h2&gt;

&lt;p&gt;REST Atlas has no advertising, sponsored tool placements, analytics, cookies, or tracking.&lt;/p&gt;

&lt;p&gt;You can browse, filter, and compare without creating an account.&lt;/p&gt;

&lt;p&gt;For transparency, I am the founder of &lt;strong&gt;Rentgen&lt;/strong&gt;, and the REST Atlas repository lives under the &lt;strong&gt;Rentgen-io&lt;/strong&gt; GitHub organization.&lt;/p&gt;

&lt;p&gt;Rentgen is included in the catalogue. The same fields, source requirements, and contribution rules apply to it.&lt;/p&gt;

&lt;p&gt;That relationship should be visible to anyone evaluating the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catalogue is open to contributions
&lt;/h2&gt;

&lt;p&gt;I started with tools I know. There will be tools missing, details that need correcting, and capabilities that change after an entry is reviewed.&lt;/p&gt;

&lt;p&gt;The repository is public so people can help improve it.&lt;/p&gt;

&lt;p&gt;All tool data lives in a single &lt;strong&gt;&lt;code&gt;tools.json&lt;/code&gt;&lt;/strong&gt; file. The application reads that file to build the directory, map, filters, and comparisons. Adding a tool does not require changing the application code.&lt;/p&gt;

&lt;p&gt;To contribute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read &lt;strong&gt;CONTRIBUTING.md&lt;/strong&gt; for the supported fields and formats.&lt;/li&gt;
&lt;li&gt;Add or update an entry in &lt;strong&gt;tools.json&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open a pull request with sources supporting the information.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tool authors are welcome to contribute. So are people who use the tools and notice something missing or inaccurate.&lt;/p&gt;

&lt;p&gt;Suggestions for better comparison criteria are welcome too. Consistent fields are useful only if they help people make real decisions.&lt;/p&gt;

&lt;p&gt;For now, the scope is deliberately focused on &lt;strong&gt;REST API testing&lt;/strong&gt;. Tools that support several protocols can be included when they also support REST.&lt;/p&gt;

&lt;p&gt;I would rather maintain a useful, focused catalogue than keep expanding its scope until the details become impossible to follow.&lt;/p&gt;

&lt;p&gt;If you work with REST APIs, try it with a few tools you already know. Check whether the comparison represents them accurately. Add a missing tool, correct an entry, or suggest a field that would help you choose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore:&lt;/strong&gt; &lt;a href="https://restatlas.org" rel="noopener noreferrer"&gt;restatlas.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository and contributions:&lt;/strong&gt; &lt;a href="https://github.com/Rentgen-io/rest-atlas" rel="noopener noreferrer"&gt;github.com/Rentgen-io/rest-atlas&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>testing</category>
      <category>tools</category>
    </item>
    <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>
  </channel>
</rss>
