Sesi nasıl test edebilirim?


13

Küçük bir projeyi miras aldım ve eklediğim tüm yeni kodlar için Birim Testleri yazarak genişletmek ve aynı anda sabitlemek istiyorum. Birinci sınıf,, TypedAudioCreatorses dosyaları oluşturur ve bu ilk önce test etmek ve ikinci için kod yazmak çok kolay olduğu ortaya çıktı.

Ancak, yazma zamanı geldiğinde TypedAudioPlayer, bunu nasıl test edebileceğim hakkında hiçbir fikrim yoktu. Ses çalmanın temellerine odaklanan çok küçük bir sınıf:

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);
    }
}

TDD'de hala çok yeniyim, ancak uygulamanın faydalarının farkındayım ve daha iyi olmaya çalışıyorum. Önce Code yazdım, burada test yok, ama bu TDD'nin çözme şeklini düzgün bir şekilde düşünmek için çok tembel olduğum oldu. Sorum şu: Bu sınıfı nasıl test etmeliyim / test edebilirim?


2
C # alay-çerçeveler yok mu? Bu, sorunlarınızı çözmelidir.
user43552

2
@ user43552: Bu sadece bir alay testi olacak ... bu senaryo ses çaları test etmek için tasarlanmıştır.
Steven Evers

5
Ben C # ses yapmak için aşina değilim, ama bana bu sınıf yerine bir sahte enjekte böylece refactor gerekiyor gibi görünüyor audioFile.SoundPlayer. Sonra bu alay ile test edin PlaySyncve Disposedoğru yerlerde çağrıldığını doğrulayın . Ayrıca StartedPlayingHandlerve StoppedPlayingHandlermümkünse enjekte etmek istersiniz .
Dawood, Monica'nın

2
Bu yığın akışında olmamalı mı?
Amr H. Abd Elmajeed

3
@ AmrH.AbdelMajeed - neden? Sadece kodu olduğu için mi?
ChrisF

Yanıtlar:


10

Çoğu sistemin "kenarlarında" birim testi yeterince test edilemeyen birçok şey vardır. Örneğin, grafik veya ses üreten herhangi bir şey. Bu tür sistemler için, muhtemelen en iyi manuel testten geçersiniz. Otomatik bir çözüm olsa bile, bu çıktılar insan algısı içindir. İstediğiniz etkiyi ürettiğinizi bilmenin tek yolu, insanlarla onlarla etkileşime girmektir.

Bir manuel test yapmak, ardından bu manuel testin çıkışını kaydetmek ve çıktının değişmemesini sağlayan otomatik bir test oluşturmak mümkün olabilir. Bununla birlikte, bu tür testlerin inanılmaz derecede kırılgan olduğu konusunda uyarılmalıdır: temel kodda yapılacak herhangi bir değişiklik, manuel testin tekrarlanmasını ve ardından otomatik test için yeni bir kayıt oluşturulmasını gerektirebilir.


1
+1, 'Sistemlerin birçoğunda yeterince test edilemeyen birçok sistemin “kenarlarında” pek çok şey vardır.

2
Bu cevap oldukça yanıltıcı. Çünkü son çıkış aygıtı ses kodu için genellikle hoparlörler bir çift, o ses kod birimi test ya da algısal olarak test edilmesi gerektiğini olamaz anlamına gelmez. Tüm ses yazılımları, beklenen çıktıyla ölçülebilen ve karşılaştırılabilen dijital bir çıkışa sahiptir. Birim test sesine bir yaklaşım bu makalede bulunabilir
jb

9

Ses oynatıcının gerçekten ses çaldığını otomatik olarak test etmek zor , ancak yine de yararlı birim testleri oluşturabilirsiniz. Örneğin, StartPlaying () öğesinin StartedPlaying olayına neden olduğunu ve StopPlaying () öğesinin StoppedPlaying olayına neden olduğunu test edebilirsiniz. Boş bir çalma listesi veya boş bir çalma listesi çalmaya çalışırken davranışı test edebilirsiniz. AddFile'ın dosyayı çalma listesine gerçekten eklediğini test edebilirsiniz. Bir ses dosyasını çaldıktan sonra çalma listesinden kaldırıldığını test edebilirsiniz (istenirse). Belki de test edilmeyi hak eden kırık ses dosyaları vb. İçin köşe kutuları vardır.

Bunlar için birim testleri yaptırdığınızda, sınıfın iyi davrandığından, yani sözleşmelerini yerine getirdiğinden emin olabilirsiniz. Varsa, ancak yine de ses çalmıyorsa, manuel testlerde yakalamak nispeten kolaydır.


3

Kodunuzun ayrı birimlerini test eden küçük testler yazma eylemi olan Birim Testi ile genellikle oluşturma işleminin bir parçası olarak veya bir tür sürekli olarak birim testlerinizi çalıştıran Otomatik Test Koşucuları arasında bir fark olduğunu unutmayın. entegrasyon sistemi.

Birim testi genellikle otomatiktir, ancak yine de manuel olarak yapılabilir. IEEE birini diğerine tercih etmez. Birim testindeki amaç, bir birimi izole etmek ve doğruluğunu doğrulamaktır. Birim testine manüel bir yaklaşım, adım adım bir eğitim belgesi kullanabilir.

( http://en.wikipedia.org/wiki/Unit_testing#Techniques )

Bir ses çalar bileşeninin sesi doğru çaldığını test etmek için kolayca birim testi yazabilirsiniz:

  1. Hoparlörlerinizin çalıştığından ve sesin açık olduğundan emin olun.
  2. / My / test / klasörüne gidin.
  3. MyTestRunner audioPlayerTest.script.thingee dosyasını yürütün.
  4. Beethoven'ın 5. Senfoni çalmasını 15 saniye boyunca duymalısınız.
  5. Hiçbir şey duymadıysanız, ses 15 saniyeden fazla veya daha az oynatıldı veya herhangi bir şekilde bozuldu, test başarısız oldu. Aksi takdirde test geçti.

Kolayca yapamayacağınız şey, testi otomatik bir test sistemine dahil etmektir. Otomatik test, birim testin belirli bir uygulamasıdır, ancak tek uygulama değildir .

Ayrıca bakınız: /programming/1877118/is-unit-testing-always-automated

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.