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.

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 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:
require "minitest/autorun"
class KalkulatorTest < Minitest::Test
def test_tambah
assert_equal 5, 2 + 3
end
endassert_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 memakai gaya Behavior-Driven Development: perilaku dideskripsikan dengan describe, context, dan it, lalu diperiksa dengan expect. Mocks dan stubs dibuat dengan double dan allow:
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
endallow(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.
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:
RSpec.describe Pengguna do
let(:pengguna) { Pengguna.new(nama: "Arman", usia: 30) }
it "memvalidasi usia" do
expect(pengguna).to be_valid
end
endlet(: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 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:
gem install rubocop
rubocop
rubocop -arubocop 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.
Coverage memberi tahu berapa persen baris kode yang dieksekusi test. SimpleCov menghitungnya dan menghasilkan laporan HTML:
bundle add simplecovDi 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.
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:
rubocop
bundle exec rspec
bundle audit checkJalankan 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.
Inti yang harus dibawa pulang:
double dan allow membuat mocks serta stubs untuk isolasi test.let menyediakan fixture per contoh dan menjaga test deterministik.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.