Saya telah mewarisi proyek kecil dan ingin memperpanjang dan menstabilkannya pada saat yang sama dengan menulis Tes Unit untuk semua kode baru yang saya tambahkan. Kelas pertama TypedAudioCreator
,, membuat file audio dan ini ternyata sangat mudah untuk diuji pertama dan menulis kode untuk yang kedua.
Namun, ketika tiba saatnya untuk menulis TypedAudioPlayer
, saya tidak tahu bagaimana saya bisa mengujinya. Ini adalah kelas yang sangat kecil yang berfokus pada dasar-dasar bermain suara:
public class TypedAudioFilePlayer
{
public event StartedPlayingHandler StartedPlaying;
public event StoppedPlayingHandler StoppedPlaying;
public readonly int TimeBetweenPlays;
private Queue<TypedAudioFile> _playlist = new Queue<TypedAudioFile>();
public TypedAudioFilePlayer(int timeBetweenPlays)
{
TimeBetweenPlays = timeBetweenPlays;
}
public void AddFile(TypedAudioFile file)
{
_playlist.Enqueue(file);
}
public void StartPlaying()
{
ThreadPool.QueueUserWorkItem(ignoredState =>
{
while (_playlist.Count > 0)
{
var audioFile = _playlist.Dequeue();
if (StartedPlaying != null)
StartedPlaying(audioFile);
audioFile.SoundPlayer.PlaySync();
audioFile.SoundPlayer.Dispose();
if (StoppedPlaying != null)
StoppedPlaying(audioFile);
}
});
}
public void StopPlaying()
{
if (StoppedPlaying != null)
StoppedPlaying(null);
}
}
Saya masih sangat baru di TDD, tetapi saya menyadari manfaat dari latihan ini dan ingin mencoba dan menjadi lebih baik. Saya telah menulis Kode terlebih dahulu, tidak ada tes di sini, tapi itu hanya saya yang terlalu malas untuk memikirkan cara TDD untuk menyelesaikannya. Pertanyaan saya adalah, bagaimana saya bisa menguji kelas ini?
audioFile.SoundPlayer
. Kemudian uji dengan tiruan ini, dan verifikasi ituPlaySync
danDispose
dipanggil di tempat yang tepat. Anda juga ingin dapat menyuntikkanStartedPlayingHandler
danStoppedPlayingHandler
jika memungkinkan.Jawaban:
Ada banyak hal "di tepian" dari kebanyakan sistem yang tidak dapat diuji unit secara memadai. Misalnya, apa pun yang menghasilkan gambar atau suara. Untuk jenis sistem ini, Anda mungkin lebih baik dengan pengujian manual. Meskipun diberi solusi otomatis, output ini dimaksudkan untuk persepsi manusia. Satu-satunya cara untuk mengetahui bahwa Anda menghasilkan efek yang diinginkan adalah membuat manusia berinteraksi dengan mereka.
Dimungkinkan untuk melakukan tes manual, kemudian mencatat output dari tes manual itu dan membuat tes otomatis yang memastikan bahwa output tidak berubah. Namun berhati-hatilah karena tes seperti ini sangat rapuh: perubahan apa pun pada kode yang mendasarinya mungkin memerlukan pengulangan tes manual dan kemudian membuat rekaman baru untuk tes otomatis.
sumber
Jelas sulit untuk menguji secara otomatis bahwa audioplayer benar-benar memutar audio, tetapi Anda tetap dapat membuat unit test yang berguna. Misalnya, Anda dapat menguji bahwa StartPlaying () menyebabkan acara StartingPlaying, dan StopPlaying () menyebabkan acara StoppedPlaying. Anda dapat menguji perilaku ketika mencoba memainkan daftar putar kosong, atau daftar putar nol. Anda dapat menguji apakah AddFile benar-benar menambahkan file ke daftar putar. Anda dapat mengujinya setelah memutar file audio, itu dihapus dari daftar putar (jika diinginkan). Mungkin ada cornercases untuk file audio yang rusak dll juga yang layak untuk diuji.
Memiliki unit test untuk hal-hal itu, Anda dapat yakin bahwa kelas berperilaku baik, yaitu memenuhi kontraknya. Jika ya, tetapi masih tidak memainkan suara, itu relatif mudah untuk ditangkap dalam tes manual.
sumber
Ingatlah bahwa ada perbedaan antara Unit Testing , yang merupakan tindakan menulis tes kecil yang menguji masing-masing unit kode Anda, dan Pelari Uji Otomatis yang menjalankan tes unit Anda, biasanya sebagai bagian dari proses pembuatan atau semacam proses berkelanjutan sistem integrasi.
( http://en.wikipedia.org/wiki/Unit_testing#Teknik )
Anda dapat dengan mudah menulis unit test untuk menguji apakah komponen pemutar audio memutar audio dengan benar:
Yang tidak bisa Anda lakukan dengan mudah adalah memasukkan tes itu ke dalam sistem pengujian otomatis. Pengujian otomatis adalah implementasi khusus pengujian unit, tetapi bukan satu - satunya implementasi.
Lihat juga: /programming/1877118/is-unit-testing-always-automated
sumber