Bagaimana saya mengutip pekerjaan dengan PHPUnit?


9

Saya telah melakukan pemrograman situs web selama 15 tahun dan PHP selama 5 tahun terakhir. Saya selalu menulis kode yang solid. NAMUN, saya punya klien yang bersikeras 80% dari kode yang diuji unit. Karena klien SELALU BENAR, saya berencana menggunakan PHP_CodeSniffer untuk memastikan kode saya terlihat benar dan PHPUnit melakukan pengujian unit saya. Saya berharap untuk belajar sesuatu melalui pengalaman ini.

Apakah ini alat yang tepat untuk digunakan? Berapa banyak waktu yang terlibat dalam mengatur PHPUnit dan menulis kode tambahan? Perlu waktu sekitar 8 minggu untuk menulis halaman web dan swa-uji seperti yang telah saya lakukan di masa lalu. Jika saya menambahkan 4 hari tambahan (10%) untuk pengujian unit (PHPUnit), apakah itu cukup? Pikiran? Saran? Terima kasih.


2
pengujian unit dapat menggandakan waktu pengembangan.

Anda bekerja dengan PHP 2.0? Bagus! Masukan saya tidak memenuhi syarat untuk jawaban, jadi singkatnya: Untuk pilihan alat, Anda benar tentang imho. Lihat saya mengambil kerangka pengujian php dan untuk phpcs saya bahkan tidak tahu apa alternatif. Untuk waktu menambahkan: Setelah melakukan TDD untuk beberapa waktu saya biasanya lebih lambat tanpa itu tetapi ketika saya memulai hal-hal tertentu terlalu lama lagi (+ 50%). Jika Anda menggunakan kerangka kerja yang membuat pengujian sulit (banyak hal statis) menambah lebih banyak lagi.
edorian

1
Ini akan meningkatkan pengembangan awal di muka, tetapi selama proyek 8 minggu, Anda akan menemukan itu membuat perbedaan lebih sedikit karena tes unit akan membantu Anda menemukan bug lebih awal dan lebih mudah.
Fenton

1
@Agon, agak, tetapi pengujian unit juga mempercepat pengembangan [ada jauh lebih sedikit dari penyebaran / tes / temukan \ memperbaiki siklus
monksy

Jawaban:


7

Dalam satu baris: itu tergantung bagaimana Anda bekerja. Saya sangat berpikir bahwa 10% terlalu sedikit. Setidaknya harus 25%, jika tidak 40%, jika tidak 60%, jika tidak lebih.

Pertama, saya sangat setuju dengan klien Anda di sana. Tes unit adalah bagian penting dari produk yang kuat, mudah dirawat, mudah didebug.

Saya akan berbicara dari apa yang saya tahu. Saya menggunakan TDD (Test-Driven Development) untuk sebagian besar proyek. TDD pada dasarnya membuat Anda menulis tes sebelum kode aktual. Mereka menetapkan seperangkat kriteria penerimaan yang harus dipenuhi oleh produk akhir. Biasanya, Anda akan menghabiskan 50% hingga 70% dari tes menulis waktu Anda, dan sisanya untuk menerapkan kode untuk membuatnya lulus.

Walaupun mungkin terdengar tidak masuk akal dan / atau luar biasa, saya dapat meyakinkan Anda bahwa itu tidak masuk akal. Inilah alasannya:

  • Anda akan dapat mengetahui apa pola arsitektur terbaik yang digunakan saat menulis tes. Dengan cara ini, ketika Anda memulai pengkodean, arsitektur aplikasi akan berubah minimal (karena kita semua tahu betapa mahalnya untuk mengulang arsitektur aplikasi).
  • Kode Anda hanya untuk membuat tes lulus (karena itu membuat produk akhir dapat diterima). Anda tidak akan menghabiskan waktu untuk memprogram fitur yang tidak berguna / di luar lingkup.
  • Dengan memiliki lebih sedikit kode (yaitu: hanya kode yang benar-benar Anda butuhkan), itu lebih rentan kesalahan. (Kode kurang = lebih sedikit kesalahan).
  • Jika Anda membuat kesalahan, dan Anda akan melakukannya, akan membutuhkan waktu lebih sedikit untuk mencari tahu mengapa ada masalah, dan di mana masalahnya. Jika tes ditulis dengan benar, itu berarti bahwa satu kesalahan akan menyebabkan kegagalan tunggal, bukan reaksi berantai. Dengan cara ini Anda dapat dengan mudah menentukan sumber masalah dalam hitungan menit, jika tidak dalam hitungan detik.
  • Akan membutuhkan waktu jauh lebih sedikit untuk mengimplementasikan kode aktual dengan tes unit. Begitu tes gagal, Anda tahu ada sesuatu yang salah. Anda tidak harus melakukan bolak-balik dengan klien untuk memperbaiki bug.
  • Anda pada akhirnya harus melakukan bolak-balik dengan klien untuk memperbaiki bug, karena tidak ada yang dapat menangkap 100% kesalahan. Namun, Anda dapat dengan mudah menangkap 95% jika tidak lebih.

PHPUnit adalah alat de facto untuk pengujian unit PHP, dan itu sangat bagus. Saya belum menggunakan PHP_CodeSniffer banyak. Namun, saya pikir jika Anda bekerja sendirian, Anda mungkin tidak membutuhkannya. Ini lebih berguna dalam tim untuk memastikan kode terlihat sama tidak peduli siapa yang mengkodekannya.


5

Alat untuk Anda karena memiliki sikap bahwa Anda akan belajar sesuatu dari pengalaman ini. Aku yakin kamu akan.

Hal pertama yang harus Anda pelajari adalah perlunya pengujian unit tidak ada hubungannya dengan seberapa berpengalaman Anda . Pengembang terbaik akan menjadi salah satu unit-penguji terbaik, juga:

Bill Venners: Anda mengatakan dalam buku Anda Refactoring: "Jika Anda ingin refactor, prasyarat penting adalah memiliki tes yang solid." Apakah itu berarti jika Anda tidak memiliki tes Anda tidak boleh refactor?

Martin Fowler: Anda harus menganggapnya berjalan di atas tali tanpa jaring. Jika Anda pandai berjalan di atas tali, dan tidak setinggi itu, maka Anda bisa mencobanya. Tetapi jika Anda belum pernah berjalan di atas tali sebelumnya, dan itu di atas Air Terjun Niagara, Anda mungkin menginginkan jaring yang bagus.

Dari http://www.artima.com/intv/refactorP.html

Saya biasa menulis PHP tanpa pengujian unit. Kemudian, setelah bertahun-tahun berlatih pengujian unit di Jawa, saya menemukan bahwa saya tidak dapat mengerjakan sesuatu yang jauh lebih rumit daripada halaman tunggal di PHP tanpa pengujian unit. Alasannya? Produktivitas . Tanpa pengujian unit, saya tidak dapat menolak dengan percaya diri - ini berarti bahwa baik A) saya harus merobohkan lebih banyak dan mengerjakan semuanya dari awal lagi, atau B) , saya harus berurusan dengan kode warisan yang jelek.

