Bilakah anda menulis kod "sebenar" dalam TDD?

johnny 08/19/2017. 11 answers, 20.464 views
tdd

Semua contoh yang saya baca dan dilihat pada video latihan mempunyai contoh mudah. Tetapi apa yang saya tidak lihat sama ada saya melakukan kod "sebenar" selepas saya mendapat hijau. Adakah ini bahagian "Refactor"?

Sekiranya saya mempunyai objek yang agak rumit dengan kaedah yang kompleks, dan saya menulis ujian saya dan minimum untuk membuatnya lulus (selepas itu pertama gagal, Merah). Bilakah saya kembali dan menulis kod sebenar? Dan berapa kod sebenar yang saya tulis sebelum saya menggunakan semula? Saya meneka yang terakhir adalah lebih intuisi.

Edit: Terima kasih kepada semua yang menjawab. Semua jawapan anda sangat membantu saya. Nampaknya ada idea yang berbeza mengenai apa yang saya bertanya atau keliru tentang, dan mungkin ada, tetapi apa yang saya bertanya, katakan saya mempunyai permohonan untuk membina sebuah sekolah.

Dalam reka bentuk saya, saya mempunyai seni bina yang saya ingin mulakan, Kisah Pengguna, dan sebagainya. Dari sini, saya mengambil Kisah Pengguna tersebut, dan saya membuat ujian untuk menguji Kisah Pengguna. Pengguna mengatakan, Kami mempunyai orang mendaftar untuk sekolah dan membayar yuran pendaftaran. Jadi, saya fikir cara untuk membuatnya gagal. Dengan berbuat demikian saya merancang Kelas ujian untuk kelas X (mungkin Pelajar), yang akan gagal. Saya kemudiannya membuat kelas "Pelajar." Mungkin "Sekolah" saya tidak tahu.

Tetapi, dalam apa jua keadaan, Design TD memaksa saya berfikir melalui cerita itu. Jika saya boleh membuat ujian gagal, saya tahu mengapa ia gagal, tetapi ini mengandaikan saya boleh membuatnya lulus. Ini adalah mengenai pereka.

Saya menyamakan ini dengan memikirkan Rekursi. Rekursi bukanlah satu konsep yang sukar. Mungkin lebih sukar untuk benar-benar mengesannya di kepala anda, tetapi pada hakikatnya, bahagian paling sukar adalah mengetahui, apabila rekursi "pecah", apabila berhenti (pendapat saya, sudah tentu). Jadi saya perlu memikirkan apa yang berhenti Rekod pertama. Ia hanya analogi yang tidak sempurna, dan ia mengandaikan bahawa setiap lelaran rekursif adalah "lulus." Sekali lagi, hanya pendapat.

Dalam pelaksanaannya, sekolah semakin sukar untuk dilihat. Petunjuk angka dan perbankan adalah "mudah" dalam erti kata anda boleh menggunakan aritmetik mudah. Saya dapat melihat + b dan kembali 0, dan lain-lain. Dalam kes sistem orang, saya perlu berfikir lebih lanjut mengenai cara implement . Saya mempunyai konsep gagal, lulus, refactor (kebanyakannya kerana kajian dan soalan ini.)

Apa yang saya tidak tahu berdasarkan pada kurangnya pengalaman, pada pendapat saya. Saya tidak tahu bagaimana untuk gagal mendaftar pelajar baru. Saya tidak tahu bagaimana untuk gagal menaip seseorang dalam nama terakhir dan ia disimpan ke pangkalan data. Saya tahu bagaimana untuk membuat + 1 untuk matematik mudah, tetapi dengan entiti seperti seseorang, saya tidak tahu sama ada saya hanya menguji untuk mengetahui sama ada saya mendapat ID pangkalan data unik atau sesuatu yang lain apabila seseorang memasuki nama dalam pangkalan data atau kedua-duanya atau tidak.

Atau, mungkin ini menunjukkan saya masih keliru.

5 Comments
187 hobbs 07/25/2017
Selepas orang TDD pulang ke rumah untuk malam itu.
14 Goyo 07/25/2017
Mengapa anda fikir kod yang anda tulis tidak nyata?
2 johnny 07/26/2017
@RubberDuck Lebih daripada jawapan yang lain. Saya pasti saya akan merujuknya tidak lama lagi. Ia masih agak asing, tetapi saya tidak akan menyerah padanya. Apa yang kamu katakan tadi masuk akal. Saya hanya cuba membuatnya masuk akal dalam konteks saya atau aplikasi perniagaan biasa. Mungkin sistem inventori atau sebagainya. Saya perlu memikirkannya. Saya bersyukur kerana masa anda sekalipun. Terima kasih.
1 Edmund Reed 07/26/2017
Jawapan-jawapan sudah melanda paku di kepala, tetapi selagi semua ujian anda berlalu, dan anda tidak memerlukan apa-apa ujian / fungsi baru, boleh diandaikan kod yang anda telah selesai, bar linting.
3 Borjab 07/26/2017
Terdapat satu anggapan dalam soalan yang mungkin bermasalah dalam "Saya mempunyai objek yang agak kompleks dengan kaedah yang kompleks". Dalam TDD anda menulis ujian anda terlebih dahulu supaya anda bermula dengan kod yang agak mudah. Ini akan memaksa anda untuk memasukkan struktur mesra ujian yang perlu menjadi modular. Tingkah laku yang rumit akan dibuat dengan menggabungkan objek yang lebih mudah. Jika anda mengakhiri dengan objek atau kaedah yang agak kompleks maka adalah apabila anda refactor

