Bagaimana cara unit menguji situs formulir web?

26

Bagaimana cara unit menguji situs formulir web? Bagi saya sepertinya tergantung pada kondisi dan input pengguna, itu tidak layak.

Jika tidak layak, adakah alternatif otomatis yang valid?

Tom Squires
sumber
2
Jika Anda ingin pengujian antarmuka pengguna otomatis, maka Anda akan membutuhkan sesuatu seperti Selenium. Tetapi, jika Anda ingin pengujian unit otomatis , maka Anda tidak perlu Selenium. Anda hanya perlu pola yang tepat di tempatnya. Lihat jawaban saya.
Matius Rodatus

Jawaban:

22

Ya kamu bisa. Anda hanya harus berhati-hati untuk memisahkan masalah Anda dengan baik. Singkatnya, Anda harus menghapus semua logika Anda dari kode di belakang dan memasukkannya ke kelas lain.

Ada dua cara umum untuk melakukan ini.

Cara sederhana adalah memikirkan kembali semua penangan acara Anda dalam hal "Informasi apa yang diberikan sistem kepada saya? Informasi apa yang saya butuhkan untuk mengisi pada halaman?" dan kemudian menyediakan kelas layanan yang melakukan konversi itu.

Dalam hal ini, lapisan layanan harus tahu sedikit tentang sifat lapisan presentasi Anda. Anda masih harus mengambil data yang dikembalikan dari layanan dan mengisi komponen WebForm yang benar dalam kode-belakang Anda dan ini masih belum teruji (setidaknya dengan tes unit, Anda masih dapat menggunakan tes integrasi). Tapi ini jarang terjadi ketika kode salah, jauh lebih mungkin gagal dalam logika.

Cara yang lebih rumit, tetapi lebih efektif, adalah dengan menggunakan pola Model View Presenter . Ketika kami mencobanya, kami menemukan bahwa Presenter dengan cepat menjadi sangat cocok dengan kerangka kerja dan, semakin kami mengembangkan MVP, semakin jelas bahwa MVP benar-benar ingin menjadi MVC tetapi tidak bisa.

Yang mengatakan, orang lain telah melakukan ini dengan sangat sukses - bahkan ada kerangka webformsmvp tersedia untuk menghapus pengangkatan berat - sehingga jarak tempuh Anda dapat bervariasi.

pdr
sumber
1
@ jmoreno: Tangkapan bagus! Saya lupa WebForms dan MVP bahkan ada selama 5 tahun terakhir.
pdr
16

Jelas sekali, seluruh halaman formulir web bukanlah sebuah unit, dan dengan demikian tidak dapat diuji unit. Namun, ada beberapa hal yang dapat Anda lakukan untuk pengujian otomatis:

  • unit uji komponen individu halaman (metode apa pun yang melakukan logika aktual)
  • komponen unit test yang digunakan oleh halaman (kontrol khusus, logika bisnis yang mendasarinya, dll.)
  • pengujian fungsionalitas otomatis (dengan mengendalikan browser dari jarak jauh, atau mengirim permintaan HTTP melalui sesuatu seperti cURL)
  • pengujian penetrasi otomatis (ada alat yang akan mencoba menemukan kemungkinan titik injeksi, dan secara otomatis menjalankan serangan injeksi yang tidak berbahaya namun terdeteksi pada halaman Anda)
  • pengujian beban
  • memeriksa tata letak terhadap daftar kegunaan dan poin-poin gaya rumah (meskipun ini sangat sulit untuk diotomatisasi; biasanya lebih layak untuk melakukannya secara manual setiap sekarang dan kemudian)
tammmer
sumber
-1 Maaf tapi pengujian beban, pengujian penetrasi dan pemeriksaan tata letak tidak ada hubungannya dengan pengujian unit
Tom Squires
2
@ TomSquires: tentu saja tidak, dan jika Anda membaca jawaban saya dengan cermat, Anda akan melihat bahwa saya tidak pernah mengatakannya. Tetapi pertanyaannya tampaknya membingungkan konsep-konsep pengujian unit dan pengujian otomatis secara umum, itulah sebabnya saya mencantumkan berbagai tes otomatis yang bermakna yang dapat Anda lemparkan pada formulir web.
tdammers
setuju, menguji halaman web lebih cenderung berupa beberapa bentuk pengujian integrasi daripada pengujian unit dengan definisi yang ketat, meskipun masih bagus untuk mengotomatisasi apa pun yang Anda bisa
jk.
6
@ Tomquires: downvote benar-benar tidak dapat dibenarkan. Pertanyaan Anda sendiri dimulai dengan menguji seluruh situs, yang tidak ada hubungannya dengan pengujian unit. Tdammers mengidentifikasi berbagai cara untuk menguji keseluruhan dan bagian-bagiannya dan mengidentifikasi di mana pengujian unit cocok. +1
azheglov
3
Cukup adil. Saya ambil kembali
Tom Squires
9

Saya minta maaf karena melewatkan bagian "unit" dari pertanyaan ...

SeleniumHQ adalah teman Anda untuk tes dari ujung depan. Ini bukan tes unit, lebih seperti pengujian kotak hitam. Anda masih perlu memikirkan kasus uji yang valid ...

