Apakah pengujian unit atau pengembangan yang digerakkan oleh pengujian bermanfaat?


48

Tim saya di tempat kerja pindah ke Scrum dan tim lain mulai melakukan pengembangan berbasis tes menggunakan tes unit dan tes penerimaan pengguna. Saya suka UAT, tetapi saya tidak dijual pada unit testing untuk pengembangan yang digerakkan oleh tes atau pengembangan yang digerakkan oleh tes pada umumnya.

Sepertinya menulis tes adalah pekerjaan ekstra, memberi orang kruk ketika mereka menulis kode asli, dan mungkin tidak terlalu efektif.

Saya mengerti bagaimana tes unit bekerja dan bagaimana menulisnya, tetapi adakah yang bisa mengatakan bahwa itu adalah ide yang bagus dan sepadan dengan usaha dan waktu?

Juga, adakah yang membuat TDD sangat baik untuk Scrum?


27
Jika Anda ingin memastikan bahwa perangkat lunak Anda sering rusak, kurang-lebih sepenuhnya tidak dapat dipelihara, dan harus diganti sebelum benar-benar siap untuk diproduksi; maka saya akan menyarankan Anda membuang pengujian unit sepenuhnya, dan tidak pernah meluangkan waktu untuk mempelajari TDD.
Dawood mengatakan mengembalikan Monica

3
Pikirkan tentang keinginan / kebutuhan akan refactor. Apakah Anda akan lebih percaya diri dalam benar-benar melakukan refactoring (dengan ukuran apa pun) dengan atau tanpa serangkaian unit test komprehensif untuk menangkap Anda ketika Anda secara tidak sengaja merusak sesuatu?
Marjan Venema

2
"Memberi orang kruk ketika mereka menulis kode nyata"? Tidak bisakah kebanyakan praktik terbaik dijelaskan dengan cara ini?
user16764

4
@ Davidvidallace: Ini adalah masalah pengembang tidak kompeten, bukan kekurangan TDD. Selain itu, bahkan ketika TDD digunakan secara luas, tidak memberikan jaminan bahwa perubahan yang Anda buat tidak merusak apa pun.
Coder

6
@NimChimpsky: Saya tidak punya negatif terhadap TDD, saya hanya tidak mengikuti hype. Ini memiliki sisi positifnya, dan juga negatif. Rasa aman palsu menjadi salah satunya.
Coder

Jawaban:


68

Jawaban Singkat: Benar-benar positif.

Jawaban Panjang: Tes unit adalah salah satu praktik paling penting yang saya coba dan pengaruhi di tempat kerja saya (bank besar, perdagangan fx). Ya mereka adalah pekerjaan ekstra, tetapi itu adalah pekerjaan yang membayar berulang kali. Tes unit otomatis tidak hanya membantu Anda benar-benar mengeksekusi kode yang Anda tulis dan tentu saja memverifikasi harapan Anda, tetapi mereka juga bertindak sebagai semacam anjing penjaga untuk perubahan di masa depan yang mungkin Anda atau orang lain lakukan. Kerusakan tes akan terjadi ketika seseorang mengubah kode dengan cara yang tidak diinginkan. Saya pikir nilai relatif dari unit test menurun berkorelasi dengan tingkat perubahan yang diharapkan dan pertumbuhan basis kode, tetapi verifikasi awal dari apa yang dilakukan kode membuatnya berharga bahkan ketika perubahan yang diharapkan rendah. Nilai tes unit juga tergantung pada biaya cacat. Jika biaya (di mana biaya kehilangan waktu / uang / reputasi / upaya di masa depan) dari cacat adalah nol, maka nilai relatif dari suatu tes juga nol; namun ini hampir tidak pernah terjadi di lingkungan komersial.

Kami umumnya tidak mempekerjakan orang lagi yang tidak secara rutin membuat unit test sebagai bagian dari pekerjaan mereka - itu hanya sesuatu yang kami harapkan, seperti muncul setiap hari. Saya belum melihat analisis manfaat biaya murni dari memiliki unit test (seseorang merasa bebas untuk menunjuk saya ke satu), namun saya dapat mengatakan dari pengalaman bahwa dalam lingkungan komersial, dapat membuktikan kode bekerja dalam sistem penting yang besar bermanfaat . Ini juga membuat saya tidur lebih nyenyak di malam hari karena mengetahui bahwa kode yang saya tulis terbukti bekerja (pada tingkat tertentu), dan jika itu berubah seseorang akan diberitahu tentang efek samping yang tidak terduga oleh bangunan yang rusak.