11 Answers


RubberDuck 07/27/2017.

Sekiranya saya mempunyai objek yang agak rumit dengan kaedah yang kompleks, dan saya menulis ujian saya dan minimum untuk membuatnya lulus (selepas itu pertama gagal, Merah). Bilakah saya kembali dan menulis kod sebenar? Dan berapa kod sebenar yang saya tulis sebelum saya menggunakan semula? Saya meneka yang terakhir adalah lebih intuisi.

Anda tidak "kembali" dan menulis "kod sebenar". Ini semua kod sebenar. Apa yang anda lakukan ialah pergi kembali dan tambahkan satu lagi ujian yang forces anda untuk change kod anda untuk membuat ujian baru lulus.

Berapa banyak kod yang anda tulis sebelum anda menggunakan semula? Tiada. Anda menulis kod zero tanpa ujian gagal yang forces anda menulis lebih banyak kod.

Perhatikan corak?

Marilah melalui contoh lain dengan harapan ia membantu.

 Assert.Equal("1", FizzBuzz(1)); 

Mudah merosakkan.

 public String FizzBuzz(int n) {
    return 1.ToString();
} 

Bukan apa yang anda panggil kod sebenar, bukan? Mari tambahkan ujian yang memaksa perubahan.

 Assert.Equal("2", FizzBuzz(2)); 

Kita boleh melakukan sesuatu yang bodoh seperti if n == 1 , tetapi kita akan melangkau kepada penyelesaian yang waras.

 public String FizzBuzz(int n) {
    return n.ToString();
} 

Sejuk. Ini akan berfungsi untuk semua nombor bukan FizzBuzz. Apakah input seterusnya yang akan memaksa kod pengeluaran berubah?

 Assert.Equal("Fizz", FizzBuzz(3));

public String FizzBuzz(int n) {
    if (n == 3)
        return "Fizz";
    return n.ToString();
} 

Dan lagi. Tulis ujian yang tidak akan diluluskan.

 Assert.Equal("Fizz", FizzBuzz(6));

public String FizzBuzz(int n) {
    if (n % 3 == 0)
        return "Fizz";
    return n.ToString();
} 

Dan sekarang kita telah menutup semua gandaan tiga (yang bukan juga gandaan lima, kita akan perhatikan dan kembali).

Kami belum menulis ujian untuk "Buzz" lagi, jadi mari kita tulis itu.

 Assert.Equal("Buzz", FizzBuzz(5));

public String FizzBuzz(int n) {
    if (n % 3 == 0)
        return "Fizz";
    if (n == 5)
        return "Buzz"
    return n.ToString();
} 

Dan sekali lagi, kita tahu terdapat satu lagi kes yang perlu kita hadapi.

 Assert.Equal("Buzz", FizzBuzz(10));

public String FizzBuzz(int n) {
    if (n % 3 == 0)
        return "Fizz";
    if (n % 5 == 0)
        return "Buzz"
    return n.ToString();
} 

Dan sekarang kita boleh mengendalikan semua kelipatan 5 yang tidak juga gandaan 3.

Hingga ke tahap ini, kami telah mengabaikan langkah refactoring, tetapi saya melihat beberapa pertindihan. Mari bersihkan sekarang.

 private bool isDivisibleBy(int divisor, int input) {
    return (input % divisor == 0);
}

public String FizzBuzz(int n) {
    if (isDivisibleBy(3, n))
        return "Fizz";
    if (isDivisibleBy(5, n))
        return "Buzz"
    return n.ToString();
} 

Sejuk. Kini kami telah memadam pertindihan dan mencipta fungsi bernama yang baik. Apakah ujian seterusnya yang boleh kita tulis yang akan memaksa kita menukar kod itu? Nah, kami telah mengelakkan kes di mana nombor itu boleh dibahagikan oleh kedua-dua 3 dan 5. Mari tulis sekarang.

 Assert.Equal("FizzBuzz", FizzBuzz(15));

public String FizzBuzz(int n) {
    if (isDivisibleBy(3, n) && isDivisibleBy(5, n))
        return "FizzBuzz";
    if (isDivisibleBy(3, n))
        return "Fizz";
    if (isDivisibleBy(5, n))
        return "Buzz"
    return n.ToString();
} 

