Bagaimana saya bisa menguji unit audio?

13

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?

IAE
sumber
2
Apakah tidak ada kerangka kerja mengejek di C #? Ini harus menyelesaikan masalah Anda.
user43552
2
@ user43552: Itu hanya akan menguji tiruan ... skenario ini dimaksudkan untuk menguji pemutar audio.
Steven Evers
5
Saya tidak terbiasa dengan cara melakukan audio dalam C #, tetapi bagi saya sepertinya Anda perlu memperbaiki kelas ini sehingga Anda dapat menyuntikkan tiruan di tempat audioFile.SoundPlayer. Kemudian uji dengan tiruan ini, dan verifikasi itu PlaySyncdan Disposedipanggil di tempat yang tepat. Anda juga ingin dapat menyuntikkan StartedPlayingHandlerdan StoppedPlayingHandlerjika memungkinkan.
Dawood mengatakan mengembalikan Monica
2
Bukankah ini seharusnya di stackoverflow?
Amr H. Abd Elmajeed
3
@ AmrH.AbdelMajeed - mengapa? Hanya karena punya kode?
ChrisF

Jawaban:

10

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.

Chris Pitman
sumber
1
+1 untuk 'Ada banyak hal "di tepian" dari sebagian besar sistem yang tidak dapat diuji unit secara memadai.'
2
Jawaban ini sangat menyesatkan. Hanya karena perangkat keluaran akhir untuk kode audio sering sepasang speaker, itu tidak berarti bahwa kode audio tidak dapat diuji unit atau perlu diuji secara perseptual. Semua perangkat lunak audio memiliki output digital yang dapat diukur dan dibandingkan dengan output yang diharapkan. Satu pendekatan untuk pengujian unit audio dapat ditemukan dalam makalah ini
jb
9

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.

pengguna281377
sumber
3

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.

Pengujian unit umumnya otomatis, tetapi masih dapat dilakukan secara manual. IEEE tidak mendukung satu sama lain. Tujuan dalam pengujian unit adalah untuk mengisolasi unit dan memvalidasi kebenarannya. Pendekatan manual untuk pengujian unit dapat menggunakan dokumen petunjuk langkah demi langkah.

( 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:

  1. Pastikan speaker Anda berfungsi dan volumenya dinaikkan.
  2. Buka / my / test / folder.
  3. Jalankan myTestRunner audioPlayerTest.script.thingee.
  4. Anda harus mendengar permainan Simfoni Kelima Beethoven selama 15 detik.
  5. Jika Anda tidak mendengar apa pun, audio diputar kurang lebih 15 detik, atau terdistorsi dengan cara apa pun, pengujian gagal. Kalau tidak, tes lulus.

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

lfalin
sumber