Pengembangan yang didorong oleh tes, dalam pikiran saya bukanlah pendekatan pengujian. Ini sebenarnya pendekatan desain / praktik dengan output menjadi sistem kerja dan serangkaian tes unit. Saya kurang religius tentang praktik ini karena ini adalah keterampilan yang cukup sulit untuk dikembangkan dan sempurna. Secara pribadi jika saya membangun sebuah sistem dan saya tidak memiliki ide yang jelas tentang cara kerjanya, saya akan menggunakan TDD untuk membantu saya menemukan jalan saya dalam kegelapan. Namun jika saya menerapkan pola / solusi yang ada, saya biasanya tidak mau.

Dengan tidak adanya bukti matematis kepada Anda bahwa masuk akal untuk menulis unit test, saya mendorong Anda untuk mencobanya dalam waktu yang lama dan mengalami sendiri manfaatnya.


5
Yang ingin saya tambahkan adalah bahwa pengujian unit juga membuat Anda berpikir tentang desain antarmuka Anda. Ketika Anda sampai pada bagian di mana Anda berpikir "bagaimana cara unit menguji metode pribadi?", Anda tahu itu mungkin antarmuka Anda yang salah.
TC1

1
"Saya mendorong Anda untuk mencobanya dalam waktu yang lama dan mengalami sendiri manfaatnya." Hanya mencobanya sekali saja sudah cukup bagi saya, manfaatnya tampak jelas.
NimChimpsky

1
+1 untuk "Kami umumnya tidak mempekerjakan orang lagi yang tidak secara rutin membuat unit test sebagai bagian dari pekerjaan mereka". Baru-baru ini saya harus menolak seorang kandidat yang di antara kekurangan lainnya menyatakan dengan sangat kuat bahwa dia tidak suka menulis tes otomatis karena itu hanya buang-buang waktu dan dia bisa menguji kodenya sendiri.
ftr

4
Anda tidak dapat membuktikan bahwa kode nontrivial berfungsi dengan cara apa pun yang relevan hanya dengan menggunakan tes otomatis. Dengan tes otomatis, Anda hanya dapat membuktikan bahwa kode tersebut lulus tes - jika tes mencakup 100% dari kasus penggunaan Anda, Anda mungkin memiliki "tingkat tertentu" mungkin, tetapi itu masih tidak berarti bahwa kode "terbukti bekerja". Untuk memiliki kemampuan nyata, Anda perlu en.wikipedia.org/wiki/Formal_verification - karena itu, Anda menggunakan istilah "terbukti" salah di sini.
vaxquis

1
@vquisquis ya, Anda benar tentang penggunaan istilah bukti. Tapi saya bertaruh bahwa kehadiran tes (atau praktik TDD) adalah bukti yang lebih baik dari sistem kerja daripada tidak adanya tes.
Rupjones

16

Kesalahan yang ditemukan sebelumnya lebih murah untuk diperbaiki daripada kesalahan yang ditemukan kemudian. TDD membantu Anda memverifikasi kebenaran sistem Anda. Anda berinvestasi sedikit lebih awal, tetapi mendapatkannya kembali nanti. Grafiknya agak dilebih-lebihkan, tetapi menunjukkan ide dengan baik.

masukkan deskripsi gambar di sini

Sumber Gambar


Apa yang anda maksud dengan tradisional ? Adakah yang bukan TDD?
Giorgio

Tampaknya grafik ini tidak didasarkan pada beberapa statistik nyata, itu hanya mewakili pengalaman satu orang yang menulis entri Blog ini pada tahun 2006. Bukannya saya mengatakan itu benar-benar salah, tetapi kenyataannya jauh lebih rumit.
Doc Brown

9

Apakah pengujian unit atau pengembangan yang digerakkan oleh pengujian bernilai sementara?

Ya itu . Paman Bob (Robert C Martin) memberi tahu dalam sebuah presentasi;

Bagi pengembang untuk membuktikan bahwa kodenya berfungsi lebih baik untuk menulis tes dan lulus daripada berteriak, bernyanyi atau menari tentang hal itu.