Ketika Anda mengajukan penawaran, apakah Anda perlu memperhitungkan waktu untuk menguji? Ya . Apakah tampak intuitif bahwa itu akan membutuhkan lebih banyak waktu? Ya, sekali lagi . Anda mungkin akan, karena beberapa jawaban lain telah memperkirakan kasar, perlu memperkirakan 50-100% lebih besar daripada tanpa tes unit.

Namun!...

  • Anda akan menangkap dan mengatasi lubang spesifikasi sebelumnya
  • Yang berarti Anda akan mengembangkan spesifikasi yang lebih bersih dan solid
  • Anda akan dapat merespons dengan cepat dan percaya diri terhadap perubahan spesifikasi
  • Anda akan memiliki lebih sedikit bug
  • Bug Anda akan ditangkap lebih cepat dan lebih mudah untuk diperbaiki

Dan sebagai hasilnya, perkiraan Anda akan lebih akurat . Jika Anda menagih per jam, Anda akan lebih mengesankan klien Anda dan dapat menaikkan tarif Anda. Jika Anda menagih tarif tetap, Anda akan menghasilkan lebih banyak uang per jam.

Tanpa pengujian, perkiraan Anda kemungkinan besar adalah omong kosong. Bug, perubahan-pesanan, dan redefinisi semuanya mengerikan untuk memperkirakan secara akurat. Pengujian adalah kunci untuk meminimalkan dampak ketiganya!


3

Tidak ada jawaban yang mudah untuk berapa lama Anda.

Tetapi sebagai aturan dasar, jika ini adalah proyek singkat: Saya akan mengatakan bahwa pengembangan bersama dengan pengujian unit yang baik akan memakan waktu 1,75-2 kali selama pengembangan tanpa pengujian unit. Untuk proyek yang lebih lama, mungkin 25-30%?

Saya sarankan untuk membuat unit test sebelum Anda menulis kode Anda. Diambil dengan cara ini, membangun perancah uji unit benar-benar menjadi bagian dari proses desain Anda, dan karenanya Anda tidak boleh menganggap bahwa Anda kehilangan waktu untuk pengujian unit, melainkan bahwa pembangunan unit test membantu Anda mendesain produk hebat dan keberadaan tes itu setelah Anda membuatnya membuatnya lebih mudah bagi Anda untuk memastikan bahwa itu tetap seperti itu. Harus menulis unit test terlebih dahulu adalah luar biasa dalam membantu untuk fokus pada persyaratan nyata, memberi kita cara yang jelas untuk menguji apakah kita sudah selesai (lulus unit test) dan membantu kita untuk "menguji awal dan sering menguji".

Sedangkan untuk PHPUnit .... Sudah lama sejak saya menggunakannya, kesan saya sangat kuat tapi mungkin perlu beberapa pekerjaan lagi sebelum benar-benar dipoles.

Namun, jika ada satu hal yang ingin saya komunikasikan di sini: Tolong jangan lihat Unit Testing sebagai formalitas belaka di akhir proyek Anda. Jika hanya itu, menurut saya, itu tidak berharga.


3

Jawabannya sejauh ini cukup menyeluruh sehingga saya hanya akan menambahkan satu poin yang tidak dibahas: waktu tambahan karena menggunakan PHPUnit akan

  1. lebih tinggi pada awalnya sejak Anda mempelajarinya, dan
  2. Turunkan waktu pengembangan non-tes saat Anda mendapatkan kepercayaan diri dengan itu.

Kelas model pengujian unit yang tidak berhubungan dengan presentasi cukup mudah. Anda menulis tes untuk setiap kelas, dan dalam kasus-kasus tes tersebut Anda dapat langsung instantiate dan mengkonfigurasi objek untuk menguji metode / fitur tertentu. Setelah Anda menyiapkan dan menjalankan PHPUnit, Anda akan dapat menjalankan tes ini dengan cepat.

Unit pengujian halaman web bisa lebih rumit. Jika Anda menggunakan Zend Framework, Symfony, Smarty atau mesin MVC lainnya, membuat PHPUnit dapat bermain dengan baik bersama mereka dapat membutuhkan waktu lebih lama. Kami menggunakan Zend Framework dan saya menghabiskan banyak waktu membangun kelas dasar untuk menguji pengontrol dan melihat skrip secara terpisah. Mengingat ukuran proyek ini, Anda mungkin lebih baik memulai dengan ControllerTestCase.

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.