Apakah BDD (Behaviour Driven Development) digunakan dalam game?

9

Saya telah membaca tentang BDD - Behaviour Driven Development untuk sementara waktu, dan saya merasa sangat mudah dan berguna untuk mengubah fitur menjadi kode. Pengguna BDD sering menyebutnya TDD dilakukan dengan benar.

BDD adalah alat untuk desain perangkat lunak, dari luar ke dalam, dari nilai bisnis (atau nilai gameplay) ke kode.

Dan North memperkenalkan BDD

Apakah Anda tahu sumber daya apa pun tentang BDD dan Game selain ini ?

MarcoTmp
sumber
Sepertinya adaptasi dari TDD, dan karena itu tautannya cukup duplikat.
Bebek Komunis
Karena BDD adalah proses yang terorganisir dengan baik untuk melakukan TDD, saya ingin tahu apakah seseorang menggunakannya, dan apa pengalamannya.
MarcoTmp
Bukankah pertanyaan itu menjawab pertanyaan Anda?
Bebek Komunis
Tidak juga, karena saya masih tidak tahu bagaimana orang lain menggunakan BDD dalam game.
MarcoTmp
Saya masih merasa pada dasarnya TDD tampil dengan gaya yang berbeda.
Bebek Komunis

Jawaban:

14

Mungkin aman untuk mengatakan bahwa BDD, seperti TDD, atau (masukkan paradigma-kata kunci pengembangan yang trendi di sini) digunakan oleh beberapa pengembang game di suatu tempat, tetapi mereka mungkin tidak tahu apakah itu BDD atau tidak akan mampu mengidentifikasi arti sebenarnya dari BDD. . Pertanyaannya adalah benar-benar berapa banyak mereka menggunakannya dan berapa banyak yang mereka harus menggunakannya untuk itu untuk peduli kepada Anda?

Misalnya, tempat saya bekerja, semua nama unit test kami adalah "kalimat" seperti yang Dan North sarankan dalam artikel yang Anda tautkan. Itu saja tidak cukup untuk mengatakan bahwa kami menggunakan BDD, tentu saja, tapi mungkin itu yang benar-benar Anda pedulikan?

Fokusnya, menurut saya, tidak boleh pada kata kunci mana yang Anda terapkan di studio, melainkan pada produktivitas dan teknik proses pengembangan yang Anda terapkan secara keseluruhan. Saya menemukan bahwa tim yang paling produktif adalah teknik pencampuran dan pencocokan dari berbagai "paradigma kata kunci" daripada melakukan, secara dogmatis, untuk setiap bit doktrin yang kaku, beberapa studi internet mengatakan terdiri dari satu paradigma-kata kunci tertentu.

Saya melihat ini paling sering dengan tren Agile: tim yang mengidentifikasi diri mereka sebagai "Agile melakukan" cenderung lebih tidak fleksibel (ironisnya) tentang proses daripada tim yang secara organik menggabungkan bit Agile yang masuk akal bagi mereka. Mantan tim hampir selalu berakhir menjadi kurang produktif, menurut pengalaman saya.

Sebuah tim pengembangan terdiri dari manusia, yang bukan roda penggerak yang dapat dipertukarkan dalam sebuah mesin. Mereka beroperasi secara unik sebagai individu dan sebagai kombinasi unik dari diri mereka sendiri. Cara untuk pengembangan yang efektif bukanlah dengan membengkokkan manusia Anda ke dalam cetakan {BDD, Agile, WhateverIsNext} tetapi untuk secara konstan menilai kembali bagaimana tim berkembang dan menopang kekurangan dalam proses, mengganti teknologi yang rusak, dan memperkuat hal-hal yang kerja. Singkatnya, untuk fokus pada pengiriman judul dan bukan pada "menjadi Agile (atau apa pun)."


sumber
Tentu saja saya harus mencatat bahwa semua yang saya miliki adalah bukti anekdotal di sini, sesuai dengan komentar saya tentang keterkaitan antara berpegang teguh pada proses dogma dan produktivitas. Ini hanya pengalaman saya dan bukan studi ilmiah.
1
-1. Terima kasih atas pendapat anda Mau menjawab pertanyaan?
Jess Telford
+1, jawaban yang bagus. @JoshPetrie Apakah penggunaan menggunakan setidaknya kadang-kadang TDD atau apakah Anda mengukur cakupan tes? Cukup menarik keadaan pengujian pengembang di game dev.
Ilya Ivanov
1