Ujian berlalu, tetapi kita mempunyai lebih banyak pertindihan. Kami mempunyai pilihan, tetapi saya akan memohon "Ekstrak Pembolehubah Tempatan" beberapa kali supaya kita refakulasi dan bukan menulis semula.

 public String FizzBuzz(int n) {

    var isDivisibleBy3 = isDivisibleBy(3, n);
    var isDivisibleBy5 = isDivisibleBy(5, n);

    if ( isDivisibleBy3 && isDivisibleBy5 )
        return "FizzBuzz";
    if ( isDivisibleBy3 )
        return "Fizz";
    if ( isDivisibleBy5 )
        return "Buzz"
    return n.ToString();
} 

Dan kami telah menutup setiap input yang munasabah, tetapi bagaimana dengan input unreasonable ? Apa yang berlaku jika kita lulus 0 atau negatif? Tulis kes ujian tersebut.

 public String FizzBuzz(int n) {

    if (n < 1)
        throw new InvalidArgException("n must be >= 1);

    var isDivisibleBy3 = isDivisibleBy(3, n);
    var isDivisibleBy5 = isDivisibleBy(5, n);

    if ( isDivisibleBy3 && isDivisibleBy5 )
        return "FizzBuzz";
    if ( isDivisibleBy3 )
        return "Fizz";
    if ( isDivisibleBy5 )
        return "Buzz"
    return n.ToString();
} 

Adakah ini bermula seperti "kod sebenar"? Yang lebih penting lagi, pada titik apakah ia berhenti menjadi "kod tidak nyata" dan peralihan menjadi "sebenar"? Itulah sesuatu yang perlu difikirkan ...

Oleh itu, saya dapat melakukan ini hanya dengan mencari ujian yang saya tahu tidak akan lulus pada setiap langkah, tetapi saya mempunyai banyak amalan. Apabila saya sedang bekerja, perkara-perkara yang tidak pernah ini mudah dan saya mungkin tidak selalu tahu apa ujian akan memaksa perubahan. Kadang-kadang saya akan menulis ujian dan terkejut melihatnya sudah berlalu! Saya amat mengesyorkan agar anda mendapat tabiat membuat "Senarai Ujian" sebelum anda memulakan. Senarai ujian ini harus mengandungi semua input "menarik" yang boleh anda fikirkan. Anda mungkin tidak menggunakan mereka semua dan anda mungkin akan menambah kes seperti yang anda pergi, tetapi senarai ini berfungsi sebagai peta jalan. Senarai ujian saya untuk FizzBuzz akan kelihatan seperti ini.

  • Negatif
  • Zero
  • Satu
  • Dua
  • Tiga
  • Empat
  • Lima
  • Enam (bukan berganda 3)
  • Sembilan (3 kuasa dua)
  • Sepuluh (bukan berganda 5)
  • 15 (pelbagai 3 & 5)
  • 30 (gandaan bukan remeh dari 3 & 5)
5 comments
3 maple_shaft♦ 07/27/2017
Komen bukan untuk perbincangan lanjut; perbualan ini telah dipindahkan ke sembang .
40 GManNickG 07/27/2017
Kecuali saya benar-benar salah faham jawapan ini: "Kita boleh melakukan sesuatu yang bodoh seperti jika n == 1, tetapi kita akan melangkau kepada penyelesaian yang waras." - semuanya itu bodoh. Sekiranya anda tahu di depan anda menginginkan fungsi yang melakukan <spec>, tulis ujian untuk <spec> dan langkahkan bahagian di mana anda menuliskan versi yang jelas gagal <spec>. Sekiranya anda menemui pepijat dalam <spec> maka pasti: tulis ujian terlebih dahulu untuk mengesahkan anda boleh menjalankannya sebelum pembetulan dan perhatikan pas ujian selepas pembaikan. Tetapi tidak perlu palsu semua langkah perantaraan ini.
15 user3791372 07/28/2017
Komen-komen yang menunjukkan kelemahan utama dalam jawapan ini dan TDD secara umum telah dipindahkan ke chat. Jika anda sedang mempertimbangkan menggunakan TDD, sila baca 'chat'. Malangnya komen 'kualiti' kini tersembunyi di antara beban sembang untuk pelajar masa depan untuk dibaca.
nbro 07/28/2017
Saya akan lebih tepat mengenai kandungan "senarai ujian" ini, jika anda ingin memperbaiki jawapan ini. Saya secara jelas akan bercakap mengenai "nilai sempadan" dan "pembahagian kelas".
2 hvd 07/30/2017
@GManNickG Saya percaya maksudnya adalah untuk mendapatkan jumlah ujian yang betul. Menulis ujian terlebih dahulu menjadikannya mudah untuk terlepas apa kes-kes khas perlu diuji, membawa sama ada kepada situasi yang tidak dilindungi secukupnya dalam ujian, atau pada dasarnya keadaan yang sama-sama tidak dapat dinafikan banyak kali dalam ujian. Jika anda boleh melakukannya tanpa langkah-langkah pertengahan, hebat! Tidak semua orang boleh berbuat demikian walaupun, itu sesuatu yang mengambil amalan.

GenericJon 07/24/2017.

Kod "sebenar" ialah kod yang anda tulis untuk membuat ujian anda lulus. Really . Itulah yang mudah.

Apabila orang bercakap tentang menulis minimum untuk membuat ujian hijau, itu hanya bermakna kod sebenar anda harus mengikuti prinsip YAGNI .

Idea langkah refactor adalah untuk membersihkan apa yang telah anda tulis apabila anda gembira bahawa ia memenuhi keperluan.

Selagi ujian yang anda tulis sebenarnya merangkumi keperluan produk anda, apabila mereka lulus maka kod tersebut selesai. Fikirkanlah, jika semua keperluan perniagaan anda mempunyai ujian dan semua ujian itu berwarna hijau, apa lagi yang ada untuk menulis? (Okay, dalam kehidupan sebenar kita tidak cenderung mempunyai liputan ujian lengkap, tetapi teori itu adalah baik.)

5 comments
44 Derek Elkins 07/24/2017
Ujian unit sebenarnya tidak dapat memenuhi keperluan produk anda walaupun keperluan yang relatif kecil. Paling baik, mereka mencuba ruang input-output dan ideanya adalah bahawa anda (betul) umumkan ke ruang input-output penuh. Sudah tentu, kod anda hanya boleh menjadi switch besar dengan kes bagi setiap ujian unit yang akan lulus semua ujian dan gagal untuk sebarang input lain.
8 Taemyr 07/25/2017
@DekekElkins TDD mandat ujian gagal. Tidak gagal ujian unit.
6 jonrsharpe 07/25/2017
@DekekElkins itulah sebabnya anda tidak hanya menulis ujian unit, dan juga mengapa ada anggapan umum bahawa anda cuba membuat sesuatu yang bukan hanya palsu!
35 Derek Elkins 07/25/2017
@jonrsharpe Dengan logik itu, saya tidak akan menulis pelaksanaan remeh. Contohnya dalam contoh FizzBuzz dalam jawapan RubberDuck (yang hanya menggunakan ujian unit), pelaksanaan pertama jelas "hanya palsu". Pemahaman saya mengenai soalan ini adalah dikotomi ini antara kod bertulis yang anda tahu tidak lengkap dan kod yang benar-benar anda percaya akan melaksanakan keperluan, "kod sebenar". " switch besar" saya dimaksudkan sebagai melampau logik untuk "menulis minimum untuk membuat ujian hijau". Saya melihat soalan OP sebagai: di mana di TDD adalah prinsip yang mengelakkan switch besar ini?
2 Luaan 07/25/2017
@GenericJon Itu agak terlalu optimistik dalam pengalaman saya :) Untuk satu, ada orang yang menikmati kerja berulang-ulang tanpa berfikir. Mereka akan lebih bahagia dengan pernyataan beralih gergasi daripada dengan "membuat keputusan rumit". Dan untuk kehilangan pekerjaan mereka, mereka sama ada memerlukan orang yang memanggil mereka pada teknik itu (dan mereka lebih baik mempunyai bukti yang baik itu sebenarnya kehilangan peluang syarikat / wang!), Atau melakukan yang sangat teruk. Selepas mengambil alih penyelenggaraan projek-projek sedemikian, saya dapat mengatakan bahawa mudah untuk kod yang sangat naif untuk bertahan selama beberapa dekad, selagi ia membuat pelanggan gembira (dan membayar).