Dan karena Anda tidak akan menghapus tes, selama tes lulus, Anda yakin bahwa fungsionalitas berfungsi - masalah regresi diselesaikan.

Ada banyak hal yang tertulis di sana,

  1. Anda bertanggung jawab untuk membuat fitur itu berfungsi. Tulis ujian. Lakukan saja.
  2. Kapan mengganti Tes Unit dengan Uji Integrasi

Apakah SCRUM, pengujian unit, dan TDD terkait?

Segera, Ketika Anda adalah seorang master, Unit testingAnda akan dekat TDD. SCRUM tidak ada hubungannya dengan ini, tetapi seperti yang mereka katakan, hal-hal besar bercampur dengan baik, teknik-teknik pengembangan perangkat lunak ini bertambah menjadi tumpukan yang sangat baik , jika Anda belum mencobanya belum mencobanya.

Apakah ada sesuatu yang membuat TDD sangat baik untuk SCRUM?

Seperti yang saya katakan di atas, mereka membuat kombinasi yang baik ; Jika Anda menambahkan beberapa pengujian otomasi ke dalamnya, maka itu lebih istimewa .


8

Sepertinya menulis tes adalah pekerjaan ekstra, memberi orang kruk ketika mereka menulis kode asli, dan mungkin tidak terlalu efektif.

Pengujian unit memiliki nilai sebagai penopang. Ini mendukung upaya pengembangan Anda, memungkinkan Anda untuk mengubah implementasi Anda tanpa takut bahwa aplikasi Anda akan berhenti berfungsi sebagaimana diperlukan. Tes unit juga lebih dari sekadar penopang, karena memberikan Anda alat yang dapat digunakan untuk memvalidasi bahwa implementasi Anda sesuai dengan persyaratan.

Semua pengujian, apakah tes unit, tes penerimaan, tes integrasi, dan sebagainya, hanya seefektif orang yang menggunakannya. Jika Anda mendekati pekerjaan Anda dengan sembrono, tes Anda akan ceroboh, dan implementasi Anda akan mengalami masalah. Jadi mengapa repot-repot? Anda repot-repot menguji karena Anda perlu membuktikan kepada diri sendiri dan pelanggan bahwa perangkat lunak Anda berfungsi, dan tidak memiliki masalah yang dapat mencegah perangkat lunak tersebut digunakan. Ya, pengujian jelas merupakan pekerjaan ekstra, tetapi bagaimana Anda melakukan pengujian akan menentukan berapa banyak upaya yang Anda perlukan untuk memperbaiki bug setelah rilis, dan berapa banyak upaya yang diperlukan kode Anda untuk diubah dan dirawat.

Saya mengerti bagaimana tes unit bekerja dan bagaimana menulisnya, tetapi adakah yang bisa mengatakan bahwa itu adalah ide yang bagus dan sepadan dengan usaha dan waktu?

TDD, dan benar-benar metode apa pun yang mengharuskan Anda untuk menulis tes sebelum kode Anda mengambil pendekatan yang Anda lakukan di awal upaya sebagai uang muka pada hutang teknis di masa depan. Ketika Anda mengerjakan proyek ini, apa pun yang terlewatkan, atau tidak diimplementasikan dengan baik akan menimbulkan lebih banyak utang teknis dalam bentuk meningkatnya kesulitan pemeliharaan, yang secara langsung memengaruhi biaya masa depan dan persyaratan sumber daya. Pengujian di muka memastikan bahwa Anda tidak hanya telah berupaya untuk mengatasi utang teknis di masa depan, tetapi juga memastikan bahwa Anda menyandikan persyaratan Anda sedemikian rupa sehingga dapat diverifikasi hanya dengan menjalankan kode Anda. Tes pertama juga memberi Anda kesempatan untuk memvalidasi pemahaman Anda tentang domain masalah sebelum Anda berkomitmen untuk memecahkan masalah dalam kode, dan itu memvalidasi upaya implementasi Anda.

Ini benar-benar berujung pada upaya memaksimalkan nilai bisnis kode Anda. Kode yang sebagian besar belum diuji dan sulit dipelihara umumnya murah dan cepat dibuat, dan sangat mahal untuk dipelihara selama masa pakai produk setelah dirilis. Kode yang telah diuji secara menyeluruh pada tingkat unit umumnya lebih mahal untuk dibuat, tetapi biaya relatif sedikit untuk dipertahankan selama masa pakai produk setelah dirilis.