Warren Faith
sumber
1
+1 Jawaban Anda muncul ketika saya menekan "poskan jawaban Anda" untuk mengatakan hal yang persis sama.
yannis
2
Juga, karena op menanyakan tentang pengujian unit, mari kita tambahkan bahwa pertanyaan sebenarnya adalah pengujian fungsional (yang) lebih tepat (masuk akal, layak) ketika menguji elemen input pengguna.
yannis
+1 karena saya tetap ingin menggunakannya, tetapi tidak pernah berhasil. Adakah yang menggunakannya, apakah bagus dan layak diterapkan?
NimChimpsky
6
Selenium adalah alat yang fantastis tetapi tidak ada hubungannya sama sekali dengan pengujian unit.
pdr
Benar, sepertinya saya melewatkan informasi ini dalam pertanyaan: /
WarrenFaith
6

Berbicara dari pengalaman: Hanya jika dilakukan dengan benar. Yang dimaksud dengan "benar" adalah kode minimal di belakang dan sesuatu seperti Model-View-Presenter yang disebutkan di atas untuk membuat Web Form "bodoh". Ini biasanya terbukti sangat sulit dengan aplikasi brownfield karena mereka tidak dirancang dengan pemikiran ini dan itu adalah upaya yang hampir Hercules untuk refactor / menulis ulang halaman untuk menggunakannya.

Wayne Molina
sumber
1

watin

Saya menemukan tes web unit sangat berguna, bahkan jika itu hanya untuk memberikan gambaran umum tentang bug regresi atau untuk proyek baru.

Sejauh menyangkut keadaan, Anda membuat unit test seperti yang Anda lakukan dengan tes non-UI - mereka menghapus basis data pada awal pengujian dan membangun kembali basis data agar tidak mengandung apa pun kecuali keadaan awal. Setiap pengujian unit kemudian merangkum satu halaman, atau biasanya tugas yang berbeda pada satu halaman.

http://watin.org/ adalah alat uji web lain tetapi untuk C # /. NET. Anda menulis tes sebagai unit test:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Saat ini berbasis IE tetapi memiliki beberapa dukungan eksperimental untuk Firefox dan Chrome. Anda dapat mengotomatisasi apa pun yang akan Anda lakukan dalam tes manual, termasuk interaksi Javascript.

Chris S
sumber
Ack itu tahun 2016. Kunjungan hari ini ke situs WatiN menunjukkan kepada saya bahwa WatiN mungkin sudah mati. Dokumen jarang, tidak mutakhir, dan video tidak diputar. Saya tidak mengeluh - Saya sangat berterima kasih atas alat sukarela open source - komentar ini untuk membantu orang lain yang datang belakangan seperti saya. Jawabannya baik-baik saja, hanya menunjukkan bahwa memulai mungkin memerlukan pembelajaran langsung yang mandiri.
qxotk
1
Bantuan lebih lanjut bagi siapa pun yang memikirkan cara WatiN, konfirmasi itu stagnan + tempat mencari hari ini di sini: stackoverflow.com/questions/118531/…
qxotk
0

Anda tidak dapat benar-benar menguji unit situs web, hanya karena permintaan web terjadi pada kabel (atau melalui tumpukan TCP). Dengan demikian, tes tidak sesuai dengan definisi "tes unit", mereka mungkin, tes end-to-end.

Untuk tes semacam itu, Anda dapat menggunakan suite seperti Selenium yang menjalankan browser web di belakang layar. Satu kata peringatan: biasanya pengujian semacam ini sangat sulit dan tidak dapat diprediksi, karena ada banyak bagian yang bergerak!

Lebih menarik lagi, saya agak khawatir mengapa Anda perlu menguji formulir web sama sekali. Apakah Anda tidak menempatkan terlalu banyak logika dalam kode di belakang, dan kebetulan memiliki logika bisnis anemia?

Sklivvz
sumber
-1

Melati

Selama 5 tahun terakhir Jasmine telah muncul sebagai alat utama untuk pengujian unit front-end. Ini sering dimasukkan ke dalam pengujian build otomatis dengan Node dan npm

Per https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine adalah kerangka kerja pengujian sumber terbuka untuk JavaScript. [2] Ini bertujuan untuk berjalan pada platform apa pun yang mendukung JavaScript, untuk tidak mengganggu aplikasi atau IDE, dan untuk memiliki sintaks yang mudah dibaca. Ini sangat dipengaruhi oleh kerangka kerja pengujian unit lain, seperti ScrewUnit, JSSpec, JSpec, dan RSpec. [3]

Meskipun semua menyebutkan javascript juga dapat digunakan untuk pengujian unit formulir web biasa.

Michael Durrant
sumber
Sementara javascript digunakan dalam format web, ini bukan metode utama untuk memperbarui ui
Tom Squires
Benar. Namun alternatifnya adalah ...? Jadi itu sebabnya, meskipun tidak dimaksudkan untuk tujuan itu, Jasmine bekerja dengan sangat baik. Ditambah sintaksnya hampir identik dengan RSpec yang disukai programmer Ruby.
Michael Durrant
-2

ASP.NET

Saat mengembangkan situs ASP.NET kami dapat menjalankan tes unit pada:

  • Domain
  • Pengontrol / presenter BL
  • bagian belakang kode dari halaman Formulir Web

Dimungkinkan untuk TDD semua ini, tergantung pada arsitektur Anda. Satu-satunya hal yang Anda tidak dapat uji unit adalah tata letak file markup.

KeithS
sumber
3
Jawaban ini mengatakan "ya itu mungkin" untuk pertanyaan "bagaimana". Tidak sepenuhnya membantu.
RubberDuck