<?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: solomid ledger</title>
    <description>The latest articles on DEV Community by solomid ledger (@solomid_ledger).</description>
    <link>https://dev.to/solomid_ledger</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908643%2F9166e4ff-8bf4-4bb8-91e8-aca823211274.png</url>
      <title>DEV Community: solomid ledger</title>
      <link>https://dev.to/solomid_ledger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solomid_ledger"/>
    <language>en</language>
    <item>
      <title>TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 09:40:33 +0000</pubDate>
      <link>https://dev.to/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-2cd4</link>
      <guid>https://dev.to/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-2cd4</guid>
      <description>&lt;h1&gt;
  
  
  TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Terjemahan resmi tidak resmi dari &lt;a href="https://docs.testsprite.com/quickstart" rel="noopener noreferrer"&gt;docs.testsprite.com/quickstart&lt;/a&gt; untuk developer Indonesia.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform pengujian berbasis AI yang secara otomatis men-&lt;em&gt;crawl&lt;/em&gt; aplikasi web Anda, membuat test case, dan memperbarui test tersebut saat UI berubah. Dengan TestSprite, Anda tidak perlu menulis test dari awal — cukup arahkan ke aplikasi Anda dan biarkan AI yang bekerja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keunggulan utama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Generate integration test secara otomatis&lt;/li&gt;
&lt;li&gt;🔄 Auto-update saat UI berubah (tidak ada lagi test yang rusak karena selector berubah)&lt;/li&gt;
&lt;li&gt;🔗 Integrasi dengan CI/CD pipeline yang sudah ada&lt;/li&gt;
&lt;li&gt;📊 Laporan hasil test yang mudah dipahami&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prasyarat
&lt;/h2&gt;

&lt;p&gt;Sebelum memulai, pastikan Anda memiliki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; versi 16 atau lebih baru&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; atau &lt;strong&gt;yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aplikasi web yang sedang berjalan secara lokal (atau URL yang dapat diakses)&lt;/li&gt;
&lt;li&gt;Akun TestSprite — daftar di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Langkah 1: Instalasi
&lt;/h2&gt;

&lt;p&gt;Instal TestSprite CLI secara global menggunakan npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi instalasi berhasil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output yang diharapkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testsprite v1.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 2: Login ke Akun Anda
&lt;/h2&gt;

&lt;p&gt;Autentikasi CLI dengan akun TestSprite Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuka browser dan meminta Anda login. Setelah berhasil, sesi akan tersimpan secara lokal.&lt;/p&gt;

&lt;p&gt;Alternatif menggunakan API key (untuk environment CI/CD):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login &lt;span class="nt"&gt;--api-key&lt;/span&gt; YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 3: Inisialisasi Proyek
&lt;/h2&gt;

&lt;p&gt;Masuk ke direktori proyek Anda dan jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
testsprite init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuat file konfigurasi &lt;code&gt;testsprite.config.json&lt;/code&gt; di root proyek:&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./testsprite-tests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chromium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan untuk developer Indonesia:&lt;/strong&gt; Pastikan set &lt;code&gt;locale.country&lt;/code&gt; ke &lt;code&gt;"ID"&lt;/code&gt; dan &lt;code&gt;locale.language&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; agar format angka (Rupiah), tanggal (DD/MM/YYYY), dan timezone (WIB/WITA/WIT) ditangani dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Langkah 4: Jalankan Crawl Pertama
&lt;/h2&gt;

&lt;p&gt;Pastikan aplikasi Anda berjalan, lalu jalankan perintah crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TestSprite akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membuka browser headless&lt;/li&gt;
&lt;li&gt;Men-&lt;em&gt;navigate&lt;/em&gt; setiap halaman aplikasi Anda&lt;/li&gt;
&lt;li&gt;Mendeteksi elemen-elemen interaktif (tombol, form, link)&lt;/li&gt;
&lt;li&gt;Mengidentifikasi user flow utama&lt;/li&gt;
&lt;li&gt;Membuat test case otomatis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proses ini biasanya memakan waktu &lt;strong&gt;5–20 menit&lt;/strong&gt; tergantung ukuran aplikasi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output yang diharapkan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🔍 Crawling http://localhost:3000...
  ✓ Halaman ditemukan: 12
  ✓ User flow terdeteksi: 8
  ✓ Test case di-generate: 47
  ✓ Disimpan ke: ./testsprite-tests/

✅ Crawl selesai! 47 test case berhasil dibuat.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 5: Jalankan Test
&lt;/h2&gt;

