Saya bukan insinyur perangkat lunak. Saya seorang mahasiswa doktoral di bidang geosains.
Hampir dua tahun yang lalu saya mulai memprogram perangkat lunak ilmiah. Saya tidak pernah menggunakan integrasi berkelanjutan (CI), terutama karena pada awalnya saya tidak tahu itu ada dan saya adalah satu-satunya orang yang bekerja pada perangkat lunak ini.
Sekarang karena basis perangkat lunak berjalan, orang lain mulai tertarik padanya dan ingin berkontribusi pada perangkat lunak tersebut. Rencananya adalah orang lain di universitas lain menerapkan penambahan pada perangkat lunak inti. (Saya khawatir mereka bisa memperkenalkan bug). Selain itu, perangkat lunak menjadi sangat kompleks dan menjadi semakin sulit untuk diuji dan saya juga berencana untuk terus mengerjakannya.
Karena dua alasan ini, saya sekarang semakin berpikir untuk menggunakan CI. Karena saya tidak pernah memiliki pendidikan insinyur perangkat lunak dan tidak ada orang di sekitar saya yang pernah mendengar tentang CI (kami adalah ilmuwan, tidak ada programmer), saya merasa sulit untuk memulai proyek saya.
Saya punya beberapa pertanyaan di mana saya ingin mendapatkan saran:
Pertama-tama, penjelasan singkat tentang cara kerja perangkat lunak:
Perangkat lunak ini dikendalikan oleh satu file .xml yang berisi semua pengaturan yang diperlukan. Anda memulai perangkat lunak dengan hanya meneruskan jalur ke file .xml sebagai argumen input dan itu berjalan dan membuat beberapa file dengan hasilnya. Satu menjalankan tunggal dapat memakan waktu ~ 30 detik.
Ini adalah perangkat lunak ilmiah. Hampir semua fungsi memiliki beberapa parameter input, yang tipenya kebanyakan kelas yang cukup kompleks. Saya memiliki beberapa file .txt dengan katalog besar yang digunakan untuk membuat instance dari kelas-kelas ini.
Sekarang mari kita datang ke pertanyaan saya:
tes unit, tes integrasi, tes ujung ke ujung? : Perangkat lunak saya sekarang sekitar 30.000 baris kode dengan ratusan fungsi dan ~ 80 kelas. Rasanya agak aneh bagi saya untuk mulai menulis unit test untuk ratusan fungsi yang sudah dilaksanakan. Jadi saya berpikir tentang membuat beberapa test case. Siapkan 10-20 file .xml berbeda dan biarkan perangkat lunak berjalan. Saya kira inilah yang disebut tes end-to-end? Saya sering membaca bahwa Anda seharusnya tidak melakukan ini, tetapi mungkin itu baik sebagai permulaan jika Anda sudah memiliki perangkat lunak yang berfungsi? Atau apakah itu hanya ide bodoh untuk mencoba menambahkan CI ke perangkat lunak yang sudah berfungsi.
Bagaimana Anda menulis unit test jika parameter fungsi sulit dibuat? menganggap saya memiliki fungsi
double fun(vector<Class_A> a, vector<Class_B>)
dan biasanya, saya harus terlebih dahulu membaca beberapa file teks untuk membuat objek bertipeClass_A
danClass_B
. Saya berpikir tentang membuat beberapa fungsi dummy sepertiClass_A create_dummy_object()
tanpa membaca di file teks. Saya juga berpikir tentang menerapkan semacam serialisasi . (Saya tidak berencana untuk menguji pembuatan objek kelas karena mereka hanya bergantung pada beberapa file teks)Bagaimana cara menulis tes jika hasilnya sangat bervariasi? Perangkat lunak saya memanfaatkan simulasi monte-carlo besar dan bekerja secara iteratif. Biasanya, Anda memiliki ~ 1000 iterasi dan di setiap iterasi, Anda membuat ~ 500-20.000 instance objek berdasarkan simulasi monte-carlo. Jika hanya satu hasil dari satu iterasi sedikit berbeda, seluruh iterasi yang akan datang benar-benar berbeda. Bagaimana Anda menghadapi situasi ini? Saya kira ini poin besar terhadap tes end-to-end, karena hasil akhirnya sangat bervariasi?
Saran lain dengan CI sangat dihargai.