Juga, apakah ada sesuatu yang membuat TDD sangat baik untuk SCRUM?

TDD tidak secara khusus baik untuk metodologi tertentu. Ini hanyalah alat. Suatu praktik yang dapat Anda integrasikan ke dalam proses pengembangan Anda untuk membantu Anda mencapai hasil spesifik Anda. Jadi untuk menjawab pertanyaan Anda, TDD gratis untuk metode Anda, apakah itu SCRUM, atau pendekatan lainnya.


6

Orang-orang berpikir itu adalah usaha ekstra karena ini adalah kegiatan di muka. Apa yang Anda kehilangan waktu sekarang Anda dapatkan kembali nanti.

Alasan saya untuk pengujian unit juga meliputi:

Memberi Anda target: Anda tidak dapat menulis tes jika Anda tidak tahu apa yang harus dilakukan perangkat lunak. Ini membantu menghilangkan masalah dalam spesifikasi lebih awal daripada nanti.

Memberi Anda rasa kemajuan.

Memperingatkan Anda jika suatu perubahan kode mengubah output dari area kode lainnya. Itu membuat refactoring lebih mudah.

Memberikan lapisan dokumentasi tambahan (terutama jika Anda mengomentari tes dengan benar).

Mendorong semua jenis praktik yang baik. Karena tes harus berjalan cepat, tes ini mendorong Anda untuk menulis kode yang dipisahkan dan mendukung ejekan. Ini semua membantu refactoring.

Ada yang lain juga dibahas dalam posting lain di utas ini. Itu sangat berharga.


2

Apakah pengujian unit atau pengembangan yang digerakkan oleh pengujian bermanfaat?

Jelas ya (lihat jawaban lain)

[Apakah] benar-benar ide yang bagus dan sepadan dengan usaha dan waktu?

  • Ya jika Anda memulai sesuatu yang baru (tambahkan modul baru atau aplikasi yang sama sekali baru)
  • Tidak jika sudah ada banyak kode yang sudah ada yang tidak dikembangkan test-driven dan yang harus diperpanjang (warisan).

Menurut pendapat saya pengembangan yang digerakkan oleh tes paling efektif jika Anda menulis unit test sebelum kode aktual. dengan cara ini kode yang memenuhi tes menjadi jelas dipisahkan dengan minimum referensi eksternal yang mudah diuji.

Jika kode sudah ada tanpa tes unit di sana biasanya banyak pekerjaan tambahan untuk menulis tes unit setelah itu karena kode itu tidak ditulis untuk pengujian mudah.

Jika Anda melakukan TDD kode secara otomatis mudah diuji.


2

Biarkan saya mendekati ini dari sisi lain. Apa yang terjadi ketika Anda mengembangkan aplikasi non-sepele tanpa tes unit? Jika Anda memiliki departemen QA yang baik, salah satu hal pertama yang akan terjadi adalah Anda akan menemukan bahwa Anda memiliki banyak masalah yang dilaporkan. Mengapa karena Anda tidak menguji apa yang Anda lakukan dan menganggapnya akan berhasil dan karena Anda tidak terlalu memperhatikan persyaratan dan aplikasi Anda tidak memenuhinya. Oops kembali ke papan gambar untuk menulis ulang dan memperbaiki. Sekarang Anda telah melakukan perbaikan dan menemukan serangkaian masalah baru karena Anda tidak memiliki cara untuk memverifikasi bahwa perbaikan Anda tidak mempengaruhi hal lain sebelum Anda mendorong ke QA. Tenggat waktu Ups sekarang telah datang dan pergi dan manajemen menjadi kesal.

Situasinya lebih buruk jika Anda tidak memiliki departemen QA yang baik karena pengguna akan menemukan bug dan tidak hanya akan membuat bos Anda tidak senang, itu dapat membuat lingkungan produksi berlutut dan 100-an atau bahkan ribuan orang akan berada di macet saat Anda memperbaiki bug yang pengujian unit akan dicegah. Ini BUKAN pilihan karir yang baik.