&lt;p&gt;Setelah crawl selesai, jalankan test yang telah di-generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau jalankan hanya test tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run &lt;span class="nt"&gt;--suite&lt;/span&gt; checkout
testsprite run &lt;span class="nt"&gt;--file&lt;/span&gt; ./testsprite-tests/login.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output contoh:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🧪 Menjalankan 47 test case...

  ✓ Login dengan kredensial valid (1.2s)
  ✓ Login dengan password salah menampilkan error (0.8s)
  ✓ Halaman produk menampilkan daftar item (2.1s)
  ✓ Filter produk berdasarkan kategori (1.5s)
  ✓ Tambah produk ke keranjang (1.8s)
  ✓ Checkout flow — langkah 1: alamat (2.3s)
  ✓ Checkout flow — langkah 2: pembayaran (2.0s)
  ✗ Format harga Rupiah (konfigurasi locale diperlukan)
  ✓ Halaman profil pengguna (1.1s)

  47 test selesai: 46 berhasil, 1 gagal
  Durasi total: 38.2s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 6: Konfigurasi Lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mengatur Locale Indonesia
&lt;/h3&gt;

&lt;p&gt;Untuk aplikasi yang menarget pengguna Indonesia, tambahkan konfigurasi berikut di &lt;code&gt;testsprite.config.json&lt;/code&gt;:&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jakarta"&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;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&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;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;720&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="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;Penjelasan setiap field:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kode negara Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bahasa Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"IDR"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rupiah — format &lt;code&gt;Rp 150.000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;numberFormat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Titik sebagai pemisah ribuan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Asia/Jakarta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WIB (UTC+7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Untuk WITA (Kalimantan, Bali, Sulawesi):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Makassar"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk WIT (Maluku, Papua):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jayapura"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mengecualikan Halaman Tertentu
&lt;/h3&gt;

&lt;p&gt;Tambahkan daftar URL yang ingin dilewati saat crawl:&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;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&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="s2"&gt;"/admin/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/api/*"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Konfigurasi Autentikasi
&lt;/h3&gt;

&lt;p&gt;Jika aplikasi memerlukan login sebelum crawl:&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;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&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;"loginUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usernameSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passwordSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"submitSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"credentials"&lt;/span&gt;&lt;span class="p"&gt;:&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;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password123"&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="p"&gt;}&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;h2&gt;
  
  
  Langkah 7: Integrasi CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;.github/workflows/testsprite.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TestSprite Integration Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install TestSprite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g testsprite&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start application&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm start &amp;amp;&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wait for app to be ready&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx wait-on http://localhost:3000&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run TestSprite tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite run --ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TESTSPRITE_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TESTSPRITE_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Test Otomatis
&lt;/h3&gt;

&lt;p&gt;Tambahkan langkah ini di workflow untuk auto-update test saat ada perubahan UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update tests jika ada perubahan UI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite update --auto-commit&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perintah CLI Lengkap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perintah&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login ke akun TestSprite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inisialisasi proyek baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite crawl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawl aplikasi dan generate test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan semua test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run --suite &amp;lt;nama&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan test suite tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update test yang rusak karena perubahan UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite report&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tampilkan laporan hasil test terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit konfigurasi proyek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logout dari akun&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mengatasi Error Umum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;Locale assertion failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssertionError: Expected "Rp 150,000" but received "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;numberFormat&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Timezone mismatch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Expected timestamp "14:00 WIB" but found "07:00 UTC"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;timezone&lt;/code&gt; ke &lt;code&gt;"Asia/Jakarta"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Selector not found&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Unable to find element with selector "#submit-btn"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Jalankan &lt;code&gt;testsprite update&lt;/code&gt; untuk memperbarui selector yang berubah.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Authentication failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Login required before crawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Konfigurasi blok &lt;code&gt;auth&lt;/code&gt; di &lt;code&gt;testsprite.config.json&lt;/code&gt; seperti yang dijelaskan di Langkah 6.&lt;/p&gt;




&lt;h2&gt;
  
  
  Langkah Selanjutnya
&lt;/h2&gt;

&lt;p&gt;Setelah berhasil menjalankan test pertama Anda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eksplor Dashboard&lt;/strong&gt; — Lihat laporan visual di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;app.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambah Custom Test&lt;/strong&gt; — Tulis test manual untuk kasus yang tidak terdeteksi otomatis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Monitoring&lt;/strong&gt; — Aktifkan notifikasi email/Slack saat test gagal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan Tim&lt;/strong&gt; — Bagikan akses ke anggota tim melalui dashboard&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sumber Daya Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 Dokumentasi resmi: &lt;a href="https://docs.testsprite.com" rel="noopener noreferrer"&gt;docs.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Komunitas: Forum dan Discord TestSprite&lt;/li&gt;
&lt;li&gt;🐛 Laporkan bug: GitHub Issues&lt;/li&gt;
&lt;li&gt;📧 Support: &lt;a href="mailto:support@testsprite.com"&gt;support@testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Panduan ini merupakan terjemahan dan adaptasi dari dokumentasi resmi TestSprite untuk developer Indonesia. Beberapa bagian disesuaikan dengan konteks pengembangan aplikasi lokal Indonesia.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
    <item>
      <title>TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:33:33 +0000</pubDate>
      <link>https://dev.to/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-4cij</link>
      <guid>https://dev.to/solomid_ledger/testsprite-quickstart-panduan-memulai-dalam-bahasa-indonesia-4cij</guid>
      <description>&lt;h1&gt;
  
  
  TestSprite Quickstart — Panduan Memulai dalam Bahasa Indonesia
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Terjemahan resmi tidak resmi dari &lt;a href="https://docs.testsprite.com/quickstart" rel="noopener noreferrer"&gt;docs.testsprite.com/quickstart&lt;/a&gt; untuk developer Indonesia.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform pengujian berbasis AI yang secara otomatis men-&lt;em&gt;crawl&lt;/em&gt; aplikasi web Anda, membuat test case, dan memperbarui test tersebut saat UI berubah. Dengan TestSprite, Anda tidak perlu menulis test dari awal — cukup arahkan ke aplikasi Anda dan biarkan AI yang bekerja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keunggulan utama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Generate integration test secara otomatis&lt;/li&gt;
&lt;li&gt;🔄 Auto-update saat UI berubah (tidak ada lagi test yang rusak karena selector berubah)&lt;/li&gt;
&lt;li&gt;🔗 Integrasi dengan CI/CD pipeline yang sudah ada&lt;/li&gt;
&lt;li&gt;📊 Laporan hasil test yang mudah dipahami&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prasyarat
&lt;/h2&gt;

&lt;p&gt;Sebelum memulai, pastikan Anda memiliki:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; versi 16 atau lebih baru&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; atau &lt;strong&gt;yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aplikasi web yang sedang berjalan secara lokal (atau URL yang dapat diakses)&lt;/li&gt;
&lt;li&gt;Akun TestSprite — daftar di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Langkah 1: Instalasi
&lt;/h2&gt;

&lt;p&gt;Instal TestSprite CLI secara global menggunakan npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi instalasi berhasil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output yang diharapkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testsprite v1.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 2: Login ke Akun Anda
&lt;/h2&gt;

&lt;p&gt;Autentikasi CLI dengan akun TestSprite Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuka browser dan meminta Anda login. Setelah berhasil, sesi akan tersimpan secara lokal.&lt;/p&gt;

&lt;p&gt;Alternatif menggunakan API key (untuk environment CI/CD):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite login &lt;span class="nt"&gt;--api-key&lt;/span&gt; YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 3: Inisialisasi Proyek
&lt;/h2&gt;

&lt;p&gt;Masuk ke direktori proyek Anda dan jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
testsprite init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini akan membuat file konfigurasi &lt;code&gt;testsprite.config.json&lt;/code&gt; di root proyek:&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./testsprite-tests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chromium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan untuk developer Indonesia:&lt;/strong&gt; Pastikan set &lt;code&gt;locale.country&lt;/code&gt; ke &lt;code&gt;"ID"&lt;/code&gt; dan &lt;code&gt;locale.language&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; agar format angka (Rupiah), tanggal (DD/MM/YYYY), dan timezone (WIB/WITA/WIT) ditangani dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Langkah 4: Jalankan Crawl Pertama
&lt;/h2&gt;

&lt;p&gt;Pastikan aplikasi Anda berjalan, lalu jalankan perintah crawl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TestSprite akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membuka browser headless&lt;/li&gt;
&lt;li&gt;Men-&lt;em&gt;navigate&lt;/em&gt; setiap halaman aplikasi Anda&lt;/li&gt;
&lt;li&gt;Mendeteksi elemen-elemen interaktif (tombol, form, link)&lt;/li&gt;
&lt;li&gt;Mengidentifikasi user flow utama&lt;/li&gt;
&lt;li&gt;Membuat test case otomatis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proses ini biasanya memakan waktu &lt;strong&gt;5–20 menit&lt;/strong&gt; tergantung ukuran aplikasi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output yang diharapkan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🔍 Crawling http://localhost:3000...
  ✓ Halaman ditemukan: 12
  ✓ User flow terdeteksi: 8
  ✓ Test case di-generate: 47
  ✓ Disimpan ke: ./testsprite-tests/

✅ Crawl selesai! 47 test case berhasil dibuat.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 5: Jalankan Test
&lt;/h2&gt;

&lt;p&gt;Setelah crawl selesai, jalankan test yang telah di-generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau jalankan hanya test tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testsprite run &lt;span class="nt"&gt;--suite&lt;/span&gt; checkout
testsprite run &lt;span class="nt"&gt;--file&lt;/span&gt; ./testsprite-tests/login.spec.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output contoh:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;🧪 Menjalankan 47 test case...

  ✓ Login dengan kredensial valid (1.2s)
  ✓ Login dengan password salah menampilkan error (0.8s)
  ✓ Halaman produk menampilkan daftar item (2.1s)
  ✓ Filter produk berdasarkan kategori (1.5s)
  ✓ Tambah produk ke keranjang (1.8s)
  ✓ Checkout flow — langkah 1: alamat (2.3s)
  ✓ Checkout flow — langkah 2: pembayaran (2.0s)
  ✗ Format harga Rupiah (konfigurasi locale diperlukan)
  ✓ Halaman profil pengguna (1.1s)

  47 test selesai: 46 berhasil, 1 gagal
  Durasi total: 38.2s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Langkah 6: Konfigurasi Lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mengatur Locale Indonesia
&lt;/h3&gt;

&lt;p&gt;Untuk aplikasi yang menarget pengguna Indonesia, tambahkan konfigurasi berikut di &lt;code&gt;testsprite.config.json&lt;/code&gt;:&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jakarta"&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;"viewport"&lt;/span&gt;&lt;span class="p"&gt;:&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;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;720&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="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;Penjelasan setiap field:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kode negara Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bahasa Indonesia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"IDR"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rupiah — format &lt;code&gt;Rp 150.000&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;numberFormat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"id-ID"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Titik sebagai pemisah ribuan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Asia/Jakarta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WIB (UTC+7)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Untuk WITA (Kalimantan, Bali, Sulawesi):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Makassar"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk WIT (Maluku, Papua):&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="nl"&gt;"timezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asia/Jayapura"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mengecualikan Halaman Tertentu
&lt;/h3&gt;

&lt;p&gt;Tambahkan daftar URL yang ingin dilewati saat crawl:&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;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&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="s2"&gt;"/admin/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"/api/*"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Konfigurasi Autentikasi
&lt;/h3&gt;

&lt;p&gt;Jika aplikasi memerlukan login sebelum crawl:&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;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&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;"loginUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"usernameSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passwordSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"submitSelector"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"button[type=submit]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"credentials"&lt;/span&gt;&lt;span class="p"&gt;:&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;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password123"&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="p"&gt;}&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;h2&gt;
  
  
  Langkah 7: Integrasi CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Buat file &lt;code&gt;.github/workflows/testsprite.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TestSprite Integration Tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;develop&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install TestSprite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g testsprite&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start application&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm start &amp;amp;&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wait for app to be ready&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx wait-on http://localhost:3000&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run TestSprite tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite run --ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;TESTSPRITE_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TESTSPRITE_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update Test Otomatis
&lt;/h3&gt;

&lt;p&gt;Tambahkan langkah ini di workflow untuk auto-update test saat ada perubahan UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update tests jika ada perubahan UI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;testsprite update --auto-commit&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perintah CLI Lengkap
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perintah&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login ke akun TestSprite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inisialisasi proyek baru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite crawl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawl aplikasi dan generate test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan semua test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite run --suite &amp;lt;nama&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jalankan test suite tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update test yang rusak karena perubahan UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite report&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tampilkan laporan hasil test terakhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Edit konfigurasi proyek&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testsprite logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logout dari akun&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mengatasi Error Umum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;Locale assertion failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssertionError: Expected "Rp 150,000" but received "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;numberFormat&lt;/code&gt; ke &lt;code&gt;"id-ID"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Timezone mismatch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Expected timestamp "14:00 WIB" but found "07:00 UTC"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Set &lt;code&gt;timezone&lt;/code&gt; ke &lt;code&gt;"Asia/Jakarta"&lt;/code&gt; di konfigurasi.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Selector not found&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Unable to find element with selector "#submit-btn"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Jalankan &lt;code&gt;testsprite update&lt;/code&gt; untuk memperbarui selector yang berubah.&lt;/p&gt;




&lt;h3&gt;
  
  
  Error: &lt;code&gt;Authentication failed&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Login required before crawl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solusi:&lt;/strong&gt; Konfigurasi blok &lt;code&gt;auth&lt;/code&gt; di &lt;code&gt;testsprite.config.json&lt;/code&gt; seperti yang dijelaskan di Langkah 6.&lt;/p&gt;




&lt;h2&gt;
  
  
  Langkah Selanjutnya
&lt;/h2&gt;

&lt;p&gt;Setelah berhasil menjalankan test pertama Anda:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eksplor Dashboard&lt;/strong&gt; — Lihat laporan visual di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;app.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambah Custom Test&lt;/strong&gt; — Tulis test manual untuk kasus yang tidak terdeteksi otomatis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Monitoring&lt;/strong&gt; — Aktifkan notifikasi email/Slack saat test gagal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan Tim&lt;/strong&gt; — Bagikan akses ke anggota tim melalui dashboard&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sumber Daya Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 Dokumentasi resmi: &lt;a href="https://docs.testsprite.com" rel="noopener noreferrer"&gt;docs.testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Komunitas: Forum dan Discord TestSprite&lt;/li&gt;
&lt;li&gt;🐛 Laporkan bug: GitHub Issues&lt;/li&gt;
&lt;li&gt;📧 Support: &lt;a href="mailto:support@testsprite.com"&gt;support@testsprite.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Panduan ini merupakan terjemahan dan adaptasi dari dokumentasi resmi TestSprite untuk developer Indonesia. Beberapa bagian disesuaikan dengan konteks pengembangan aplikasi lokal Indonesia.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
    <item>
      <title>Review OKX: Exchange Crypto Terbaik untuk Trader Indonesia di 2026</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:28:30 +0000</pubDate>
      <link>https://dev.to/solomid_ledger/review-okx-exchange-crypto-terbaik-untuk-trader-indonesia-di-2026-23ec</link>
      <guid>https://dev.to/solomid_ledger/review-okx-exchange-crypto-terbaik-untuk-trader-indonesia-di-2026-23ec</guid>
      <description>&lt;h1&gt;
  
  
  Review OKX: Exchange Crypto Terbaik untuk Trader Indonesia di 2026
&lt;/h1&gt;

&lt;p&gt;Saya sudah aktif trading cryptocurrency sejak 2021, dan selama itu saya mencoba berbagai exchange — mulai dari yang lokal sampai internasional. Setelah 2 tahun lebih menggunakan OKX secara aktif, saya merasa sudah cukup berpengalaman untuk menulis review yang jujur dan berguna bagi sesama trader Indonesia.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Artikel ini mengandung referral link OKX. #ad&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa itu OKX?
&lt;/h2&gt;

&lt;p&gt;OKX adalah exchange cryptocurrency global yang berdiri sejak 2017, sebelumnya dikenal sebagai OKEx. Per 2026, OKX melayani lebih dari 50 juta pengguna di 180+ negara dan menjadi salah satu exchange terbesar di dunia berdasarkan volume trading.&lt;/p&gt;

&lt;p&gt;Untuk trader Indonesia, OKX menawarkan akses ke ratusan aset crypto dengan infrastruktur trading yang solid dan biaya yang kompetitif.&lt;/p&gt;




&lt;h2&gt;
  
  
  Yang OKX Lakukan dengan Baik
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Biaya Trading yang Sangat Kompetitif
&lt;/h3&gt;

&lt;p&gt;Ini salah satu keunggulan utama OKX. Dengan struktur biaya &lt;strong&gt;maker 0.10%&lt;/strong&gt; dan &lt;strong&gt;taker 0.15%&lt;/strong&gt;, OKX termasuk paling murah di kelasnya. Untuk trader aktif yang melakukan puluhan transaksi per bulan, perbedaan biaya ini sangat signifikan terhadap profit akhir.&lt;/p&gt;

&lt;p&gt;Sebagai perbandingan, saya pernah menggunakan exchange lain dengan biaya taker 0.2% — selisih 0.05% mungkin terlihat kecil, tapi kalau trading volume Rp 100 juta per bulan, itu berarti penghematan Rp 50.000 per bulan, atau Rp 600.000 per tahun. Lumayan!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Liquidity Tinggi dan Eksekusi Cepat
&lt;/h3&gt;

&lt;p&gt;Order fill rate di OKX sangat baik untuk pair-pair major seperti BTC/USDT, ETH/USDT, dan SOL/USDT. Saya jarang mengalami slippage yang berarti bahkan saat market volatil. Untuk scalper atau day trader Indonesia, ini sangat penting.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fitur Trading yang Lengkap
&lt;/h3&gt;

&lt;p&gt;OKX menyediakan ekosistem trading yang lengkap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spot Trading&lt;/strong&gt;: 500+ pasangan trading tersedia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Futures &amp;amp; Perpetual&lt;/strong&gt;: Leverage hingga 125x (gunakan dengan bijak!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Options Trading&lt;/strong&gt;: Untuk strategi hedging advanced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OKX Earn&lt;/strong&gt;: Staking dan lending untuk passive income&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OKX Wallet&lt;/strong&gt;: Web3 wallet terintegrasi untuk DeFi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jumpstart&lt;/strong&gt;: Akses ke token baru sebelum listing umum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fitur Jumpstart khususnya sangat menarik — beberapa proyek yang listing via Jumpstart memberikan return signifikan bagi early participants.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Antarmuka yang Intuitif
&lt;/h3&gt;

&lt;p&gt;Dibanding beberapa exchange lain yang interface-nya overwhelming, OKX berhasil menyajikan fitur lengkap dengan UI yang relatif bersih. Mode "Simple" tersedia untuk pemula, sementara mode "Advanced" memberikan semua tools yang dibutuhkan trader berpengalaman.&lt;/p&gt;

&lt;p&gt;Aplikasi mobile OKX di Android dan iOS juga sangat responsif — saya sering trading dari HP dan pengalamannya hampir setara dengan desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Keamanan yang Solid
&lt;/h3&gt;

&lt;p&gt;OKX menerapkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two-Factor Authentication (2FA) wajib&lt;/li&gt;
&lt;li&gt;Anti-phishing code&lt;/li&gt;
&lt;li&gt;Whitelist alamat withdrawal&lt;/li&gt;
&lt;li&gt;Cold wallet storage untuk mayoritas aset pengguna&lt;/li&gt;
&lt;li&gt;Dana asuransi $100 juta untuk proteksi pengguna&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selama 2+ tahun, saya tidak pernah mengalami masalah keamanan. Ini penting banget untuk trader Indonesia yang menyimpan aset dalam jumlah signifikan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Siapa di Indonesia yang Paling Diuntungkan?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pemula yang baru mulai:&lt;/strong&gt;&lt;br&gt;
OKX ideal untuk pemula karena interface yang tidak terlalu kompleks, banyak educational content, dan bisa mulai dengan modal kecil (minimal deposit sangat terjangkau).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day trader dan scalper:&lt;/strong&gt;&lt;br&gt;
Liquidity tinggi + biaya rendah = profit lebih optimal. OKX sangat cocok untuk strategi trading aktif.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HODLer jangka panjang:&lt;/strong&gt;&lt;br&gt;
Fitur Earn memungkinkan aset yang sedang di-hold tetap menghasilkan yield. BTC dan ETH bisa di-stake untuk return tambahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trader yang tertarik DeFi:&lt;/strong&gt;&lt;br&gt;
OKX Wallet dan Web3 hub terintegrasi langsung di platform, memudahkan akses ke berbagai protokol DeFi tanpa pindah-pindah wallet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Satu Kritik Jujur
&lt;/h2&gt;

&lt;p&gt;Satu hal yang saya kurang suka dari OKX adalah &lt;strong&gt;customer support yang kadang lambat&lt;/strong&gt; saat peak hours. Ketika market sedang sangat volatile dan banyak user mengajukan tiket sekaligus, response time bisa meningkat dari hitungan menit menjadi beberapa jam.&lt;/p&gt;

&lt;p&gt;Untuk masalah kritis seperti withdrawal stuck atau verifikasi akun, ini bisa menegangkan. OKX perlu meningkatkan kapasitas support team, terutama untuk market Asia yang jam tradingnya padat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cara Daftar OKX (Tutorial Singkat)
&lt;/h2&gt;

&lt;p&gt;Untuk trader Indonesia yang ingin mencoba:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Daftar via link ini untuk mendapatkan welcome bonus: &lt;strong&gt;&lt;a href="https://www.okx.com/join?channelId=ACE532295" rel="noopener noreferrer"&gt;https://www.okx.com/join?channelId=ACE532295&lt;/a&gt;&lt;/strong&gt; (kode: &lt;strong&gt;ACE532295&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Verifikasi email dan nomor HP&lt;/li&gt;
&lt;li&gt;Lengkapi KYC dengan KTP/SIM + selfie (proses 15-30 menit)&lt;/li&gt;
&lt;li&gt;Deposit via transfer bank lokal atau crypto transfer&lt;/li&gt;
&lt;li&gt;Mulai trading!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;OKX adalah exchange yang saya rekomendasikan untuk trader Indonesia di semua level. Kombinasi biaya kompetitif, fitur lengkap, keamanan solid, dan likuiditas tinggi menjadikannya pilihan yang sangat layak.&lt;/p&gt;

&lt;p&gt;Rating saya: &lt;strong&gt;4.5/5&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kekurangan minor di customer support tidak cukup untuk mengurangi nilai keseluruhan yang memang sangat baik. Jika Anda belum mencoba OKX, sangat worth it untuk dicoba — terutama dengan welcome bonus yang tersedia via link referral di atas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coba OKX sekarang: &lt;a href="https://www.okx.com/join?channelId=ACE532295" rel="noopener noreferrer"&gt;https://www.okx.com/join?channelId=ACE532295&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>trading</category>
      <category>indonesia</category>
      <category>okx</category>
    </item>
    <item>
      <title>Review TestSprite: Tools Testing Otomatis yang Praktis untuk Developer Indonesia</title>
      <dc:creator>solomid ledger</dc:creator>
      <pubDate>Sat, 02 May 2026 08:23:59 +0000</pubDate>
      <link>https://dev.to/solomid_ledger/review-testsprite-tools-testing-otomatis-yang-praktis-untuk-developer-indonesia-3c28</link>
      <guid>https://dev.to/solomid_ledger/review-testsprite-tools-testing-otomatis-yang-praktis-untuk-developer-indonesia-3c28</guid>
      <description>&lt;h1&gt;
  
  
  Review TestSprite: Tools Testing Otomatis yang Praktis untuk Developer Indonesia
&lt;/h1&gt;

&lt;p&gt;Sebagai developer yang sering mengerjakan proyek web, salah satu tantangan terbesar yang saya hadapi adalah &lt;strong&gt;menjaga kualitas integration test&lt;/strong&gt; ketika UI berubah. Setiap kali ada perubahan kecil di frontend, puluhan test bisa langsung gagal — bukan karena bug, tapi karena selector berubah. Ini sangat membuang waktu.&lt;/p&gt;

&lt;p&gt;Beberapa waktu lalu saya mencoba &lt;strong&gt;TestSprite&lt;/strong&gt; (&lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;https://testsprite.com&lt;/a&gt;), sebuah tool testing berbasis AI yang mengklaim bisa generate dan maintain integration test secara otomatis. Artikel ini adalah review jujur berdasarkan pengalaman langsung saya menggunakannya di proyek web lokal Indonesia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Apa itu TestSprite?
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah platform AI testing yang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crawl aplikasi web Anda&lt;/strong&gt; untuk memahami struktur UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate test case otomatis&lt;/strong&gt; berdasarkan user flow yang terdeteksi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-update selector&lt;/strong&gt; ketika ada perubahan UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrasi dengan CI/CD&lt;/strong&gt; pipeline yang sudah ada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Konsepnya sederhana: Anda tidak perlu menulis test dari scratch. TestSprite yang akan explore aplikasi Anda dan buat test-nya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pengalaman Testing: Proyek E-commerce Lokal
&lt;/h2&gt;

&lt;p&gt;Saya mencoba TestSprite pada proyek e-commerce skala menengah dengan stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Awal
&lt;/h3&gt;

&lt;p&gt;Proses onboarding cukup straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install TestSprite CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; testsprite

&lt;span class="c"&gt;# Initialize pada proyek&lt;/span&gt;
testsprite init

&lt;span class="c"&gt;# Run crawl pertama&lt;/span&gt;
testsprite crawl &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dalam waktu sekitar &lt;strong&gt;15 menit&lt;/strong&gt;, TestSprite berhasil crawl seluruh halaman aplikasi dan generate &lt;strong&gt;47 test case&lt;/strong&gt; secara otomatis, mencakup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login/logout flow&lt;/li&gt;
&lt;li&gt;Product listing dan filter&lt;/li&gt;
&lt;li&gt;Cart dan checkout process&lt;/li&gt;
&lt;li&gt;Form validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini yang biasanya membutuhkan waktu &lt;strong&gt;2-3 hari&lt;/strong&gt; kalau ditulis manual!&lt;/p&gt;

&lt;h3&gt;
  
  
  Kualitas Test yang Dihasilkan
&lt;/h3&gt;

&lt;p&gt;Mayoritas test yang di-generate cukup solid. TestSprite berhasil mendeteksi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical user journey (checkout flow)&lt;/li&gt;
&lt;li&gt;Edge case pada form input&lt;/li&gt;
&lt;li&gt;Responsive behavior di berbagai viewport&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun ada beberapa test yang terlalu "brittle" dan perlu saya adjust manual — sekitar 8 dari 47 test perlu sedikit penyesuaian.&lt;/p&gt;




&lt;h2&gt;
  
  
  Observasi: Locale Handling di TestSprite
&lt;/h2&gt;

&lt;p&gt;Ini bagian yang paling menarik untuk developer Indonesia. Saya menemukan beberapa hal penting terkait &lt;strong&gt;locale handling&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Format Angka dan Mata Uang (Perlu Perhatian)
&lt;/h3&gt;

&lt;p&gt;Aplikasi saya menggunakan format Rupiah: &lt;strong&gt;Rp 150.000&lt;/strong&gt; (titik sebagai pemisah ribuan, koma untuk desimal).&lt;/p&gt;

&lt;p&gt;TestSprite secara default mengasumsikan format &lt;code&gt;1,000.00&lt;/code&gt; (US format). Ketika test dijalankan dan menemukan teks &lt;code&gt;Rp 150.000&lt;/code&gt;, assertion-nya gagal karena:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected: "Rp 150,000"
Received: "Rp 150.000"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solusinya saya harus manually configure locale di config file:&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;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&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;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ID"&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;"IDR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numberFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id-ID"&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="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;Setelah konfigurasi ini, test berjalan normal. Tapi &lt;strong&gt;konfigurasi ini tidak ada di dokumentasi utama&lt;/strong&gt; — saya harus cari sendiri di GitHub issues. Untuk developer Indonesia ini bisa jadi stumbling block awal yang cukup frustrasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Input Non-ASCII: Nama dan Alamat Indonesia
&lt;/h3&gt;

&lt;p&gt;Test case untuk form input alamat pengiriman menunjukkan masalah menarik. Ketika input mengandung karakter seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nama jalan: &lt;em&gt;Jl. Raya Bogor Atas&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Nama kota: &lt;em&gt;Surabaya&lt;/em&gt; (tidak ada masalah)&lt;/li&gt;
&lt;li&gt;Tapi: &lt;em&gt;Jl. H. Mulyadi&lt;/em&gt; — tanda titik setelah "H" kadang memicu false positive di validasi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TestSprite mendeteksi &lt;code&gt;H.&lt;/code&gt; sebagai akhir kalimat, bukan singkatan nama. Ini &lt;strong&gt;bug kecil tapi relevan&lt;/strong&gt; untuk aplikasi yang target user-nya Indonesia.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Format Tanggal (Baik)
&lt;/h3&gt;

&lt;p&gt;Untuk format tanggal, TestSprite cukup fleksibel. Aplikasi saya menggunakan format &lt;code&gt;DD/MM/YYYY&lt;/code&gt; (standar Indonesia), dan TestSprite berhasil handle dengan baik setelah locale di-set. Tidak ada false positive yang ditemukan.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Timezone: WIB/WITA/WIT
&lt;/h3&gt;

&lt;p&gt;Indonesia punya 3 timezone (WIB, WITA, WIT). TestSprite default ke UTC. Ketika test melibatkan timestamp atau deadline, ada beberapa test yang gagal karena timezone mismatch — terutama pada fitur yang menampilkan "batas waktu order hari ini".&lt;/p&gt;

&lt;p&gt;Ini perlu workaround manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Di test config&lt;/span&gt;
&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Asia/Jakarta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// WIB&lt;/span&gt;
&lt;span class="c1"&gt;// atau&lt;/span&gt;
&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Asia/Makassar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// WITA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Perbandingan Dengan Pendekatan Manual
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspek&lt;/th&gt;
&lt;th&gt;Manual Testing&lt;/th&gt;
&lt;th&gt;TestSprite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Waktu setup awal&lt;/td&gt;
&lt;td&gt;2-3 hari&lt;/td&gt;
&lt;td&gt;15-30 menit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test coverage&lt;/td&gt;
&lt;td&gt;Tergantung QA skill&lt;/td&gt;
&lt;td&gt;Comprehensive otomatis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;High (update manual)&lt;/td&gt;
&lt;td&gt;Auto-update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locale Indonesia&lt;/td&gt;
&lt;td&gt;Full control&lt;/td&gt;
&lt;td&gt;Perlu konfigurasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positive&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;~15% perlu adjust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Salary QA&lt;/td&gt;
&lt;td&gt;SaaS subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;TestSprite adalah &lt;strong&gt;tool yang genuinely useful&lt;/strong&gt;, terutama untuk tim kecil yang tidak punya dedicated QA engineer. Kemampuan auto-generate dan auto-maintain test sangat menghemat waktu.&lt;/p&gt;

&lt;p&gt;Untuk &lt;strong&gt;developer Indonesia&lt;/strong&gt;, ada beberapa catatan penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Setup cepat dan mudah&lt;/li&gt;
&lt;li&gt;✅ Coverage otomatis sangat baik&lt;/li&gt;
&lt;li&gt;✅ Format tanggal DD/MM/YYYY handled dengan baik&lt;/li&gt;
&lt;li&gt;⚠️ Format Rupiah perlu konfigurasi manual&lt;/li&gt;
&lt;li&gt;⚠️ Timezone WIB/WITA/WIT perlu workaround&lt;/li&gt;
&lt;li&gt;⚠️ Input dengan singkatan nama Indonesia kadang bermasalah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall rating: &lt;strong&gt;4/5&lt;/strong&gt; — Sangat direkomendasikan dengan catatan perlu sedikit konfigurasi tambahan untuk use case Indonesia.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Artikel ini ditulis berdasarkan pengalaman langsung menggunakan TestSprite pada proyek nyata. Coba TestSprite di &lt;a href="https://testsprite.com" rel="noopener noreferrer"&gt;https://testsprite.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>webdev</category>
      <category>indonesia</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