Apakah itu? Mungkin. Pendapat saya adalah bahwa itu akan membuat sangat tidak cocok untuk perangkat lunak hiburan pada umumnya, meskipun mungkin bekerja dengan baik untuk perpustakaan tingkat rendah.

EDIT: Inilah beberapa justifikasi untuk pendapat saya.

Wikipedia mendefinisikan BDD sebagai teknik yang "mendorong kolaborasi antara pengembang, QA dan peserta non-teknis atau bisnis dalam proyek perangkat lunak." Ini sudah terdengar seperti ide yang buruk karena permainan berbeda dari sebagian besar perangkat lunak karena mereka tidak dirancang sebagai alat untuk memenuhi kebutuhan spesifik untuk 'peserta non-teknis atau bisnis', tetapi merupakan karya kohesif yang dirancang secara luas untuk menghibur. Ada penekanan pada "perilaku perangkat lunak yang diinginkan" tetapi game jarang memiliki 'perilaku perangkat lunak yang diinginkan' kecuali pada tingkat teknis. Pasti ada gunanya memeriksa bagian kode itu, tetapi tidak dengan pengguna akhir, karena mereka tidak akan pernah melihatnya.

Tapi mari kita asumsikan bahwa Anda ingin membuang barang-barang pemangku kepentingan manusia dan hanya menggunakan BDD untuk menegakkan kontrak antara modul kode yang berbeda, yang sejauh yang saya bisa lihat tidak jauh berbeda dari pengembangan yang digerakkan oleh tes normal, yang saya juga anggap buruk. cocok untuk gim, karena alasan berikut.

Tes berguna untuk memeriksa bahwa peristiwa terpisah terjadi ketika diharapkan. Ini bekerja dengan baik dalam pemrograman yang digerakkan oleh peristiwa, yaitu. sebagian besar dunia perangkat lunak, di mana tindakan dilakukan, beberapa output dihasilkan, dan kemudian Anda hanya memverifikasi bahwa tindakan dan hasilnya cocok. Namun, perangkat lunak game biasanya merupakan simulasi, di mana suatu tindakan tidak memiliki hasil yang terpisah tetapi perubahan terus-menerus di negara dunia. Jika pemain saya yang tersembunyi mengeluarkan suara, saya mungkin ingin memeriksa apakah AI memburu saya. Jadi, saya bisa membuat tes untuk memastikan bahwa AI dalam keadaan 'berburu' setelah kebisingan dibuat, dan itu hebat. Tapi bagaimana saya tahu perburuan itu berhasil? Anda tidak dapat memeriksanya secara instan - Anda hanya dapat mengamatinya seiring berjalannya waktu.

Selain itu, pendekatan pengujian pertama dapat menciptakan rasa aman palsu, dan membuat orang percaya kode lebih baik daripada yang sebenarnya.

def check_dice_roll_in_range():
    d = new Dice()
    assert(d.roll() between 1 and 6)

class Dice:
    def roll():
        return 4

Karena hasil tes dapat memberikan hasil positif palsu, Anda tidak pernah bisa lepas dari kebutuhan dasar untuk memeriksa kode itu sendiri. Tetapi jika kode itu sendiri diperiksa secara memadai, tes ini mengambil kepentingan sekunder. Inilah sebabnya, menurut pendapat saya, tes terbaik digunakan setelah acara, untuk menguji perbaikan bug.

Saya tidak akan berdebat bahwa tidak pernah ada manfaat dalam pengujian itu, ketika objek X dan Y bekerja bersama, hasil yang Anda dapatkan adalah seperti yang diharapkan. Masalahnya adalah apakah Anda menggunakan cara paling efektif untuk memverifikasi ini. Metode dapat mencakup verifikasi formal, tinjauan kode, metode uji-pertama, metode uji-terakhir, pengujian kotak hitam QA tradisional, atau cukup menggunakan kode seperti yang diharapkan dan mengamati hasilnya. Dua opsi terakhir secara mengejutkan efektif sebagian besar waktu, karena meskipun terdengar seperti mereka kurang keras, sebagian besar bug ditemukan selama penggunaan khas, dan memahami bug dalam konteks alaminya kadang-kadang bisa lebih mudah daripada memahaminya dalam tes buatan memanfaatkan. Selain itu,