Sekarang anggaplah pendekatan koboi ini berlangsung selama bertahun-tahun? Sekarang setiap perubahan, bahkan yang sepele, tampaknya memunculkan masalah baru yang tidak terduga. Tidak hanya itu, tetapi banyak hal yang ingin Anda lakukan untuk membuat aplikasi berfungsi lebih baik, Anda tidak dapat melakukannya karena terlalu berisiko atau terlalu mahal atau keduanya. Jadi Anda menempatkan tambalan pada tambalan membuat sistem semakin berbelit-belit dan buggier dan lebih sulit untuk digunakan.

Pengguna mulai mempertanyakan perkiraan waktu Anda karena mereka terus menjadi lebih besar dan lebih besar dan sulit untuk menjelaskan kepada mereka bahwa sistem telah menjadi kekacauan yang rumit, sulit untuk menemukan di mana bahkan melakukan perubahan dan lebih sulit lagi untuk memastikan mereka tidak t memecahkan sesuatu yang lain.

Saya bekerja di tempat seperti ini di mana setelah sepuluh tahun pengembangan, hampir tidak ada yang ingin kami lakukan untuk memperbaiki masalah nyata yang bisa dilakukan karena kami tidak bisa memastikan mana dari ratusan aplikasi klien yang dapat dipecah. Pengembang awal adalah sangat banyak "unit test, kita tidak perlu ada unit tes bau" jenis pengembang. Setiap orang yang mengikuti mereka menderita karena rabun dekat.

Tanpa tes unit, perangkat lunak lebih bug dan membutuhkan waktu lebih lama untuk awalnya dikembangkan dan dipelihara. Kenapa kamu tidak ingin melakukan unit test? Waktu yang Anda habiskan untuk menulis tes akan jauh lebih sedikit daripada waktu yang Anda habiskan untuk memperbaiki masalah yang seharusnya Anda temukan sebelumnya (semakin cepat bug ditemukan semakin sedikit waktu yang diperlukan untuk memperbaiki) dan masalah yang akan Anda hindari sama sekali dengan menulis tes pertama yang memberikan pemahaman yang lebih baik tentang persyaratan sebelum Anda memulai pengkodean.


1

Semua kode yang Anda tulis perlu diuji di beberapa titik. Anda tidak ingin menulis semuanya sekaligus dan kemudian tekan tombol kompilasi dan silangkan jari Anda. Anda menulis dan menyusun blok kecil dan mengirim input yang dibuat dengan hati-hati di kode Anda untuk memverifikasi bahwa itu melakukan apa yang Anda pikirkan. Kemudian, Anda biasanya menghapus peralatan pengujian ad-hoc Anda dan beralih ke komponen berikutnya.

Dengan pengujian unit, ini menyederhanakan proses ini dan memberi Anda alasan untuk mempertahankan tes Anda. Dengan begitu jika Anda membuat perubahan apa pun yang merusak hal-hal yang telah Anda uji di masa lalu, Anda dapat menangkap regresi itu secara eksplisit alih-alih membiarkannya memengaruhi bagian lain dari kode Anda. Ada nilai nyata dalam hal itu.

Adapun pendekatan red-green-refactor ke TDD, saya menemukan itu agak membosankan. Tetapi untuk masing-masing miliknya.


1
Untuk 2c saya: Untuk mengetahui apakah tes Anda benar-benar berfungsi, Anda harus melihatnya gagal sebelum Anda melihatnya lulus. Saya sedih menyaksikan banyak pengembang menulis tes yang tampaknya berfungsi, namun ketika kondisi pengujian diubah, kode masih akan lulus tes, meskipun seharusnya gagal. Jika tes gagal pertama dan lulus kedua, maka kemungkinan besar Anda telah menulis tes tanpa kesalahan. Jika Anda akhirnya memodifikasi tes setelah kode berubah, maka Anda tidak dapat memastikan bahwa kode tersebut benar. Ya itu membosankan, tapi punya peluang lebih baik untuk menjadi benar. :-)
S.Robins

0

