<?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: Altan Sezer Ayan</title>
    <description>The latest articles on DEV Community by Altan Sezer Ayan (@altansezerayan).</description>
    <link>https://dev.to/altansezerayan</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%2F3994356%2F4106d05d-9013-4e96-96d2-faeadf3c10e7.jpg</url>
      <title>DEV Community: Altan Sezer Ayan</title>
      <link>https://dev.to/altansezerayan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/altansezerayan"/>
    <language>en</language>
    <item>
      <title>Stop Using Random Strings in JMeter: Generate Algorithmically Correct Mock Data with Mock Jutsu</title>
      <dc:creator>Altan Sezer Ayan</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:24:56 +0000</pubDate>
      <link>https://dev.to/altansezerayan/stop-using-random-strings-in-jmeter-generate-algorithmically-correct-mock-data-with-mock-jutsu-5039</link>
      <guid>https://dev.to/altansezerayan/stop-using-random-strings-in-jmeter-generate-algorithmically-correct-mock-data-with-mock-jutsu-5039</guid>
      <description>&lt;p&gt;Load testing is only as good as your test data.&lt;/p&gt;

&lt;p&gt;If you're using &lt;code&gt;${__Random(1000,9999)}&lt;/code&gt; to simulate credit card numbers or bank account IDs in JMeter, you're not really testing your system — you're testing it with data that will fail validation before it even reaches your business logic.&lt;/p&gt;

&lt;p&gt;Mock Jutsu is a free, zero-dependency JMeter custom functions plugin that generates algorithmically correct mock data directly in your test plans. No scripts, no preprocessing, no external services.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Random Test Data
&lt;/h2&gt;

