Saya selalu ragu menulis ulang kode kerja - kode porting tidak terkecuali untuk ini. Namun, dengan munculnya TDD dan pengujian otomatis, jauh lebih masuk akal untuk menulis ulang dan kode refactor.
Adakah yang tahu kalau ada alat TDD yang bisa digunakan untuk porting kode lama? Idealnya Anda bisa melakukan hal berikut:
- Tulis tes unit agnostik bahasa untuk kode lama yang lulus (atau gagal jika Anda menemukan bug!).
- Jalankan tes unit pada basis kode Anda yang lain yang gagal.
- Tulis kode dalam bahasa baru Anda yang lulus tes tanpa melihat kode lama.
Alternatifnya adalah dengan membagi langkah 1 menjadi "Menulis unit test dalam bahasa 1" dan "Port unit tes ke bahasa 2", yang secara signifikan meningkatkan upaya yang diperlukan dan sulit untuk dibenarkan jika basis kode lama akan berhenti dipertahankan setelah port (yaitu, Anda tidak mendapatkan manfaat dari integrasi berkelanjutan pada basis kode ini).
EDIT: Perlu dicatat pertanyaan ini di StackOverflow.
unit-testing
language-agnostic
porting
Bringer128
sumber
sumber
expect
untuk mengimplementasikan tes Anda.expect
. Jika Anda memiliki sistem warisan gaya Unix yang berkomunikasi dengan pipa menggunakan stdin dan stdout maka alat itu dapat digunakan dengan pasti. Bahkan, akan sangat mudah untuk menguji dengan bahasa scripting apa pun juga.legacy language x
kefancy new language y
. Saya tidak berusaha menyiratkan apa pun tentang Unix!Jawaban:
Saya rasa tidak mungkin untuk menulis unit test dalam bahasa yang berbeda.
Namun, yang dapat Anda lakukan adalah menulis tes integrasi / penerimaan / antarmuka pengguna / whaterver_you_name_it yang akan tingkat sangat tinggi dan tidak akan terikat dengan bahasa perangkat lunak Anda ditulis.
Jika aplikasi Anda adalah layanan web, Anda dapat mengujinya dengan bahasa apa pun yang Anda inginkan, asalkan mendukung protokol Anda. Jika aplikasi Anda berjalan di browser, Anda dapat menggunakan selenium (itu yang pertama kali muncul di benak saya, tetapi ada yang lain. Dll. Mungkin ada beberapa kasus di mana itu tidak akan berfungsi saya bayangkan (mungkin hal-hal perangkat keras), itu semua tergantung pada jenis aplikasi yang sedang Anda kerjakan.
Tentu saja, Anda tidak akan memiliki cakupan yang sama dengan yang Anda miliki dengan tes tingkat unit (kecuali menghabiskan banyak waktu), tetapi setidaknya, Anda akan memiliki test harness.
sumber
Saya pikir apa yang paling dekat dengan ide Anda adalah kerangka unit test pada ekosistem berbasis mesin virtual seperti Java VM. Setidaknya Scala (dan saya percaya Groovy juga - saya tidak begitu yakin tentang Clojure) hampir sepenuhnya dapat dioperasikan dengan Java. Artinya, kode Scala dapat diuji dengan JUnit dan kode Java dapat diuji dengan ScalaTest. Dengan cara ini Anda dapat (secara bertahap atau sekaligus) menulis ulang kode Java di Scala dan tetap menggunakan tes unit Java yang sama untuk memverifikasi kebenarannya. (Atau sebaliknya - walaupun saya tidak dapat membayangkan alasan yang sah untuk bermigrasi dari Scala kembali ke Jawa.)
Mungkin hal yang sama berlaku untuk bahasa di. NET CLI, misalnya C #, F #, ASP.NET et al.
Di luar VM / CLR, bagaimanapun, itu lebih sulit. Secara teori, seseorang dapat mengkompilasi tes unit dan / atau kode yang diuji ke dalam bahasa lain seperti C (seperti dulu dan umum dengan bahasa baru seperti awal C ++ dll), tapi saya belum pernah mendengar ada orang yang mencoba ini secara khusus dengan tes unit.
sumber
Kerangka kerja seperti itu tidak ada, karena itu perlu ditulis dalam bahasa kode yang digunakan.
Misalnya, kerangka kerja untuk menguji kode c ++ perlu ditulis dalam c atau c ++. Menggunakan kerangka kerja yang ditulis dalam c ++ mungkin, tetapi tidak akan menguji kode ac jika menggunakan fitur c ++.
sumber
Metodologi bervariasi, tetapi dalam kasus saya sebagian besar dari tes TDD saya cenderung ke gaya 'tes integrasi', dibandingkan dengan 'tes unit'. Yaitu, sebagian besar dari saya menguji seluruh program dalam pertanyaan yang hampir nyata, memeriksa tanggapan yang sesuai.
Dalam beberapa kasus, ketika saya menulis program berbasis jaringan (kebanyakan protokol khusus aplikasi), saya tidak memiliki kerangka kerja pengujian lengkap yang terasa mudah untuk pekerjaan itu, jadi saya melakukan sebagian besar pengujian 'lintas jaringan', di singkatnya, saya menulis klien yang sangat sederhana dalam bahasa lain dengan kerangka uji umum dan sederhana, dan sebagian besar tes memeriksa respons server.
Namun, bahkan dalam kasus-kasus itu, saya menyuntikkan beberapa tes linting tangan dalam aplikasi nyata untuk menguji beberapa bagian non-jaringan.
sumber
Kerangka uji agnostik bahasa adalah kerangka uji generik yang cocok untuk uji penerimaan (sudut pandang) dan testcases dalam kerangka itu dikelola oleh QA misalnya Robotframework
sumber