Wie kann ich Audiotests durchführen?

13

Ich habe ein kleines Projekt geerbt und möchte es erweitern und gleichzeitig stabilisieren, indem ich Unit Tests für den neuen Code schreibe, den ich hinzufüge. Die erste Klasse TypedAudioCreatorerstellt Audiodateien, und dies erwies sich als sehr einfach, zuerst zu testen und dann Code zu schreiben.

Als es jedoch Zeit zum Schreiben wurde TypedAudioPlayer, hatte ich keine Ahnung, wie ich es testen könnte. Es ist eine sehr kleine Klasse, die sich auf die Grundlagen des Soundspiels konzentriert:

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

Ich bin noch sehr neu bei TDD, aber ich erkenne die Vorteile der Praxis und möchte versuchen, sie zu verbessern. Ich habe zuerst Code geschrieben, keine Tests hier, aber das war nur so, dass ich zu faul war, um über die TDD-Methode zur Lösung des Problems nachzudenken. Die Frage, die ich habe, ist, wie soll / könnte ich diese Klasse testen?

IAE
quelle
2
Gibt es keine spottenden Frameworks in C #? Dies sollte Ihre Probleme lösen.
user43552
2
@ user43552: Das wäre nur ein Test ... Dieses Szenario soll den Audio-Player testen.
Steven Evers
5
Ich bin nicht mit der Audioverarbeitung in C # vertraut, aber es scheint mir, dass Sie diese Klasse überarbeiten müssen, damit Sie anstelle von ein Mock injizieren können audioFile.SoundPlayer. Dann testen Sie mit diesem Mock und verifizieren Sie, dass PlaySyncund Disposean den richtigen Stellen aufgerufen werden. Sie möchten auch in der Lage sein, die StartedPlayingHandlerund StoppedPlayingHandlerwenn möglich zu injizieren .
Dawood sagt, Monica
2
Sollte dies nicht auf Stapelüberlauf sein?
Amr H. Abd Elmajeed
3
@ AmrH.AbdelMajeed - warum? Nur weil es Code hat?
ChrisF

Antworten:

10

Es gibt viele Dinge "an den Rändern" der meisten Systeme, die nicht ausreichend auf ihre Einheit getestet werden können. Zum Beispiel alles, was Grafiken oder Sound erzeugt. Für diese Art von Systemen sind Sie wahrscheinlich am besten mit manuellen Tests dran. Selbst bei einer automatisierten Lösung sind diese Ausgaben für die menschliche Wahrnehmung gedacht. Die einzige Möglichkeit zu erkennen, dass Sie den gewünschten Effekt erzielen, besteht darin, dass ein Mensch mit ihnen interagiert.

Möglicherweise können Sie einen manuellen Test durchführen, die Ausgabe dieses manuellen Tests aufzeichnen und einen automatisierten Test erstellen, der sicherstellt, dass sich die Ausgabe nicht ändert. Seien Sie jedoch gewarnt, dass solche Tests unglaublich anfällig sind: Jede Änderung des zugrunde liegenden Codes erfordert möglicherweise eine Wiederholung des manuellen Tests und die Erstellung einer neuen Aufzeichnung für den automatisierten Test.

Chris Pitman
quelle
1
+1 für 'Es gibt viele Dinge "an den Rändern" der meisten Systeme, die nicht ausreichend auf Einheit getestet werden können.'
2
Diese Antwort ist sehr irreführend. Nur weil das endgültige Ausgabegerät für Audio-Code häufig ein Paar Lautsprecher ist, bedeutet dies nicht, dass Audio-Code nicht einheitlich getestet werden kann oder dass er perzeptiv getestet werden muss. Jede Audiosoftware verfügt über einen digitalen Ausgang, der gemessen und mit einem erwarteten Ausgang verglichen werden kann. Ein Ansatz zum Testen von Audio-Einheiten ist in diesem
Artikel
9

Es ist natürlich schwierig, automatisch zu testen, ob der Audioplayer wirklich Audio wiedergibt , aber Sie können trotzdem nützliche Komponententests erstellen. Sie können beispielsweise testen, ob StartPlaying () das StartedPlaying-Ereignis und StopPlaying () das StoppedPlaying-Ereignis verursacht. Sie können das Verhalten testen, wenn Sie versuchen, eine leere oder eine leere Wiedergabeliste abzuspielen. Sie können testen, ob AddFile die Datei wirklich zur Wiedergabeliste hinzufügt. Sie können testen, ob eine Audiodatei nach dem Abspielen aus der Wiedergabeliste entfernt wird (falls dies gewünscht ist). Vielleicht gibt es auch Ecken für kaputte Audiodateien usw., die es verdienen, getestet zu werden.

Mit Unit-Tests für diese Dinge können Sie sicher sein, dass sich die Klasse gut verhält, dh ihre Verträge erfüllt. Wenn dies der Fall ist, aber immer noch kein Ton abgespielt wird, ist dies in manuellen Tests relativ einfach zu erfassen.

user281377
quelle
3

Denken Sie daran, dass es einen Unterschied gibt zwischen Unit-Tests , bei denen kleine Tests geschrieben werden, mit denen einzelne Einheiten Ihres Codes getestet werden, und automatisierten Testläufern, mit denen Ihre Unit-Tests ausgeführt werden, normalerweise als Teil des Erstellungsprozesses oder als kontinuierliche Tests Integrationssystem.

Unit-Tests werden in der Regel automatisiert, können jedoch auch manuell durchgeführt werden. Die IEEE favorisiert einander nicht. Das Ziel beim Testen von Einheiten besteht darin, eine Einheit zu isolieren und ihre Richtigkeit zu überprüfen. Bei einem manuellen Ansatz zum Testen von Einheiten kann ein schrittweises Anleitungsdokument verwendet werden.

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

Sie können ganz einfach einen Komponententest schreiben, um zu testen, ob eine Audio-Player-Komponente Audio korrekt wiedergibt:

  1. Stellen Sie sicher, dass Ihre Lautsprecher funktionieren und die Lautstärke erhöht ist.
  2. Gehe zu / my / test / folder.
  3. Führen Sie myTestRunner audioPlayerTest.script.thingee aus.
  4. Sie sollten Beethovens 5. Symphonie 15 Sekunden lang spielen hören.
  5. Wenn Sie nichts gehört haben, das Audio länger oder kürzer als 15 Sekunden abgespielt wurde oder in irgendeiner Weise verzerrt war, schlug der Test fehl. Ansonsten ist der Test bestanden.

Was Sie nicht einfach tun können, ist, diesen Test in ein automatisiertes Testsystem aufzunehmen. Automatisiertes Testen ist eine spezielle Implementierung von Komponententests, aber nicht die einzige Implementierung.

Siehe auch: /programming/1877118/is-unit-testing-always-automated

lfalin
quelle