<?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 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>
