Як можна встановити тестовий звук?


13

Я успадкував невеликий проект і хочу одночасно розширити його та стабілізувати, написавши Тестові блоки для всього нового коду, який я додаю. Перший клас, TypedAudioCreatorстворює аудіофайли, і це виявилося дуже простим для тестування першого та написання коду для другого.

Однак, коли прийшов час писати TypedAudioPlayer, я не мав уявлення, як би можу це перевірити. Це дуже маленький клас, який зосереджується на самих основах відтворення звуку:

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, але я усвідомлюю переваги практики і хотів би спробувати покращитись. Спершу я написав Кодекс, тут немає ніяких тестів, але це було лише я лінивий, щоб правильно думати про спосіб його вирішення. Питання у мене полягає в тому, як я повинен / міг би протестувати цей клас?


2
Хіба в С # немає рамки знущань? Це повинно вирішити ваші проблеми.
user43552

2
@ user43552: Це просто тестування макету ... цей сценарій призначений для тестування аудіоплеєра.
Стівен Еверс

5
Я не знайомий з тим, як робити аудіо в C #, але мені здається, що вам потрібно переробляти цей клас, щоб ви могли ввести макет замість audioFile.SoundPlayer. Потім тест з цим знущатися, і переконайтеся , що PlaySyncі Disposeназивають в потрібних місцях. Ви також хочете мати можливість зробити ін'єкцію StartedPlayingHandlerта, StoppedPlayingHandlerякщо це можливо.
Давуд ібн Карім

2
Чи не повинно це бути в потоковому потоці?
Amr H. Abd Elmajeed

3
@ AmrH.AbdelMajeed - чому? Просто тому, що він має код?
ChrisF

Відповіді:


10

Є багато речей "на краях" більшості систем, які неможливо адекватно перевірити. Наприклад, все, що виробляє графіку чи звук. Для таких систем ви, мабуть, найкраще підходите до ручного тестування. Навіть отримавши автоматичне рішення, ці результати призначені для сприйняття людиною. Єдиний спосіб дізнатися, що ви справляєте бажаний ефект - це взаємодіяти з ними людиною.

Можливо, можливо виконати тест вручну, після чого записати результат цього ручного тесту та створити автоматизований тест, який забезпечує, щоб вихід не змінювався. Попереджуйте, що такі тести неймовірно крихкі: будь-яка зміна базового коду може зажадати повторного ручного тестування та створення нової записи для автоматизованого тесту.


1
+1 для "Більшість речей" на краях "більшості систем, які не можуть бути адекватно перевірені."

2
Ця відповідь є дуже оманливою. Тільки тому, що кінцевим пристроєм виведення аудіокоду часто є пара динаміків, це не означає, що аудіокод не може бути перевірений одиницею або що його потрібно перевірити перцептивно. Все аудіо програмне забезпечення має цифровий вихід, який можна виміряти та порівняти з очікуваним виходом. Один підхід до тестування аудіо на пристрої можна знайти в цій статті
jb

9

Очевидно важко автоматично перевірити, чи справді аудіоплеєр відтворює аудіо, але ви все одно можете створити корисні тести. Наприклад, ви можете перевірити, що StartPlaying () викликає подія StartedPlaying, а StopPlaying () викликає подію StoppedPlaying. Ви можете перевірити поведінку, намагаючись відтворити порожній список відтворення або нульовий список відтворення. Ви можете перевірити, що AddFile дійсно додає файл до списку відтворення. Ви можете перевірити, що після відтворення аудіофайлу він видаляється зі списку відтворення (якщо це бажано). Можливо, є також кутові корпуси для зламаних аудіофайлів тощо, які заслуговують на тестування.

Провівши одиничні тести на ці речі, ви можете бути впевнені, що клас поводиться добре, тобто відповідає його контрактам. Якщо це так, але все ще не відтворює звук, це відносно легко впізнати в ручних тестах.


3

Майте на увазі, що існує різниця між модульним тестуванням , що є актом написання невеликих тестів, які перевіряють окремі одиниці вашого коду, і автоматизованими тестовими виконавцями, які виконують ваші одиничні тести, як правило, як частина процесу збирання або якогось безперервного інтеграційна система.

Тестування приладів зазвичай автоматизоване, але все ж може проводитися вручну. IEEE не надає переваги один одному. Завданням одиничного тестування є виділення блоку та перевірка його правильності. Ручний підхід до тестування одиниць може використовувати покроковий інструкційний документ.

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

Ви можете легко написати блок-тест, щоб перевірити, чи компонент аудіоплеєра відтворює аудіо правильно:

  1. Переконайтесь, що ваші динаміки працюють, а гучність підвищена.
  2. Перейдіть до / my / test / folder.
  3. Виконати myTestRunner audioPlayerTest.script.thingee.
  4. Ви повинні почути п’яту симфонію Бетховена протягом 15 секунд.
  5. Якщо ви нічого не чули, аудіо відтворювалося більше 15 секунд або було перекручено будь-яким чином, тест не вдався. В іншому випадку тест пройшов.

Те, що ви не можете легко зробити, це включити цей тест в автоматизовану систему тестування. Автоматизоване тестування - це особлива реалізація одиничного тестування, але це не єдина реалізація.

Дивіться також: /programming/1877118/is-unit-testing-always-automated

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.