Sebagian besar waktu saya menemukan pengembang tangguh terhadap gagasan menulis tes. Bukan karena mereka akan berdebat bahwa tes tidak memiliki nilai, melainkan bahwa itu hanyalah sarana untuk mencari tahu bagaimana menyelesaikan masalah tertentu. Biasanya masalah ini berubah berdasarkan konteksnya. Setelah itu dilakukan maka tes tidak ada gunanya dan mungkin juga dihapus. Berikut adalah contoh konteks yang telah diberikan oleh rekan saya di masa lalu tentang cara memutuskan kapan harus menulis tes dan Anda akan menemukan satu-satunya jawaban yang mungkin menurut mereka tidak pernah:

  • masalah yang dihadapi harus menjadi contoh buku teks untuk TDD seperti tumpukan atau kalkulator
  • kode sepele tidak boleh diuji (membatalkan argumen sebelumnya)
  • kode kritis atau sulit harus diuji secara menyeluruh (tersirat oleh argumen sebelumnya)
  • tes tidak boleh digabungkan dengan implementasi untuk memungkinkan dilakukannya sweeping ulang (membatalkan argumen sebelumnya)
  • pengujian untuk efek samping seperti memanggil layanan pihak ketiga dengan muatan spesifik tidak diperlukan (jadi tidak ada pengujian kotak hitam)

Sebenarnya ada satu jenis pengujian yang saya temukan secara umum diterima dan yang saya percaya pada akhirnya tidak berguna. Yaitu pengujian berbasis GUI seperti dengan menggunakan selenium, webdriver, watir atau arquillian. Ini adalah bagaimana kita mendapatkan siklus build 7 jam daripada siklus build 5 menit pada proyek TDD saya.

Para dev yang sama ini biasanya mengeluh kepada orang lain betapa buruknya kode itu dan betapa tidak kompetennya dev sebelumnya. Mereka juga merasa sangat penting bagi Anda untuk membuat desain yang tepat menggunakan papan tulis, kantor MS, atau wiki dan berhati-hati untuk memastikan desain ini tetap mutakhir.

Yang terakhir itulah yang benar-benar membuat saya sadar bahwa devs seperti itu adalah penipu. Kita semua tahu dokumen desain apa pun yang bukan unit test akan menjadi usang dan tidak akan diperbarui karena biaya pemeliharaan semata-mata untuk melakukannya. Bahkan saya sudah mencoba dan mencoba untuk menghasilkan sarana yang baik untuk mengekspresikan ide-ide desain dalam format MS office yang berguna dan dapat dibaca baik sebelum dan sesudah fakta penulisan kode. Saya gagal dalam semua kasus dan meskipun ada orang yang berhasil menghasilkan dokumen MS office yang terlihat cantik, saya tidak pernah benar-benar menemukan yang berguna juga.

Jadi, Anda punya pilihan. Anda dapat melakukan desain dan dokumentasi dengan mempraktikkan TDD yang merupakan satu-satunya metode yang diketahui dan terbukti untuk menghasilkan dokumentasi tersebut berdasarkan 10 tahun pengalaman pengembangan saya. Atau Anda bisa terjun ke dunia politik.


1
tes bukan dokumentasi. TDD adalah praktik yang baik, tetapi terlalu sering dev menggunakan alat gen otomatis yang memuntahkan bertopik tes yang terlalu disederhanakan. Jika Anda memiliki dev yang tahan terhadap ini, alih-alih menulis tes berbutir halus, cobalah menulis test harness yang lebih besar yang melatih lebih banyak seluruh produk. Mereka akan menemukan itu jelas berguna. Anda masih harus menulis dokumentasi yang tepat, tidak ada jalan keluar dari itu.
gbjbaanb

@ gbjbaanb: jika pengembang menggunakan alat auto-gen, mungkin ada penulisan unit test, tapi jelas bukan TDD. Dalam TDD Anda seharusnya menulis tes sebelum metode. Anda tidak dapat mengotomatiskan scafolding dari pengujian metode yang belum ada. Juga tes tertulis dengan baik adalah dokumentasi (dokumentasi teknis untuk sesama pengembang proyek, bukan persyaratan maupun manual pengguna). Tes unit yang ditulis dan dipelihara dengan baik menunjukkan kepada Anda bagaimana metode harus menjadi tes. Dan jika tes secara teratur diperiksa dan berhasil mereka jelas lebih akurat daripada dokumentasi usang. Anda tidak dapat menyangkal hal itu.
Kriss

unittests bisa menjadi dokumentasi pengembang yang sangat baik karena mereka menunjukkan contoh bagaimana api dapat digunakan.
k3b

Inti dari selenium, webdriver, dll. Adalah bahwa Anda tidak perlu QA situs web secara manual. Jadi Anda tidak menghemat waktu dengan menghapusnya dari proses build Anda, karena mereka sendiri dimaksudkan untuk menghemat waktu.
Muhd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.