Carl Raymond 07/24/2017.

Jawapan ringkas adalah bahawa "kod sebenar" adalah kod yang membuat ujian mengalir. Jika anda boleh membuat ujian anda dengan sesuatu yang lain daripada kod sebenar, tambahkan lebih banyak ujian!

Saya bersetuju bahawa banyak tutorial mengenai TDD adalah mudah. Itu berfungsi melawan mereka. Ujian terlalu mudah untuk kaedah yang, katakan, mengira 3 + 8 benar-benar tidak mempunyai pilihan tetapi juga mengira 3 + 8 dan bandingkan hasilnya. Itu menjadikannya kelihatan seperti anda hanya akan menduplikasi kod di seluruh, dan ujian itu adalah kerja tambahan yang ragu-ragu.

Apabila anda baik dalam ujian, itu akan memberitahu bagaimana anda menyusun permohonan anda, dan bagaimana anda menulis kod anda. Sekiranya anda menghadapi masalah dengan ujian yang masuk akal, anda mungkin perlu membuat semula reka bentuk anda sedikit. Sistem yang direka dengan baik adalah mudah untuk diuji - bererti ujian masuk akal mudah difikirkan, dan dilaksanakan.

Apabila anda menulis ujian anda terlebih dahulu, melihatnya gagal, dan kemudian tulis kod yang membuatnya lulus, itulah satu disiplin untuk memastikan bahawa semua kod anda mempunyai ujian yang bersesuaian. Saya tidak mengikuti aturan itu apabila saya sedang mengkode; sering saya menulis ujian selepas fakta. Tetapi ujian yang pertama membantu untuk memastikan anda jujur. Dengan beberapa pengalaman, anda akan mula dapat melihat apabila anda sedang mengetik diri ke sudut, walaupun anda tidak menulis ujian terlebih dahulu.

