Bagaimana Anda menguji perangkat lunak yang sensitif terhadap waktu?


9

Maksud saya sensitif waktu misalnya, skrip yang hanya berjalan sebulan sekali atau skrip yang berjalan terus-menerus tetapi memberikan output tertentu hanya sebulan sekali. Jelas Anda dapat menguji unit untuk banyak kasus tetapi ada pengecualian (dalam pemahaman saya).

Contoh terakhir yang saya temui adalah mengatur pekerjaan cron untuk dijalankan pada hari kedua hingga terakhir setiap bulan. Ini diperlukan menggunakan skrip shell dengan tab cron untuk mendapatkan hari yang benar di bulan tersebut untuk cron, seperti:

1 0 [shell command] * * [my script]

Saya tidak terbiasa dengan skrip dan tidak terbiasa dengan skrip shell secara umum sehingga tidak memiliki cara yang baik untuk mengujinya selain menunggu akhir bulan yang akan datang dan melihat apakah skrip dieksekusi dengan benar (sebenarnya solusi saya adalah menemukan sebuah co- pekerja yang tahu lebih banyak tentang cron dan shell scripting yang saya lakukan).

Jadi saya ingin tahu apakah ada pekerjaan yang berguna untuk menguji skrip sensitif waktu.


3
Anda bisa menjalankan ini pada VM dan mengatur waktu sistem menjadi nyaman seperti hanya tengah malam sebelum hari skrip dijalankan, atau sesuatu seperti itu.
Vitor Py

2
crontab mengeksekusi skrip shell biasa, Anda cukup menjalankan skrip dengan tangan (di kotak pasir atau vm jika Anda takut akan melakukan apa) tanpa menunggu crontab
crasic

2
Jawaban saya mungkin berlebihan untuk kasus spesifik Anda: Cukup jalankan skrip. Tetapi pertanyaan yang lebih besar akan membutuhkan solusi seperti virtualisasi dan instrumentasi.
Macneil

Jawaban:


7

Selain pengujian unit, ada dua strategi lain untuk menyiapkan tes otomatis untuk menangani masalah spesifik OS:

  • Virtualisasi : Anda mengatur beberapa gambar OS (misalnya, menggunakan VMWare ) dengan konfigurasi persis yang Anda butuhkan, mengatur cara untuk secara otomatis menarik biner untuk diuji (biasanya dengan memasang direktori khusus ke ruang VM), dan kemudian jalankan uji.

Atau:

  • Instrumentasi : Secara manual menambahkan ifkondisi khusus ke program Anda yang akan membuat program berperilaku berbeda. Di bawah Unix, ini akan dilakukan dengan memeriksa jika variabel lingkungan tertentu diatur, seperti FOOBAR_TEST_TIME_WITH_T=500. Pengujian otomatis Anda kemudian hanya akan menggunakan pengaturan variabel lingkungan yang berbeda, dan variabel lingkungan yang berbeda, untuk menjalankan apa yang Anda butuhkan.

Anda juga dapat menautkan ke pustaka yang berbeda, jika interaksi Anda dapat diekspresikan di tingkat pustaka, yang dapat Anda anggap sebagai virtualisasi (jika "pustaka" adalah kernel OS) atau sebagai teknik instrumentasi. Kedua istilah tersebut dapat digunakan, meskipun istilah virtualisasi seperti yang digunakan saat ini hampir selalu berarti sesuatu seperti VMWare. Perpustakaan khusus untuk mengembalikan nilai kalengan atau menjalankan kembali interaksi spesifik akan menjadi pendekatan tiruan atau rintisan .

Ada juga alat instrumentasi otomatis, yang dapat menulis ulang binari Anda untuk mendapatkan efek lain yang diinginkan, seperti sistem file menjadi penuh.

Secara keseluruhan, tujuan Anda adalah menemukan bug. Untuk memeriksa kasus-kasus aneh seperti sistem file yang overfull, itu paling mudah dan masih efektif untuk hanya secara manual instrumen program Anda, pergi virtualisasi atau rute konfigurasi mesin manual jarang jika pernah.


Saya pikir 'virtualisasi perpustakaan' Anda lebih dikenal sebagai mengejek, atau lebih tepatnya, menggunakan perpustakaan tiruan.
Javier

10

Yang paling efektif - Ubah tanggal mesin yang Anda uji. Tetapkan sedikit sebelum sebelum dijalankan, dan verifikasi kapan dimulai dan berjalan dengan benar. Namun ini tidak selalu memungkinkan jika ada beberapa mesin yang terlibat, atau, jika sumber daya diperlukan sehingga perusahaan Anda tidak memiliki kendali atas. Pastikan Anda melakukannya selama beberapa bulan, dan pastikan Anda mengubah tahun untuk menguji Februari.


1
jika Anda memiliki perangkat lunak yang diinstal dengan lisensi (evaluasi) untuk waktu yang terbatas, bermain-main dengan jam dapat memicu mereka untuk memblokir eksekusi mereka.
Marjan Venema

Di beberapa perusahaan, semua workstation yang masuk ke jaringan tidak boleh menyimpang dari waktu "server" selama 5 menit, jika tidak, workstation akan mengunci. Itu terjadi pada saya :-)
OnesimusUnbound

1

Saya tidak tahu tentang skrip Anda, tetapi saya mencoba menggunakan semacam parameter tempat saya dapat mengatur tanggal. Dalam kasus Anda, jika tidak ada tanggal yang diberikan, default ke akhir bulan. Dalam kode Anda, ambil parameter tanggal dan jalankan jika hari ini adalah dua hari sebelumnya. Anda tidak hanya akan dapat mengujinya (melewati tanggal dua hari dari sekarang), tetapi juga menjalankan hari berikutnya seandainya ada sesuatu yang mencegahnya berjalan dalam keadaan normal (listrik mati, server mati, dll.).


1

Karena Anda menyebutkan crontab, saya menganggap Anda berjalan di lingkungan nix. Dalam hal ini, saya pikir itu akan bernilai saat Anda untuk memeriksa libfaketime:
http://www.code-wizards.com/projects/libfaketime/

Melalui keajaiban LD_PRELOAD, kami dapat memuat versi khusus fungsi pustaka selama cocok dengan antarmuka. Apa yang dilakukan libfaketime adalah memuat versi panggilan sistem waktu yang memungkinkan Anda untuk menyesuaikan perilaku mereka melalui variabel lingkungan. Anda dapat memaksa waktu () untuk mengembalikan nilai kode-keras atau offset dari waktu saat ini, semua tanpa mempengaruhi orang lain di dalam kotak.


0

Tidak perlu banyak untuk menguji cron, karena sudah cukup banyak diuji ("uji produksi") selama beberapa generasi. Tentu saja, jika Anda bekerja dengan skrip shell, Anda dapat mengatur tanggal / waktu dalam mesin virtual.

Cara yang disukai untuk menangani ini adalah "mengejek jam", menggunakan satu trik pemrograman atau lainnya untuk memalsukan waktu. Dalam skrip shell Anda dapat menggunakan sintaks $ {: -} untuk menggunakan tanggal yang ditetapkan dalam variabel lingkungan, dan kembali pada waktu aktual jika itu tidak dipaksa.

Dalam bahasa lain kami menggunakan perpustakaan tiruan atau membangun abstraksi sepanjang waktu.

Jam tiruan itu bagus karena Anda dapat mengotomatiskannya daripada harus mengatur tes secara manual. Ini adalah manfaat yang sangat besar ketika harus memodifikasi skrip / kode nanti dan Anda dapat dengan mudah mengetahui apakah itu masih berfungsi atau tidak.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.