&lt;p&gt;Most JMeter setups generate test data like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Credit card: ${__Random(1000000000000000,9999999999999999)}
IBAN: TR${__Random(10,99)}0001234567890123456789
SSN: ${__Random(100000000,999999999)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values look real but fail immediately at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Luhn checksum validation (credit cards)&lt;/li&gt;
&lt;li&gt;MOD-97 validation (IBAN)&lt;/li&gt;
&lt;li&gt;Format and checksum rules (SSN, TCKN, NIN...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your backend rejects them before they touch the database. You're load testing your validation layer, not your system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Mock Jutsu
&lt;/h2&gt;

&lt;p&gt;Mock Jutsu generates data that passes real validation rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${__mockjutsu_financial(iban|TR)}          → TR330006100519786457841326  (MOD-97 valid)
${__mockjutsu_financial(cardnum)}           → 4532015112830366            (Luhn valid)
${__mockjutsu_identity(tckn|TR)}            → 34521678902                 (weighted checksum valid)
${__mockjutsu_identity(ssn|US)}             → 532-88-4071                 (format valid)
${__mockjutsu_banking(swift|TR)}            → AKBKTRIS                    (ISO 9362 valid)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1 — JMeter Plugins Manager (recommended)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Plugins Manager if you haven't already&lt;/li&gt;
&lt;li&gt;In JMeter, open Options → Plugins Manager → Available Plugins&lt;/li&gt;
&lt;li&gt;Search for "Mock Jutsu", check it, and click Apply Changes and Restart JMeter&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Official Plugin Page: &lt;a href="https://jmeter-plugins.org/?search=mock-jutsu" rel="noopener noreferrer"&gt;https://jmeter-plugins.org/?search=mock-jutsu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2 — Manual JAR&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download &lt;code&gt;mock-jutsu-jmeter-1.1.1.jar&lt;/code&gt; from GitHub Releases&lt;/li&gt;
&lt;li&gt;Copy to &lt;code&gt;$JMETER_HOME/lib/ext/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Restart JMeter&lt;/li&gt;
&lt;li&gt;Open Options → Function Helper Dialog — search for "mockjutsu"&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;In any JMeter sampler, config element, or HTTP request body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"citizenId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_identity(tckn|TR)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iban"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_financial(iban|TR)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cardNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_financial(cardnum:visa|TR)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_meta(uuid)}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Syntax:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${__mockjutsu_&amp;lt;category&amp;gt;(type[:qualifier][|locale][|varName][|mask])}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${__mockjutsu_financial(cardnum)}                     → 4532015112830366
${__mockjutsu_financial(cardnum:visa|mask)}           → 4532 01** **** 0366  (PCI DSS masked)
${__mockjutsu_financial(cardnum:visa|TR|myCard)}      → stores result in ${myCard}
${__mockjutsu_meta(reverse_regex:[A-Z]{3}\d{4})}      → XKM7291
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Groovy / JSR223 Sampler — Direct Java API
&lt;/h2&gt;

&lt;p&gt;All 390+ types are also callable directly from a JSR223 Sampler (Groovy) without the &lt;code&gt;${__mockjutsu_xxx}&lt;/code&gt; expression syntax, using &lt;code&gt;MockJutsuRegistry&lt;/code&gt; as the single entry point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.mockjutsu.jmeter.MockJutsuRegistry&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.mockjutsu.jmeter.MaskerUtil&lt;/span&gt;

&lt;span class="c1"&gt;// Basic: type + locale&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;citizenId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"tckn"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;    &lt;span class="s2"&gt;"TR"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;iban&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"iban"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;    &lt;span class="s2"&gt;"TR"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cardNum&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cardnum"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"TR"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"visa"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// with qualifier&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;requestId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"uuid"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;    &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Store in JMeter variables for use in downstream samplers&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"citizenId"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;citizenId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"iban"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;       &lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cardNumber"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cardNum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"requestId"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;requestId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Build inline JSON body&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"""{
  "citizenId":  "${citizenId}",
  "iban":       "${iban}",
  "cardNumber": "${cardNum}",
  "requestId":  "${requestId}"
}"""&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"requestBody"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Masking (PCI / GDPR)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;maskedIban&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MaskerUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"iban"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ibanMasked"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maskedIban&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the Java API when you need runtime flexibility — loops, conditionals, or dynamic type selection — that the expression syntax cannot provide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Generate Any Custom Format With reverse_regex
&lt;/h2&gt;

&lt;p&gt;Not every field maps to a known type like IBAN or SSN. Every system has its own internal IDs, reference numbers, and codes — and they all have a format your API enforces. This is where &lt;code&gt;reverse_regex&lt;/code&gt; comes in.&lt;/p&gt;

&lt;p&gt;Instead of generating a constant like "ORD-00000001" across all 500 threads, &lt;code&gt;reverse_regex&lt;/code&gt; generates a unique, format-compliant value per request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${__mockjutsu_meta(reverse_regex:ORD-\d{8})}          → ORD-47291830
${__mockjutsu_meta(reverse_regex:TXN[A-Z]{2}\d{10})}  → TXNQR8471920384
${__mockjutsu_meta(reverse_regex:REF-[A-Z]{3}-\d{6})} → REF-KWP-029471
${__mockjutsu_meta(reverse_regex:[A-Z0-9]{12})}        → X7K2M9QR4LPT
${__mockjutsu_meta(reverse_regex:\d{4}/\d{2}/\d{2})}  → 2026/08/07
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because many systems deduplicate on these reference fields. If every thread sends the same hardcoded order ID, your test hits duplicate-key errors — and you're not testing throughput, you're testing your dedup logic.&lt;/p&gt;

&lt;p&gt;In Groovy, the regex is passed as the qualifier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.mockjutsu.jmeter.MockJutsuRegistry&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"reverse_regex"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ORD-\\d{8}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;txnRef&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"reverse_regex"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"TXN[A-Z]{2}\\d{10}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;batchRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MockJutsuRegistry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"reverse_regex"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"BATCH-[A-Z0-9]{6}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"orderId"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"txnRef"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;   &lt;span class="n"&gt;txnRef&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"batchRef"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batchRef&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No other JMeter function handles this in a single expression. The closest alternative is a BeanShell script with a custom regex library — that's a dependency, a script file, and 20 lines of boilerplate. &lt;code&gt;reverse_regex&lt;/code&gt; does it in one line, zero dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supported Data Types (390+)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;TCKN, SSN, NIN, INN, de_idnr, SIRET, br_cpf, in_aadhaar...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial&lt;/td&gt;
&lt;td&gt;IBAN, credit cards (Visa/MC/Amex/Mir), CVV, PIN, SEPA QR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banking&lt;/td&gt;
&lt;td&gt;SWIFT/BIC, routing number, MT940, CAMT053, MICR line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments&lt;/td&gt;
&lt;td&gt;SWIFT MT103, PAIN001, NACHA ACH, SEPA mandate, Fedwire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health&lt;/td&gt;
&lt;td&gt;FHIR patient, NHS number, ICD-10, HL7 message, NPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capital Markets&lt;/td&gt;
&lt;td&gt;ISIN, CUSIP, SEDOL, LEI, FIX message, FX pair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crypto&lt;/td&gt;
&lt;td&gt;BTC address, ETH address, tx hash, mnemonic, NFT token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRZ&lt;/td&gt;
&lt;td&gt;Passport TD3, TD1 (ICAO Doc 9303 valid)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IoT / RFID / NFC&lt;/td&gt;
&lt;td&gt;RFID UID, NFC tag, MQTT payload, LoRa packet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;Latitude, longitude, coordinates, timezone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta&lt;/td&gt;
&lt;td&gt;UUID, JWT, Bearer token, IP, MAC address, reverse_regex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telecom&lt;/td&gt;
&lt;td&gt;IMEI (Luhn), ICCID, IMSI, MSISDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;X.509 cert, CEF log, PCAP hex, CVE ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance&lt;/td&gt;
&lt;td&gt;AML risk, KYC doc type, SAR number, PEP status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full list: &lt;a href="https://altansayan.github.io/mock-jutsu-api/" rel="noopener noreferrer"&gt;https://altansayan.github.io/mock-jutsu-api/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Zero Dependencies Matters
&lt;/h2&gt;

&lt;p&gt;The JAR has no runtime dependencies. Drop it in &lt;code&gt;lib/ext/&lt;/code&gt; and it works.&lt;br&gt;
No classpath conflicts, no version hell, no corporate proxy issues downloading transitive dependencies.&lt;/p&gt;


&lt;h2&gt;
  
  
  Algorithm Guarantees
&lt;/h2&gt;

&lt;p&gt;All generated data passes real checksum and format validation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TCKN&lt;/td&gt;
&lt;td&gt;d9/d10 Turkish checksum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBAN&lt;/td&gt;
&lt;td&gt;MOD-97 (ISO 13616)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Card numbers&lt;/td&gt;
&lt;td&gt;Luhn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMEI&lt;/td&gt;
&lt;td&gt;Luhn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NHS Number&lt;/td&gt;
&lt;td&gt;Modulo 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EAN-13/8&lt;/td&gt;
&lt;td&gt;GS1 checksum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISIN&lt;/td&gt;
&lt;td&gt;Luhn (alphanumeric)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRZ&lt;/td&gt;
&lt;td&gt;ICAO Doc 9303 composite check digit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTC Address&lt;/td&gt;
&lt;td&gt;Base58Check (SHA256d)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETH Address&lt;/td&gt;
&lt;td&gt;Keccak-256 EIP-55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEI&lt;/td&gt;
&lt;td&gt;MOD-97 (ISO 17442)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Real-World Use Case: Fintech Load Test
&lt;/h2&gt;

&lt;p&gt;Testing a payment API that validates IBAN + card number combinations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;Thread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Group:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;users,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ramp-up&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/api/payment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceIban"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_financial(iban|TR)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cardNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_financial(cardnum:visa|TR)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cvv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_financial(cvv3)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"${__Random(100,10000)}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"TRY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"${__mockjutsu_meta(uuid)}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every request generates a unique, format-valid payload that passes validation and actually reaches your payment processing logic. That's the load test that matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;347 of 423 types (82%) average under 0.05 ms at 1,000 concurrent threads. Only 5 types exceed 0.15 ms (OIDC, AI, Prometheus) — pre-generate these via CSV for production load tests.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/altansayan/mock-jutsu-jmeter" rel="noopener noreferrer"&gt;https://github.com/altansayan/mock-jutsu-jmeter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Maven Central: &lt;a href="https://central.sonatype.com/artifact/io.github.altansayan/mockjutsu" rel="noopener noreferrer"&gt;https://central.sonatype.com/artifact/io.github.altansayan/mockjutsu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/mockjutsu/" rel="noopener noreferrer"&gt;https://pypi.org/project/mockjutsu/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;HOW-TO docs: &lt;a href="https://altansayan.github.io/mock-jutsu-api/" rel="noopener noreferrer"&gt;https://altansayan.github.io/mock-jutsu-api/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jmeter</category>
      <category>testing</category>
      <category>java</category>
      <category>devops</category>
    </item>
    <item>
      <title>Stop hardcoding test data — generate 395+ realistic banking &amp; fintech values instantly</title>
      <dc:creator>Altan Sezer Ayan</dc:creator>
      <pubDate>Mon, 29 Jun 2026 21:27:46 +0000</pubDate>
      <link>https://dev.to/altansezerayan/stop-hardcoding-test-data-generate-395-realistic-banking-fintech-values-instantly-1476</link>
      <guid>https://dev.to/altansezerayan/stop-hardcoding-test-data-generate-395-realistic-banking-fintech-values-instantly-1476</guid>
      <description>&lt;p&gt;If you've ever written a test for a banking or fintech app, you know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardcoded IBANs that fail format validation&lt;/li&gt;
&lt;li&gt;Fake credit card numbers that get rejected by Luhn checks&lt;/li&gt;
&lt;li&gt;SSN/national ID values that don't match country-specific rules  - Copy-pasted test data that leaks into logs
I spent 12 years as a QA Manager in fintech dealing with this. So I built &lt;strong&gt;Mock Jutsu&lt;/strong&gt; — an open-source synthetic test data  generator with 395+ data types, zero external dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## What it generates&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Banking:&lt;/strong&gt; IBAN (MOD-97 valid), BIC, SWIFT, routing numbers, sort codes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cards:&lt;/strong&gt; Luhn-valid card numbers, CVV, expiry, masked PAN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity:&lt;/strong&gt; SSN (US), NIN (UK), SIN (CA), TCKN (TR), 45 countries total&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capital markets:&lt;/strong&gt; ISIN, CUSIP, SEDOL, LEI, FIGI, FIX messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crypto:&lt;/strong&gt; Bitcoin, Ethereum, USDT addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health, IoT, E-commerce&lt;/strong&gt; and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## Installation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  pip &lt;span class="nb"&gt;install &lt;/span&gt;mock-jutsu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## CLI usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  mockjutsu generate iban &lt;span class="nt"&gt;--locale&lt;/span&gt; TR
  mockjutsu generate cardnum &lt;span class="nt"&gt;--locale&lt;/span&gt; US
  mockjutsu generate tckn
  mockjutsu generate iban &lt;span class="nt"&gt;--locale&lt;/span&gt; TR &lt;span class="nt"&gt;--mask&lt;/span&gt;
  mockjutsu bulk tckn &lt;span class="nt"&gt;--count&lt;/span&gt; 100
  mockjutsu template iban fullname cardnum &lt;span class="nt"&gt;--count&lt;/span&gt; 50 &lt;span class="nt"&gt;--locale&lt;/span&gt; TR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Python usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mockjutsu.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;jutsu&lt;/span&gt;

  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cardnum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tckn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ssn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cardnum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Compliance-safe masked output&lt;/p&gt;

&lt;p&gt;For PCI DSS, GDPR, and KVKK scenarios, every sensitive type supports masking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cardnum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# ************3456
&lt;/span&gt;  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iban&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# TR33******786457841326
&lt;/span&gt;  &lt;span class="n"&gt;jutsu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tckn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 348******54
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Export formats&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  mockjutsu bulk iban &lt;span class="nt"&gt;--count&lt;/span&gt; 1000
  mockjutsu bulk cardnum &lt;span class="nt"&gt;--count&lt;/span&gt; 500
  mockjutsu template iban fullname ssn &lt;span class="nt"&gt;--count&lt;/span&gt; 200 &lt;span class="nt"&gt;--format&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Full docs&lt;/p&gt;

&lt;p&gt;HOW-TO pages for all 395 types in 5 languages (EN, TR, DE, FR, RU):&lt;br&gt;
  👉 &lt;a href="https://altansayan.github.io/mock-jutsu-api/" rel="noopener noreferrer"&gt;https://altansayan.github.io/mock-jutsu-api/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What test data types are you still generating manually? Happy to add them.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>data</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
