Katakan saja tidak untuk mengakhiri tes 2-end

Anda mungkin mengalami ini ketika Anda dan teman Anda benar-benar ingin menonton film, dan kemudian menyesal karena Anda menghabiskan waktu untuk itu. Atau mungkin Anda ingat saat ketika tim Anda berpikir bahwa ia telah menemukan "fitur mematikan" dan menemukan "jebakan" -nya hanya setelah rilis produk.

Gagasan bagus sering gagal dalam praktik, dan di dunia pengujian, strategi pengujian yang didasarkan pada otomatisasi pengujian ujung-ke-ujung adalah contoh yang baik untuk hal ini.

Penguji dapat menginvestasikan waktu mereka menulis banyak jenis tes otomatis, termasuk tes unit, tes integrasi, dan tes end-2-end, tetapi strategi ini terutama ditujukan pada tes end-2-end yang menguji produk atau layanan secara keseluruhan. Biasanya, tes ini meniru skenario pengguna nyata.

Sumber

Tes end-2-end dalam teori


Meskipun mengandalkan tes 2-end adalah ide yang buruk, secara teori Anda dapat mengajukan beberapa argumen yang mendukung pernyataan ini. 

Jadi, nomor satu dalam daftar Google dari sepuluh hal yang, seperti kita ketahui, adalah benar: "Kepentingan pengguna di atas segalanya." Dengan demikian, menggunakan tes end-2-end yang berfokus pada skenario pengguna nyata sepertinya ide bagus. Selain itu, strategi ini umumnya menarik bagi banyak peserta dalam proses tersebut.

  • Pengembang menyukai strategi ini, karena Anda dapat mentransfer sebagian besar pengujian, jika tidak semua, kepada orang lain.
  • , , , , , , .
  • ,   , ; .

End-2-end


Jadi, jika strategi pengujian ini terlihat sangat bagus secara teori, lalu apa yang salah dengan praktiknya? Untuk menunjukkan ini, saya akan memberikan skenario fiktif di bawah ini, tetapi yang didasarkan pada situasi nyata yang akrab bagi saya dan penguji lainnya. 

Misalkan tim membuat layanan untuk mengedit dokumen secara online (misalnya, Google Documents). Mari kita asumsikan bahwa tim sudah memiliki beberapa infrastruktur yang luar biasa untuk pengujian. Setiap malam:

  • Membangun versi layanan terbaru,
  • maka versi ini digunakan di lingkungan pengujian tim,
  • maka dalam lingkungan tes ini semua tes end-to-end dijalankan,
  • Tim menerima laporan email yang merangkum hasil tes.

Tenggat waktu semakin dekat. Untuk mempertahankan tingkat kualitas produk yang tinggi, katakanlah kami memutuskan bahwa setidaknya 90% dari tes ujung-2 yang berhasil diperlukan sehingga kami menganggap bahwa versi tersebut siap. Katakanlah tenggat waktu datang dalam satu hari.


Meskipun banyak masalah, tes akhirnya mengungkapkan kesalahan nyata.

Apa yang berjalan dengan baik

Kesalahan yang memengaruhi pengguna diidentifikasi dan diperbaiki sebelum mereka sampai padanya.

Ada yang salah

  • Tim menyelesaikan fase pemrogramannya seminggu kemudian (dan bekerja lembur).
  • Menemukan akar penyebab gagal-2-ujung tes gagal memakan waktu dan dapat mengambil banyak waktu.
  • Kegagalan tim paralel dan malfungsi pada peralatan memindahkan hasil tes beberapa hari.
  • Banyak kesalahan kecil disembunyikan di balik kesalahan besar.
  • Hasil tes ujung-2-ujung telah tidak dapat diandalkan di kali.
  • Pengembang harus menunggu hingga hari berikutnya untuk mencari tahu apakah perbaikannya berhasil atau tidak.

Jadi, sekarang kita tahu apa yang salah dalam strategi ujung-2-ujung, kita perlu mengubah pendekatan pengujian kami untuk menghindari banyak masalah di atas. Tapi apa pendekatan yang tepat?

Nilai sebenarnya dari tes


Sebagai aturan, pekerjaan tester berakhir ketika tes gagal. Kesalahan dicatat, dan kemudian tugas pengembang adalah untuk memperbaiki kesalahan. Namun, untuk menentukan di mana strategi ujung-ke-2 tidak berfungsi, kita perlu melampaui pemikiran ini dan mendekati masalah menggunakan prinsip-prinsip dasar kita. Jika kita "fokus pada pengguna (dan yang lainnya mengikuti)," kita harus bertanya pada diri sendiri: apakah pengujian yang gagal bermanfaat bagi pengguna? 

Inilah jawabannya: "Tes gagal tidak secara langsung menguntungkan pengguna."

Meskipun pernyataan ini, pada pandangan pertama, tampak mengejutkan, itu benar. Jika produk berfungsi, itu berfungsi, terlepas dari apakah tes mengatakan itu berfungsi atau tidak. Jika suatu produk rusak, itu rusak, terlepas dari apakah tes itu mengatakan itu rusak atau tidak. Jadi, jika tes gagal tidak menguntungkan pengguna, lalu apa manfaatnya baginya?

Perbaikan bug secara langsung bermanfaat bagi pengguna.

Pengguna akan senang hanya ketika perilaku (kesalahan) yang tidak terduga ini menghilang. Jelas, untuk memperbaiki kesalahan, Anda harus tahu bahwa itu ada. Untuk mengetahui bahwa ada kesalahan, idealnya Anda harus memiliki tes yang mendeteksi itu (karena jika tes tidak mendeteksi kesalahan, maka pengguna akan menemukannya). Tetapi dalam keseluruhan proses, dari kegagalan pengujian hingga koreksi kesalahan, nilai tambah muncul pada langkah terakhir.


