Belajar Ruby - Testing, Quality & Best Practices
Series/Belajar Ruby/Episode 20
Episode 20 of 23

Belajar Ruby - Testing, Quality & Best Practices

Episode ini membahas testing dan quality Ruby: framework Minitest dan RSpec, mocks dan stubs, fixtures, alur kerja TDD, lalu RuboCop untuk konsistensi gaya dan SimpleCov untuk mengukur coverage, serta code review best practices.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Menulis kode cepat itu baik, tetapi menulis kode yang bisa dipercaya lebih penting. Episode 20 membahas testing dan quality: framework Minitest dan RSpec, mocks dan stubs, fixtures, alur kerja TDD, lalu RuboCop untuk konsistensi gaya dan SimpleCov untuk mengukur coverage.

Menguji bukan pekerjaan tambahan — ia adalah jaringan pengaman yang membuat refactor dan penambahan fitur terasa aman. Kombinasi test yang baik, lint yang disiplin, dan review yang teliti adalah tanda kode production-grade.

Minitest: Framework Bawaan

Minitest tersedia di standard library, jadi tidak perlu instalasi tambahan. Strukturnya minimal: kelas turunan dari Minitest::Test dengan method test_. Setiap assertion dijalankan saat test suite berjalan:

RubyTest dengan Minitest
require "minitest/autorun"
 
class KalkulatorTest < Minitest::Test
  def test_tambah
    assert_equal 5, 2 + 3
  end
end

assert_equal 5, 2 + 3 membandingkan nilai harapan dengan nilai aktual. Minitest menyediakan assert, refute, assert_raises, dan variasi lain. Jalankan seluruh suite dari terminal dengan ruby test/test_kalkulator.rb atau rake test bila memakai Rakefile.

RSpec: BDD yang Ekspresif

Deskripsi, Expectation dan Stub

RSpec memakai gaya Behavior-Driven Development: perilaku dideskripsikan dengan describe, context, dan it, lalu diperiksa dengan expect. Mocks dan stubs dibuat dengan double dan allow:

RubySpesifikasi RSpec
RSpec.describe Kalkulator do
  it "menambahkan dua angka" do
    expect(2 + 3).to eq(5)
  end
 
  it "mendelegasikan ke service" do
    service = double("service")
    allow(service).to receive(:hitung).and_return(42)
    expect(service.hitung).to eq(42)
  end
end

allow(service).to receive(:hitung).and_return(42) membuat stub — method berpura-pura yang mengembalikan nilai tetap. double membuat objek tiruan lengkap. Ini menjaga test tetap cepat dan terisolasi, tanpa menyentuh database atau jaringan.

Fixtures dan TDD Workflow

Fixture menyediakan data awal untuk test. Di Rails, file fixture di test/fixtures/ di-load otomatis; di RSpec murni, kalian bisa memakai let untuk data per contoh. Alur kerja TDD adalah siklus merah-hijau-refactor:

RubyFixture dengan let
RSpec.describe Pengguna do
  let(:pengguna) { Pengguna.new(nama: "Arman", usia: 30) }
 
  it "memvalidasi usia" do
    expect(pengguna).to be_valid
  end
end

let(:pengguna) mendefinisikan data yang baru dibuat saat pertama dipakai tiap contoh. TDD dimulai dengan menulis test yang gagal, lalu implementasi minimal agar lulus, kemudian membersihkan kode. Disiplin ini menghasilkan desain yang lebih baik karena perilaku dipikirkan sebelum implementasi.

RuboCop dan SimpleCov

RuboCop

RuboCop adalah linter dan style guide untuk Ruby — ia mendukung Ruby 4.0 dan memeriksa ratusan aturan gaya serta masalah potensial. Jalankan dari terminal dan perbaiki otomatis:

Menjalankan RuboCop
gem install rubocop
rubocop
rubocop -a

rubocop mencetak pelanggaran dengan lokasi dan cop yang dilanggar. rubocop -a memperbaiki pelanggaran yang bisa di-fix otomatis. Konfigurasi lewat .rubocop.yml, dan jalankan di CI agar setiap PR konsisten gayanya.

SimpleCov

Coverage memberi tahu berapa persen baris kode yang dieksekusi test. SimpleCov menghitungnya dan menghasilkan laporan HTML:

Menambah SimpleCov
bundle add simplecov

Di file helper test, muat SimpleCov sebelum kode aplikasi: require "simplecov" lalu SimpleCov.start. Jalankan suite, lalu buka coverage/index.html. Coverage seratus persen bukan jaminan bebas bug, tetapi angka di bawah delapan puluh persen menandakan area yang jarang teruji.

Code Review Best Practices

Test dan lint membersihkan kode, tetapi review manusia menangkap hal yang tidak bisa mesin: desain, keselarasan dengan kebutuhan, dan masalah keamanan. Beberapa praktik yang terbukti membantu:

Cek sebelum push
rubocop
bundle exec rspec
bundle audit check

Jalankan rubocop, bundle exec rspec, dan bundle audit check sebelum membuka pull request. Saat review, fokus pada tujuan perubahan, bukan hanya gaya. Beri komentar spesifik dengan saran, dan baca diff baris per baris untuk menemukan logika yang melenceng.

Tip

Jadikan test cepat: suite yang lambat akan dihindari. Isolasi I/O dengan stub, jalankan test paralel bila perlu, dan jadwalkan di CI setiap kali push.

Penutup

Inti yang harus dibawa pulang:

  • Minitest adalah framework test bawaan yang minimal dan cukup untuk banyak kasus.
  • RSpec mengekspresikan perilaku dengan describe, context, dan expect.
  • double dan allow membuat mocks serta stubs untuk isolasi test.
  • let menyediakan fixture per contoh dan menjaga test deterministik.
  • TDD mengikuti siklus merah-hijau-refactor untuk desain yang terarah.
  • RuboCop menegakkan gaya konsisten dan bisa memperbaiki otomatis.
  • SimpleCov mengukur coverage dan membantu menemukan area tak teruji.
  • Review code yang teliti menangkap masalah yang luput dari mesin.

Di episode 21 kita menyentuh Ruby 4.0: fitur modern seperti ZJIT, Ruby::Box, Ractor::Port, perubahan bahasa hingga Unicode 17.0, dan jalur upgrade dari 3.4 ke 4.0. Testing yang baik akan menyelamatkan kalian saat migrasi itu tiba.

Belajar Ruby - Testing, Quality & Best Practices | Belajar Ruby