TDD untuk pemrosesan batch: Bagaimana cara melakukannya?

14

Saya suka "merah / hijau / refactor" untuk RoR, dll.

Pekerjaan harian saya melibatkan pemrosesan batch file yang sangat besar dari pihak ketiga dengan python dan alat kustom lainnya.

Churn pada atribut dari file-file ini tinggi, sehingga ada banyak perbaikan / peningkatan yang diterapkan cukup sering.

Pengujian regresi melalui badan data uji yang diketahui dengan hasil yang diharapkan tidak ada. Hal yang paling dekat adalah berjalan melawan batch terakhir dengan kasus uji baru yang dikodekan dengan tangan, pastikan tidak meledak, kemudian lakukan pemeriksaan spot dan uji statistik untuk melihat apakah data masih terlihat OK.

T >> Bagaimana cara membawa prinsip TDD ke lingkungan seperti ini?

Tomporter
sumber
1
Apakah itu churn pada data, atau kode sumber, atau keduanya?
rwong

Jawaban:

5

Hanya FYI: Pengujian unit tidak setara dengan TDD. TDD adalah suatu proses di mana pengujian unit merupakan elemen.

Dengan itu, jika Anda ingin menerapkan pengujian unit, maka ada beberapa hal yang dapat Anda lakukan:

Semua kode / peningkatan baru diuji

Dengan cara ini Anda tidak harus melalui dan menguji semua unit yang sudah ada, sehingga punuk awal pelaksanaan pengujian unit jauh lebih kecil.

Uji setiap potongan data

Menguji sesuatu yang dapat berisi sejumlah besar data dapat menyebabkan banyak kasus tepi dan kesenjangan dalam cakupan pengujian. Sebagai gantinya, pertimbangkan opsi 0, 1, banyak. Uji 'kumpulan' dengan 0 elemen, 1 elemen, dan banyak elemen. Dalam kasus 1 elemen, uji berbagai permutasi tempat data untuk elemen itu berada.

Dari sana, uji kasus tepi (batas atas dengan ukuran elemen individu, dan jumlah elemen dalam batch). Jika Anda menjalankan tes secara teratur, dan Anda memiliki tes yang berjalan lama (batch besar?), Sebagian besar pelari tes memungkinkan kategorisasi sehingga Anda dapat menjalankan kasus uji secara terpisah (setiap malam?).

Itu akan memberi Anda basis yang kuat.

Menggunakan data aktual

Memberi makan data 'aktual' yang sebelumnya digunakan seperti yang Anda lakukan sekarang bukanlah ide yang buruk. Cukup lengkapi dengan data uji yang terbentuk dengan baik sehingga Anda segera mengetahui titik kegagalan tertentu. Pada kegagalan untuk menangani data aktual, Anda dapat memeriksa hasil proses batch, menghasilkan unit test untuk mereplikasi kesalahan, dan kemudian Anda kembali ke merah / hijau / refactor dengan kasus regresi yang bermanfaat.

Steven Evers
sumber
3
Pastikan Anda menganonimkan data uji, jika perlu.
Frank Shearar
1

Sama seperti lingkungan lainnya.

Pisahkan logika menjadi tingkat granularitas terkecil. Ini akan memberi Anda seperangkat aturan untuk proses tersebut, setiap aturan akan mencakup satu item logika yang diperlukan untuk proses Anda.

Kemudian tulis tes untuk setiap aturan. Tes-tes ini akan gagal. Tulis kode untuk memperbaiki tes.

Pengujian regresi dengan data uji yang diketahui yang Anda bicarakan bukan pengujian unit. Itu akan menjadi pengujian integrasi, ini berbeda dari TDD. Dengan TDD Anda mungkin memiliki tes tunggal untuk menguji apakah Anda dapat memuat file, tetapi umumnya tidak ada tes lain yang benar-benar mendekati file data dengan data uji. Alih-alih, Anda akan mensimulasikan data yang diperlukan untuk menjalankan aturan tertentu menggunakan objek mengejek.

Mongus Pong
sumber
1

Mulailah dengan strategi perangkat lunak yang baik, lalu terapkan TDD.

(Penafian: Saya mungkin salah paham "churn", atau TDD, atau keduanya.)

Inilah strategi yang saya sarankan untuk pemrosesan batch "data kotor": Specify-Triage-Execute.

  • Draf spesifikasi data dengan cara yang ketat dan sempit, namun akan mencakup mayoritas (katakanlah, 80% atau lebih) dari data yang masuk. Sebut Spesifikasi ini 1 .
  • Kembangkan modul Triage (TDD jika Anda mau) yang memutuskan apakah suatu catatan memenuhi Spesifikasi 1.
    • Pastikan modul bekerja sangat cepat.
    • Modul harus mengembalikan benar / salah: ia memenuhi semua aturan, atau tidak.
  • Kembangkan modul Execute (TDD jika Anda mau) yang mem-parsing catatan yang diketahui memenuhi Spesifikasi 1, melakukan tugas apa pun yang dibutuhkan oleh pelanggan Anda.
  • Terapkan Triage 1 pada semua data yang masuk.
    • Hasilnya adalah satu nilai boolean untuk setiap catatan. Ini pada dasarnya memisahkan data yang masuk menjadi: Spesifikasi 1, atau Tidak Dikenal.
    • Terapkan Eksekusi 1 pada data Spesifikasi 1, kapan pun dibutuhkan oleh pelanggan.
  • Santai aturan Spesifikasi 1 untuk mengakui 80% dari data yang tersisa. Sebut Spesifikasi ini 2 .
  • Kembangkan Triage 2 dan Execute 2 . Terapkan ke data apa pun yang tidak memenuhi Spesifikasi 1.
  • Ulangi untuk level sebanyak yang diperlukan, hingga data yang tersisa cukup kecil sehingga dapat diproses secara manual setiap hari.

Berita gembira efisiensi:

Simpan semua hasil Triage (historis atau saat ini) yang terkait dengan catatan. Jika tidak ada modul Triage yang dimodifikasi sejak dijalankan terakhir, maka tidak harus dijalankan kembali pada data lama.

Tidbit "Anda harus tahu apa yang ingin Anda bangun sebelum melakukan TDD":

Specify-Triage-Execute adalah salah satu cara untuk menjaga agar persyaratan dapat dikelola di setiap level dan memungkinkan pertumbuhan di masa depan.

(Jika ada yang tahu istilah standar yang benar untuk ketiga langkah tersebut, beri tahu saya, saya akan mengedit jawaban saya.)

rwong
sumber