4 comments
6 Steve Jessop 07/26/2017
Secara peribadi, ujian yang saya tulis akan assertEqual(plus(3,8), 11) , tidak assertEqual(plus(3,8), my_test_implementation_of_addition(3,8)) . Untuk kes-kes yang lebih rumit, anda sentiasa mencari cara untuk membuktikan hasilnya dengan betul, other than mengira hasil yang betul secara tepat dalam menguji dan memeriksa kesaksamaan.
Steve Jessop 07/26/2017
Jadi untuk cara yang benar-benar bodoh untuk melakukannya untuk contoh ini, anda mungkin membuktikan bahawa plus(3,8) telah mengembalikan hasil yang betul dengan menolak 3 daripadanya, menolak 8 daripadanya, dan memeriksa hasilnya terhadap 0. Ini sangat jelas bersamaan dengan assertEqual(plus(3,8), 3+8) sebagai sedikit tidak masuk akal, tetapi jika kod yang diuji sedang membina sesuatu yang lebih rumit daripada hanya integer, maka mengambil keputusan dan memeriksa setiap bahagian untuk ketepatan sering pendekatan yang betul. Sebaliknya, sesuatu seperti for (i=0, j=10; i < 10; ++i, ++j) assertEqual(plus(i, 10), j)
Steve Jessop 07/26/2017
... kerana itu mengelakkan ketakutan besar, iaitu ketika menulis ujian kami akan membuat kesilapan yang sama pada subjek "bagaimana menambah 10" yang kami buat dalam kod hidup. Oleh itu ujian dengan berhati-hati menghindari menulis mana-mana kod yang menambahkan 10 apa-apa, dalam ujian yang plus() boleh menambah 10 untuk sesuatu. Kami masih bergantung pada nilai-nilai gelung intro yang disahkan pengaturcara, tentu saja.
3 Warbo 07/28/2017
Hanya mahu menunjukkan bahawa walaupun anda menulis ujian selepas fakta, masih baik untuk melihatnya gagal; cari beberapa bahagian kod yang kelihatan penting untuk apa sahaja yang anda kerjakan, tweak ia sedikit (contohnya menggantikan + dengan -, atau apa sahaja), jalankan ujian dan nonton mereka gagal, batalkan perubahan dan menontonnya lulus. Banyak kali saya telah melakukan ujian ini tidak benar-benar gagal, menjadikannya lebih buruk daripada tidak berguna: bukan sahaja tidak menguji apa-apa, ia memberikan saya keyakinan palsu bahawa sesuatu sedang diuji!

Victor Cejudo 07/25/2017.

Kadang-kadang beberapa contoh tentang TDD boleh mengelirukan. Seperti yang ditunjukkan oleh orang lain sebelum ini, kod yang anda tulis untuk membuat ujian lulus adalah kod sebenar.

Tetapi jangan berfikir bahawa kod sebenar muncul seperti sihir -yang salah. Anda memerlukan pemahaman yang lebih baik tentang apa yang anda mahu capai dan kemudian anda perlu memilih ujian yang sesuai, bermula dari kes-kes yang paling mudah dan kes sudut.

Sebagai contoh, jika anda perlu menulis lexer, anda mula dengan rentetan kosong, kemudian dengan sekumpulan ruang putih, kemudian nombor, kemudian dengan nombor yang dikelilingi oleh ruang putih, maka nombor yang salah, dll. Transformasi kecil ini akan membawa anda ke algoritma yang betul, tetapi anda tidak melompat dari kes yang paling mudah kepada kes yang sangat rumit yang dipilih dengan penuh dumbly untuk mendapatkan kod sebenar yang dilakukan.

Bob Martin menerangkannya dengan sempurna di sini .


CandiedOrange 07/25/2017.

Bahagian refactor membersihkan apabila anda letih dan mahu pulang ke rumah.

Apabila anda hendak menambah ciri bahagian refactor adalah apa yang anda ubah sebelum ujian seterusnya. Anda refactor kod untuk memberi ruang untuk ciri baru. Anda melakukan ini apabila anda know apa ciri baru itu. Tidak apabila anda membayangkannya.

Ini boleh semudah menamakan semula GreetImpl ke GreetWorld sebelum anda membuat kelas GreetMom (selepas menambah ujian) untuk menambah ciri yang akan mencetak "Hi Mom".


graeme 07/27/2017.

Tetapi kod sebenar akan muncul dalam tahap refactor fasa TDD. Itulah kod yang sepatutnya menjadi sebahagian daripada siaran akhir.

Ujian perlu dijalankan setiap kali anda membuat perubahan.

Moto kitaran hayat TDD adalah: REFACTOR GREEN REDD

