Bagaimana Anda bisa menulis tes untuk Selenium (atau serupa) yang tidak gagal karena perubahan kecil atau kosmetik?

9

Saya telah menghabiskan minggu lalu belajar selenium dan membangun serangkaian tes web untuk situs web yang akan kami luncurkan. senang belajar, dan saya telah mengambil beberapa teknik lokasi xpath dan css.

masalahnya bagi saya, adalah melihat sedikit perubahan memecahkan tes - perubahan ke div, id, atau nomor autoid yang membantu mengidentifikasi widget merusak sejumlah tes - sepertinya sangat rapuh.

jadi apakah Anda sudah menulis tes selenium (atau yang serupa lainnya), dan bagaimana Anda menghadapi sifat rapuh tes (atau bagaimana Anda menghentikannya menjadi rapuh), dan tes apa yang Anda gunakan untuk selenium?

Sam J
sumber
Jika sedikit perubahan yang melanggar tes, maka tes tidak dijalankan setelah perubahan dibuat - yang merupakan inti dari tes. Juga, kesadaran pengembang tentang (keberadaan) tes tampaknya kurang.
talonx
1
@alonx - tidak cukup hanya menjalankan tes semacam ini, jika perubahan kecil menghasilkan perubahan besar pada suite maka itu akan menjadi masalah terlepas dari apakah itu dijalankan oleh pengembang, kotak ci atau penguji
FinnNk
@FinnNK: Setuju - perubahan kecil seharusnya tidak menghasilkan perubahan besar. Itu berarti kasus uji ditulis oleh seseorang yang tidak berhubungan dengan pengembang membuat perubahan - baunya seperti kesenjangan komunikasi.
talonx
@alonx: Tes UI pada dasarnya rapuh dan membutuhkan waktu lebih lama untuk dijalankan daripada tes unit. Mereka adalah tantangan khusus, jadi saya tidak akan langsung menarik kesimpulan tentang pengembang di organisasi Sam.
azheglov
2
Saya telah mengubah judul - semoga sedikit lebih representatif dari pertanyaan dan sedikit kurang negatif.
Jon Hopkins

Jawaban:

7

Tujuan Selenium adalah untuk membuat tes integrasi berbasis UI .

Tes integrasi memverifikasi bahwa semua komponen sistem Anda bekerja dengan benar ketika digunakan bersama. Tes integrasi bukan merupakan strategi pengujian yang memadai dan melengkapi strategi pengujian lainnya yang memiliki fokus berbeda, misalnya pengujian unit dan pengujian penerimaan .

Tes yang digerakkan oleh UI pada dasarnya rapuh, meskipun Selenium dan Watir adalah langkah maju dari masa awal alat rekam dan pemutaran . Ada beberapa cara untuk mengatasi masalah ini - inilah kompilasi saran dari beberapa pakar kelas dunia:

Jangan mencoba mendapatkan semua cakupan tes Anda dari jenis tes ini . Robert C. Martin berpendapat bahwa cakupan kode Anda dengan tes integrasi harus sekitar 20% . Sangat tidak praktis untuk menguji semua jalur eksekusi ketika input beberapa lapisan aplikasi pergi.

Dapatkan sebagian besar cakupan tes dari tes unit dan penerimaan . Cari tautan ke artikel Gojko Adzic di jawaban FinnNk . Adzic berulang kali berdebat tentang pengujian logika bisnis melalui tes penerimaan dan memintas UI.

Tetapi sejumlah tes berbasis UI masih perlu ditulis . Di sinilah Anda memerlukan saran praktis selain "jangan menguji logika bisnis Anda melalui UI." Saya akan merekomendasikan blog Patrick Wilson-Welsh sebagai titik awal.

azheglov
sumber
Tautan untuk patrickwilsonwelsh.com tidak lebih berfungsi, dan sumber daya lainnya untuk itu .. !!
MarmiK
4

Hal yang paling penting saat membuat tes seperti ini setelah Anda melewati angka sepele adalah ide perubahan simetris - perubahan kecil dalam kode harus menghasilkan perubahan kecil di ruang tes.

Sebagai contoh, katakanlah Anda mengumpulkan nama seseorang dengan dua kotak teks dalam 100 tes. Jika Anda menulis tes-tes itu secara niavely (atau mungkin menggunakan playback-record) maka Anda akan memiliki 100 tes untuk diubah. Jika sebaliknya Anda abstrak langkah 'masukkan nama' dan gunakan itu dalam tes Anda alih-alih langsung menggunakan selenium maka Anda hanya memiliki 1 tempat untuk melakukan perubahan. Ini akan tergantung pada konteks Anda berapa banyak lapisan abstraksi yang Anda gunakan - tetapi menggunakan abstraksi akan sangat membantu membuat tes Anda dapat dipertahankan.

Hal penting kedua adalah memastikan penyeleksi Anda didasarkan pada hal yang paling penting dan paling tidak mungkin berubah. Terkadang ini akan menjadi id atau kelas atau bisa juga berupa teks di dalam atau di sekitar elemen. Selalu lebih suka pemilih paling sederhana (misalnya id) tetapi kadang-kadang untuk mencapai ini Anda harus menggunakan sesuatu seperti xpath.

Gojko Adzic memiliki banyak nasihat hebat di blognya dalam hal pengujian semacam ini - lihat Sine of Death-nya dan cara menghindarinya secara khusus.

FinnNk
sumber
tips yang baik FinnNk - Saya telah mengabstraksikan metode umum (login, mencari widget sidebar dll) - sehingga kerusakan berkurang ketika tes berubah. Sayangnya kami menggunakan sistem kepatutan yang membuat beberapa widget, dan membuat id's untuk widget berdasarkan posisi mereka di dom, jadi setiap kali ada sesuatu yang dipindahkan, tes akan rusak.
Sam J
1
Biasanya Anda dapat menemukan beberapa cara mengidentifikasi elemen - mungkin beberapa teks yang mengandung elemen, atau mungkin selalu memiliki posisi relatif yang sama dengan sesuatu yang lain. Terakhir, sebagai upaya terakhir, Anda juga dapat menentukan strategi pelacak lokasi untuk elemen yang menggunakan selenium yang memberi Anda kontrol penuh (misalnya jika Anda mencari elemen dengan nama basis nama dan beberapa barang arbiter yang ditambahkan di akhir, seperti pada case atau dalam format web asp.net).
FinnNk
1

Pengujian memastikan bahwa kode berperilaku seperti yang diharapkan. Jika tes Anda rusak secara berkala, maka tes tersebut tidak menguji hal yang benar atau pengembang tidak peduli dengan tes tersebut.

Secara pribadi saya berpikir bahwa jika kehadiran <div>tag memecahkan tes maka tes tidak perlu tergantung pada tag sekitarnya, dan pendekatan yang lebih lunak harus diambil.


sumber