Menulis test berdasarkan asas Four-Phase Test

Four-Phase Test adalah pattern yang membantu kita dalam menulis kode test yang lebih terstruktur. Pattern yang dalam bahasa Indonesia di sebut 4-fase test ini, sesuai namanya, memisahkan kode-kode dalam test menjadi 4 bagian utama:

  1. Fase inisialisasi (setup phase)
  2. Fase eksekusi (exercise phase)
  3. Fase verifikasi (verification phase)
  4. Fase teardown/tutup-daur (teardown phase)

Ke-empat fase tersebut akan dipisah oleh karakter newline, seperti pada contoh test berikut:

describe UserFinder do  
  context 'super user' do
    it 'can see all users' do
      create_many_users
      user = create_super_user

      users = UserFinder.all_visible_by_user(user)

      expect(users).to include user
      expect(users.length).to eq(User.all.count)
    end
  end
end  

Basis teori

Menurut acuan asalnya, pattern Four-Phase Test didesain sehingga pembaca kode test dapat memisahkan dengan lebih mudah, sebenarnya kode yang dibaca sedang melakukan apa secara garis besar.

Hal ini membantu engineer pemula yang bergabung ke dalam team, untuk dapat secara cepat mengetahui behaviour dari suatu sistem, kelas, atau objek apapun yang sedang di-test.

Hal ini juga memaksa engineer untuk menulis test dengan ukuran yang dapat diterima, karena tidak mungkin setelah verifikasi, engineer menulis barisan eksekusi atau bahkan barisan inisialisasi. Dengan begitu, harusnya hilang dengan sendirinya godaan untuk mengetest fitur sebanyak-banyaknya dalam satu target test.

Secara mendalam, fase-fase tersebut akan dibahas sebagai berikut.

Fase inisialisasi

Dalam fase ini, engineer menulis kode yang memastikan hal yang akan ditest (subject) berada pada state yang sesuai. Jika test mengharuskan background job telah dieksekusi, maka hal tersebut harus dilakukan di barisan inisialisasi.

Seringnya, suatu framework test memiliki fitur yang dapat membantu untuk mengextract barisan inisialisasi yang sejenis/mirip/repetitif untuk selanjutnya akan otomatis dieksekusi per setiap target test.

Fase eksekusi

Fase ini adalah tempat dimana kita melakukan testing. Tempat yang harusnya mengakibatkan berubahnya jumlah row dalam database, katakanlah, setelah aksi tertentu dilakukan. Ini adalah tempat untuk mendefinisikan aksi tersebut.

Fase verifikasi

Verifikasi mencocokkan ekspektasi engineer dengan hasil langsung yang didapatkan setelah eksekusi terjadi.

Fase tutup-daur/teardown

Adalah fase yang me-reset ulang kondisi ke saat test belum dilakukan, semisal:

  • Menghapus seluruh data di database test
  • Menghapus file-file temporary yang ada di folder tertentu untuk fitur pengecekan file
  • Menutup streaming dari objek File
  • Mereclaim memory dengan membaskan objek yang masih terdaftar

Namun seringnya, fitur teardown ini tidak perlu ditulis secara explicit, karena beberapa test framework membantu kita melakukan fungsi teardown secara otomatis.

Seringnya juga, fungsi teardown ini di-extract ke bagian tertentu, sehingga otomatis akan dijalankan begitu satu (ataupun setiap) target test telah dieksekusi.

Asas lain yang biasa kita temukan dalam dunia testing adalah asas Specification by Example, yang sangat cocok untuk verifikasi tingkah laku suatu sistem atau kelas.

Artikel - Artikel Terkait