RED : Tulis ujian

GREEN : Jadikan percubaan yang jujur ​​untuk mendapatkan kod fungsional yang melewati ujian secepat mungkin: kod duplikat, hobi yang dinamai pemboleh ubah hacks urutan tertinggi, dsb.

REFACTOR : Bersihkan kod tersebut dengan betul, nama pembolehubah. Keringkan kod itu.

5 comments
5 mcottle 07/25/2017
Saya tahu apa yang anda katakan tentang fasa "Hijau" tetapi ia menyiratkan bahawa nilai pulangan pendiam keras untuk membuat lulus ujian mungkin sesuai. Dalam pengalaman saya, "Hijau" harus menjadi percubaan yang jujur ​​untuk membuat kod kerja untuk memenuhi keperluan, ia mungkin tidak sempurna tetapi ia sepatutnya menjadi lengkap dan "boleh dipercayai" kerana pemaju boleh menguruskan dalam pas pertama. Refactoring mungkin lebih baik dilakukan beberapa waktu kemudian selepas anda melakukan lebih banyak pembangunan dan masalah dengan pas pertama menjadi lebih jelas dan peluang untuk muncul.
graeme 07/25/2017
@mcottle saya pertimbangkan semua ini sebahagian tugas yang sama. dapatkannya, kemudian bersihkannya. Pembetulan selanjutnya perlu berlaku seiring dengan berjalannya masa sebagai sebahagian daripada tugas lain.
1 Bryan Boettcher 07/25/2017
@mottle: anda mungkin terkejut berapa banyak pelaksanaan repositori get-sahaja yang boleh dikodkan nilai dalam pangkalan data. :)
6 Kaz 07/25/2017
Kenapa saya akan menulis kod taip dan membersihkannya, apabila saya boleh mengetuk kod kualiti pengeluaran yang bagus, hampir secepat saya boleh menaip? :)
1 Kaz 07/27/2017
@TimothyTruckle Apa itu jika mengambil 50 minit untuk mencari perubahan yang paling mudah, tetapi hanya 5 untuk mencari perubahan yang paling mudah kedua? Adakah kita pergi dengan yang kedua paling mudah atau terus mencari yang paling mudah?

Timothy Truckle 07/27/2017.

Bilakah anda menulis kod "sebenar" dalam TDD?

Fasa red adalah di mana anda write kod.

Dalam fasa refactoring matlamat utama adalah untuk delete kod.

Dalam fasa red anda melakukan apa sahaja untuk membuat ujian lulus as quick as possible dan at any cost . Anda benar-benar mengabaikan apa yang pernah anda dengar tentang amalan pengkodan yang baik atau corak reka bentuk yang sama. Membuat ujian hijau adalah perkara yang penting.

Dalam fasa refactoring anda membersihkan kekacauan yang baru saja dibuat. Kini anda mula-mula melihat apakah perubahan yang anda buat adalah jenis yang paling banyak dalam senarai Priority Transformation dan jika terdapat sebarang duplikasi kod, anda boleh mengalih keluar kemungkinan besar dengan menggunakan peluk desain.

Akhirnya anda meningkatkan kebolehbacaan dengan pengenal nama semula dan mengekstrak magic numbers dan / atau rentetan literal kepada pemalar.


Ia bukan refactor merah, ia adalah refactor merah-hijau. - Rob Kinyon

Terima kasih kerana menunjuk pada ini.

Jadi ia adalah fasa green di mana anda menulis real code

Dalam fasa red anda menulis executable specification ...

2 comments
Rob Kinyon 07/27/2017
Ia bukan refactor merah, ia adalah refactor merah-hijau. "Merah" adalah anda mengambil suite ujian anda dari hijau (semua ujian lulus) menjadi merah (satu ujian gagal). "Hijau" adalah di mana anda secara suntik mengambil suite ujian anda dari merah (satu ujian gagal) ke hijau (semua ujian lulus). "Refactor" adalah di mana anda mengambil kod anda dan membuatnya cantik sambil memastikan semua ujian berlalu.
Timothy Truckle 07/27/2017
@RobKinyon Terima kasih, mengemas kini jawapannya.

Robert Andrzejuk 07/27/2017.

Anda menulis Real Code sepanjang masa.

Pada setiap langkah Anda menulis kod untuk memenuhi syarat yang Kod anda akan memuaskan untuk pemanggil kod anda yang akan datang (yang mungkin Anda atau tidak ...).

Anda fikir Anda tidak menulis kod berguna ( real ), kerana dalam seketika Anda mungkin refactor ia keluar.

Refactoring Code adalah proses penyusunan semula kod komputer yang sedia ada - mengubah pemfaktoran - tanpa mengubah kelakuan luarannya.

Apa ini bermakna bahawa walaupun Anda mengubah kod itu, syarat-syarat kod itu dipertahankan, dibiarkan tidak berubah. Dan pemeriksaan ( tests ) yang anda lakukan untuk mengesahkan kod anda sudah ada untuk mengesahkan apakah pengubahsuaian anda berubah apa-apa. Jadi kod yang anda tulis sepanjang masa ada di sana, dengan cara yang berbeza.