Jadi, secara ringkas, saya pikir pengembangan yang digerakkan oleh tes belum tentu merupakan pilihan yang bagus untuk perangkat lunak, bahwa tes saja tidak pernah cukup untuk memastikan kualitas perangkat lunak (dan dengan demikian waktu yang dihabiskan untuk menulisnya harus dibandingkan dengan penggunaan alternatif pada waktu pengembang itu), bahwa permainan adalah pertandingan yang sangat buruk untuk kasus pengujian otomatis, dan bahwa permainan tersebut sangat cocok untuk metode pengembangan yang terlihat menekankan 'nilai bisnis' dan 'pengujian penerimaan'.

(Semoga itu adalah jawaban yang lebih baik, bahkan jika Anda tidak setuju dengan poin saya.)

Kylotan
sumber
-1 dari saya juga; jika ada, BDD lebih cocok untuk game daripada untuk hal-hal lain. Bahkan lebih alami untuk menentukan perilaku karakter sebagai respons terhadap input daripada menentukan perilaku layanan web sebagai respons terhadap pesan XML yang diberikan.
BlueRaja - Danny Pflughoeft
1
Perangkat lunak hiburan masih perangkat lunak, bukan?
Prusswan
Variasi pendapat yang baik dari para ahli sangat berharga, IMHO. Setiap orang memiliki lencana perwakilan pada jawaban mereka, sehingga pembaca dapat menyusun seberapa besar untuk menimbang pendapat ketika diambil bersamaan dengan sisanya diposting untuk pertanyaan tertentu.
Nate
1
Saya mendukung -1 saya, dan ingin menanggapi beberapa dari apa yang telah dikatakan: collaboration between developers, QA and [users] [...] sounds like a bad idea - games rarely have 'desired software behaviour'- ya mereka lakukan: mereka harus menyenangkan. Cara terbaik untuk mengetahui apakah permainan Anda menyenangkan adalah dengan mendengarkan playtesters. Pengembang sering dibutakan oleh kreasi mereka (atau oleh kesulitan teknis) pada kenyataan bahwa permainan mereka tidak menyenangkan. Playtester non-pengembang tidak memiliki masalah ini.
BlueRaja - Danny Pflughoeft
2
Adapun pengujian: jika itu adalah bagaimana Anda menulis tes, maka Anda melakukannya dengan sepenuhnya salah. Ex. untuk menguji Dice, Anda akan melewatkan objek acak tiruan , dan pastikan Roll()mengembalikan nilai yang benar. Anda menggunakan teknik yang persis sama untuk menguji simulasi (video game) yang Anda lakukan untuk menguji aplikasi normal. Tes unit hanya dapat menguji unit - jadi Anda benar bahwa "tes saja tidak pernah cukup untuk memastikan kualitas perangkat lunak" (itulah sebabnya QA masih ada). Tapi itu tidak berarti mereka kurang berguna untuk gim video.
BlueRaja - Danny Pflughoeft
1

Saya pikir BDD cocok di setiap lingkungan. Seperti yang disebutkan orang lain Anda sedang mengembangkan perangkat lunak dan sebagai hasilnya Anda harus mengujinya. Saya suka bdd untuk beberapa semantik acak yang disebutkan seperti nama tes sebagai kalimat. Saya juga suka mengelompokkan tes tertentu bersama-sama sambil masih bisa menguji 1 kelas.