Jadi, untuk mengevaluasi strategi pengujian apa pun, Anda tidak bisa hanya mengevaluasi bagaimana ia menemukan kesalahan. Anda juga harus mengevaluasi bagaimana ini memungkinkan pengembang untuk mengoreksi (dan bahkan mencegah) mereka.

Membangun umpan balik yang benar


Pengujian membuat lingkaran umpan balik yang menginformasikan pengembang tentang apakah produk berfungsi atau tidak. Umpan balik ideal memiliki beberapa properti.

  • . , , . ( ), . . , .
  • . , , , . , , .
  • Seharusnya Anda dapat dengan cepat menemukan kesalahan. Untuk memperbaiki kesalahan, pengembang perlu menemukan baris kode tertentu yang menyebabkan kesalahan. Ketika suatu produk mengandung jutaan baris kode, dan kesalahan bisa di mana saja, itu seperti mencoba menemukan jarum di tumpukan jerami.

Berpikir Kecil, Tidak Besar


Jadi bagaimana kita membuat lingkaran umpan balik yang sempurna ini? Memikirkan yang kecil, bukan yang lebih besar.

Pengujian unit Pengujian

unit mengambil sepotong kecil produk dan mengujinya secara terpisah dari yang lainnya. Mereka hampir membuat loop umpan balik sempurna yang sama:

  • Tes unit cepat. Kita perlu menulis blok kode kecil dan kita sudah bisa mengujinya. Tes unit biasanya cukup kecil. Bahkan, sepersepuluh detik terlalu lama untuk tes unit.
  • . , , . , — , , — .
  • . , , , , .

Menulis tes unit yang efektif membutuhkan keterampilan di bidang-bidang seperti manajemen ketergantungan, tulisan rintisan / mengejek, dan pengujian ketat. Saya tidak akan menjelaskan keterampilan ini di sini, tetapi untuk memulainya, contoh khas yang ditawarkan kepada Googler baru (atau sebagaimana mereka disebut di Google, Noogler) adalah bagaimana Google membuat dan menguji stopwatch.

Tes unit terhadap tes ujung-2-ujung

Untuk tes ujung-2-ujung, Anda harus menunggu: pertama untuk menciptakan seluruh produk, kemudian untuk menyebarkannya, dan, akhirnya, untuk menyelesaikan semua tes ujung-2-ujung. Ketika tes masih bekerja, kemungkinan besar mereka akan gagal secara berkala. Dan bahkan jika tes mendeteksi kesalahan, itu bisa di mana saja di dalam produk.

Meskipun pengujian ujung-ke-ujung lebih baik dalam memodelkan skenario pengguna nyata, keunggulan ini dengan cepat melebihi semua kekurangan dari loop umpan balik ujung-ke-ujung:


Tes Integrasi Tes

unit memiliki satu kelemahan utama: meskipun modul bekerja dengan baik secara terpisah, Anda tidak tahu apakah keduanya bekerja dengan baik. Tetapi meskipun begitu, Anda tidak harus menjalankan tes ujung-ujung-2. Anda dapat menggunakan tes integrasi untuk ini. Tes integrasi mengambil sekelompok kecil modul, seringkali dua, dan menguji perilaku mereka secara keseluruhan.

Jika dua blok tidak terintegrasi dengan benar, mengapa menulis tes ujung ke ujung ketika Anda dapat menulis tes integrasi yang jauh lebih kecil, lebih fokus yang mendeteksi kesalahan yang sama? Tentu saja, Anda harus memahami seluruh konteks saat pengujian, tetapi untuk menguji kerja dua modul bersama-sama Anda hanya perlu sedikit memperluas perspektif.

Tes piramida


Bahkan dengan pengujian unit dan integrasi, Anda mungkin memerlukan sejumlah kecil tes end-2-end untuk menguji sistem secara keseluruhan. Untuk menemukan keseimbangan yang tepat antara ketiga jenis tes, yang terbaik adalah menggunakan piramida pengujian visual. Berikut adalah versi sederhana dari piramida tes dari pidato pembukaan konferensi Google Test Automation 2014 .


Sebagian besar tes Anda adalah tes unit di bagian bawah piramida. Saat Anda naik piramida, tes Anda menjadi lebih komprehensif, tetapi pada saat yang sama, jumlah tes (lebar piramida Anda) menurun.

Dalam cara yang baik, Google menawarkan pemisahan 70/20/10: tes unit 70%, tes integrasi 20% dan tes akhir-2-akhir 10%. Rasio pastinya akan berbeda untuk setiap tim, tetapi secara umum harus mempertahankan bentuk piramida. Cobalah untuk menghindari "formulir" berikut:

  • Kerucut piramida / es krim terbalik. Tim ini terutama mengandalkan tes ujung ke ujung, menggunakan beberapa tes integrasi dan sangat sedikit tes unit.
  • Jam pasir. Tim memulai dengan sejumlah besar unit test, dan kemudian menggunakan tes end-to-end di mana tes integrasi harus digunakan. Jam pasir memiliki banyak unit test di bagian bawah dan banyak tes end-to-end di bagian atas, tetapi beberapa tes integrasi di tengah.

Sama seperti piramida biasa cenderung menjadi struktur paling stabil dalam kehidupan nyata, piramida pengujian juga cenderung menjadi strategi pengujian paling stabil.

Pekerjaan


Jika Anda menyukai dan tahu cara menulis unit test, maka Anda dipersilakan! Perusahaan LANIT telah membuka lowongan untuk pengembang Java di tim DevOps, di mana Anda akan menemukan orang-orang yang berpikiran sama.

All Articles