Alasan lain Anda mungkin berfikir bahawa ia bukan kod sebenar, adalah bahawa Anda melakukan contoh di mana program akhir sudah dapat dilihat oleh Anda. Ini sangat baik, kerana ia menunjukkan Anda mempunyai pengetahuan mengenai domain Anda adalah pengaturcaraan.
Tetapi banyak kali pengaturcara berada dalam domain yang new , unknown oleh mereka. Mereka tidak tahu apa hasil akhirnya dan TDD adalah technique untuk menulis program demi langkah, mendokumenkan knowledge tentang bagaimana sistem ini berfungsi dan mengesahkan bahawa kod kami berfungsi seperti itu.

Apabila saya membaca Buku (*) di TDD, bagi saya ciri yang paling penting yang ditonjolkan ialah: senarai TODO. Ia menunjukkan kepada saya bahawa, TDD juga merupakan teknik untuk membantu pemaju memberi tumpuan kepada satu perkara pada satu masa. Jadi ini juga jawapan kepada soalan anda aboout How much Real code to write ? Saya akan mengatakan kod yang cukup untuk memberi tumpuan kepada 1 perkara pada satu masa.

(*) "Pengujian Didorong Pembangunan: Oleh Contoh" oleh Kent Beck

1 comments
2 Robert Andrzejuk 07/27/2017
"Ujian Dipacu Pembangunan: Oleh Contoh" oleh Kent Beck

Zenilogix 07/31/2017.

Anda tidak menulis kod untuk membuat ujian anda gagal.

Anda menulis ujian anda untuk menentukan kejayaan apa yang sepatutnya, yang sepatutnya semua gagal kerana anda belum menulis kod yang akan diluluskan.

Inti mengenai menulis ujian awal-gagal ialah melakukan dua perkara:

  1. Menutup semua kes - semua kes nominal, semua kes kelebihan, dsb.
  2. Mengesahkan ujian anda. Sekiranya anda hanya melihat mereka lulus, bagaimana anda boleh memastikan bahawa mereka akan melaporkan kegagalan apabila berlaku?

Titik di belakang refactor merah-hijau adalah bahawa menulis ujian yang betul pertama kali memberikan anda keyakinan untuk mengetahui bahawa kod yang anda tulis untuk lulus ujian adalah betul, dan membolehkan anda untuk refactor dengan keyakinan bahawa ujian anda akan memberitahu anda dengan segera sesuatu yang pecah, jadi anda boleh segera kembali dan memperbaikinya.