Untuk memerangi pesan lain di sini, saya ingin menunjukkan bahwa pada proyek yang lebih besar, JAUH lebih sulit untuk membuat ulang kode tanpa tes. Jika Anda refactor beberapa kode Anda terbang buta apakah semuanya akan meledak dalam nyala api kemuliaan atau tidak. Tes membantu Anda menangkap sesuatu lebih awal. Jadi Anda menulis tes Anda, gagal, kode hanya cukup untuk lulus dan melanjutkan. Ketika Anda refactor Anda harus melakukan hal yang sama, tetapi alih-alih menulis Anda merevisi tes. Dalam kebanyakan kasus Anda menjalankan tes itu akan gagal, Anda pergi mengubah apa yang Anda pikir harus berubah dan MASIH gagal. Pada titik mana Anda menyadari bahwa beberapa kode lain bergantung pada fungsi / metode ini dengan cara yang sama sekali berbeda. Anda kemudian dapat memperbaiki tes Anda dan kode yang dihasilkan. Tanpa semacam cakupan kode Anda akan tersandung selama berhari-hari mencoba menemukan di mana barang rusak,

Bacalah tentang "Kontrak" dalam buku Program Pragmatis. Pengujian membantu Anda mencapai kontrak kode. Kode ini tidak X dan tidak lebih dari X dan jangan berharap untuk melakukan apa-apa tentang Y atau mencoba untuk menyesuaikannya untuk melakukan Z. Ini memastikan kebersihan kode dan mengharapkan semua orang untuk tidak menjadi kontol dan mengeruhkan basis kode.

Ada lebih banyak alasan untuk BDD. Yang utama bagi saya adalah bahwa saya akan melakukan jumlah pengujian yang sama untuk memvalidasi asumsi saya jadi saya mungkin juga memformalkannya.

Pada titik "bagaimana" itu sangat tergantung pada lingkungan Anda. Saya sedang menulis game java sekarang dan menggunakan robolectric. Anda harus selalu berusaha untuk "mengharapkan" sesuatu. Saya pernah mendengar bahwa mata-mata / cemoohan / rintisan tidak berguna karena Anda harus memiliki yang setara di sisi lain, tetapi kadang-kadang Anda tidak punya pilihan terutama dengan API. Anda dapat mengasumsikan bahwa sisi lain dari API tidak buruk dan biasanya kode Anda yang menyebalkan.

Jika misalnya Anda menguji pergerakan. Anda harapkan ketika "Atas" ditekan bahwa pengguna bergerak maju dengan beberapa pengukuran.

Jika misalnya Anda menguji rendering grafis ... yah jangan terlalu banyak menguji karena Anda benar-benar melakukan itu? Kerangka uji yang baik mungkin menangani bagian ini untuk Anda. Refleksi bukanlah hal super sepele yang saya katakan untuk hal-hal semacam ini. Anda mungkin perlu memeriksa buffer dll. Saya hanya cukup memeriksa apa yang sebenarnya Anda lakukan. Karakter ada di sini, sekarang dia ada di sana setelah beberapa tindakan.

Anda harus memiliki banyak fungsi / tes kecil kecil dan bersama-sama mereka akan menyimpulkan sesuatu yang bermanfaat.

Parris
sumber
Oh yang terakhir, saya perhatikan banyak orang yang kebetulan mendapatkan perilaku yang benar saat menyusun game / grafik. Pengujian agak mencegah efek "itu hanya berfungsi". Jauh lebih sulit untuk TAHU bagaimana persamaan Anda akan memengaruhi banyak hal daripada hanya menyalin beberapa kode dan membuat asumsi.
Parris
BDD tidak hanya tentang pengujian, tetapi juga melampaui itu.
Daniel
0

Saya merasa ada kesalahpahaman tentang apa itu BDD. BDD bukan teknik atau proses PENGUJIAN. BDD adalah model dan proses pengembangan. Ini melampaui WAY pengujian dan melampaui pemrograman.

Karena itu, saya tidak tahu ada studio AAA besar yang bekerja dengan model ini (saya punya teman yang bekerja untuk beberapa dari mereka di seluruh dunia sebagai programmer). Seperti yang ditunjukkan orang lain, mungkin beberapa manajer proyek atau tim di suatu tempat menggabungkan beberapa praktik yang mencakup BDD, tetapi saya tidak tahu ada studio yang menerapkan BDD murni (dari definisi nilai bisnis, hingga spesifikasi dengan contoh, ke penulisan file fitur, untuk memvalidasinya dengan pemegang saham, untuk mengotomatisasi file fitur sebagai tes).

Daniel
sumber