Dalam pengalaman saya sendiri (C # / .NET), ujian tulen-pertama adalah sedikit ideal yang tidak dapat dicapai, kerana anda tidak boleh menyusun panggilan kepada kaedah yang belum ada. Oleh itu, "ujian pertama" adalah benar-benar mengenai pengekodkan antara muka dan perlaksanaan stubbing terlebih dahulu, kemudian menuliskan ujian terhadap stub (yang pada awalnya akan gagal) sehingga stubs diselaraskan dengan betul. Saya tidak pernah menulis "fail gagal", hanya membina dari stub.


Zan Lynx 07/27/2017.

Saya rasa anda mungkin keliru antara ujian unit dan ujian integrasi. Saya percaya terdapat juga ujian penerimaan, tetapi itu bergantung kepada proses anda.

Sebaik sahaja anda telah menguji semua "unit" yang kecil maka anda menguji mereka semua yang dipasang, atau "terintegrasi." Itu biasanya keseluruhan program atau perpustakaan.

Dalam kod yang saya telah menulis integrasi menguji perpustakaan dengan pelbagai program ujian yang membaca data dan memberi suapan ke perpustakaan, kemudian periksa hasilnya. Kemudian saya melakukannya dengan benang. Kemudian saya melakukannya dengan benang dan garpu () di tengah. Kemudian saya lari dan membunuh -9 selepas 2 saat, kemudian saya mulakannya dan periksa mod pemulihannya. Saya fuzz ia. Saya menyeksakannya dalam pelbagai cara.

Kesemuanya itu ujian ALSO, tetapi saya tidak mempunyai paparan merah / hijau cantik untuk hasilnya. Ia sama ada berjaya, atau saya menggali beberapa ribu baris kod ralat untuk mengetahui mengapa.

Itulah di mana anda menguji "kod sebenar."

Dan saya hanya fikir ini, tetapi mungkin anda tidak tahu apabila anda sepatutnya melakukan ujian unit ujian. Anda telah selesai ujian unit ujian apabila ujian anda melakukan semua perkara yang anda sepatutnya lakukan. Kadang-kadang anda boleh kehilangan jejak itu di antara semua kesilapan pengendalian dan kes-kes tepi, jadi anda mungkin ingin membuat ujian ujian yang menyenangkan dari jalan yang senang dengan lurus melalui spesifikasi.

1 comments
Peter Mortensen 07/27/2017
(its = posive, itu = "itu" atau "ada". Lihat contoh How to Use Its and It's .)

user3791372 07/27/2017.

Sebagai jawapan kepada tajuk soalan: "Bilakah anda menulis kod" sebenar "dalam TDD?", Jawapannya adalah: 'tidak pernah' atau 'sangat perlahan'.

Anda terdengar seperti pelajar, jadi saya akan menjawab seolah-olah menasihati pelajar.

Anda akan belajar banyak 'teori' dan 'teknik' pengekodan. Mereka hebat untuk meluangkan masa pada kursus pelajar yang terlalu mahal, tetapi sangat sedikit manfaat kepada anda yang anda tidak dapat membaca dalam buku pada separuh masa.

Tugas pengkod adalah semata-mata untuk menghasilkan kod. Kod yang berfungsi dengan baik. Itulah sebabnya anda, kod itu merancang kod itu dalam fikiran anda, di atas kertas, dalam aplikasi yang sesuai, dan sebagainya, dan anda merancang untuk mengatasi kelemahan / lubang yang mungkin terlebih dahulu dengan berfikir secara logik dan kemudiannya sebelum pengekodan.

Tetapi anda perlu tahu cara memecahkan permohonan anda untuk dapat merancang kod yang baik. Sebagai contoh, jika anda tidak tahu mengenai Little Bobby Table (xkcd 327), maka anda mungkin tidak akan membasuh input anda sebelum bekerja dengan pangkalan data, jadi anda tidak akan dapat mengamankan data anda di sekitar konsep itu.

TDD hanyalah alur kerja yang direka untuk meminimumkan pepijat dalam kod anda dengan membuat ujian apa yang boleh menjadi salah sebelum anda mengecapkan aplikasi anda kerana pengekodan boleh secara eksponen menjadi lebih sukar kod yang anda perkenalkan dan anda melupakan pepijat yang pernah anda fikirkan. Sebaik sahaja anda fikir anda telah selesai permohonan anda anda menjalankan ujian dan ledakan, semoga bug ditangkap dengan ujian anda.

TDD tidak - seperti yang diyakini oleh sesetengah orang - menulis ujian, lulus dengan kod minima, tulis ujian lain, dapatkan lulus dengan kod minima, dan sebagainya. Sebaliknya, ini cara untuk membantu anda kod dengan yakin. Idea kod refactoring yang berterusan untuk menjadikannya berfungsi dengan ujian adalah bodoh, tetapi ia adalah satu konsep yang bagus di kalangan pelajar kerana ia membuatkan mereka berasa hebat apabila mereka menambah ciri baru dan mereka masih belajar bagaimana untuk kod ...

Tolong jangan jatuh perangkap ini dan perhatikan pengekodan anda untuk apa itu - tugas pengkod adalah semata-mata untuk menghasilkan kod. Kod yang berfungsi dengan baik. Sekarang, ingat anda akan berada pada jam sebagai pengkod profesional, dan pelanggan anda tidak akan peduli jika anda menulis 100,000 pernyataan, atau 0. Mereka hanya mahu kod yang berfungsi. Benar, sebenarnya.

5 comments
3 johnny 07/25/2017
Saya tidak lebih dekat dengan pelajar, tetapi saya membaca dan cuba menggunakan teknik yang baik dan profesional. Jadi dalam erti kata itu, saya adalah "pelajar." Saya hanya bertanya soalan yang sangat asas kerana itulah cara saya. Saya ingin mengetahui dengan tepat mengapa saya melakukan apa yang saya lakukan. Hati perkara itu. Sekiranya saya tidak mendapatnya, saya tidak menyukainya dan mula bertanya. Saya perlu tahu kenapa, jika saya akan menggunakannya. TDD seolah-olah intuitif baik dalam beberapa cara seperti mengetahui apa yang anda perlukan untuk membuat dan memikirkan perkara melalui, tetapi pelaksanaannya sukar difahami. Saya fikir saya mempunyai genggaman yang lebih baik sekarang.
4 Sean Burton 07/27/2017
Itulah peraturan TDD. Anda bebas menulis kod yang anda mahukan, tetapi jika anda tidak mengikuti ketiga-tiga peraturan yang anda tidak lakukan TDD.
2 user3791372 07/27/2017
"Peraturan" seseorang? TDD adalah cadangan untuk membantu anda kod, bukan agama. Sungguh menyedihkan untuk melihat begitu ramai orang mematuhi idea secara anally. Malah asal-usul TDD adalah kontroversi.
2 Alex 07/28/2017
@ user3791372 TDD adalah proses yang sangat ketat dan jelas. Walaupun ramai yang berfikir itu hanya bermaksud "Adakah beberapa ujian apabila anda pengaturcaraan", tidak. Mari cuba jangan campur syarat di sini, soalan ini mengenai proses TDD, bukan ujian umum.

Related questions

Hot questions

Language

Popular Tags