Я унаследовал небольшой проект и хочу одновременно его расширить и стабилизировать, написав модульные тесты для всего нового кода, который я добавляю. Первый класс 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, но я понимаю преимущества практики и хотел бы попытаться улучшить ее. Сначала я написал «Код», здесь никаких тестов, но я просто слишком ленив, чтобы правильно подумать о способе его решения TDD. Вопрос, который у меня возник, заключается в следующем: как я могу / могу проверить этот класс?
audioFile.SoundPlayer
. Затем проверьте с этим макет, и убедитесь, чтоPlaySync
иDispose
вызываются в нужных местах. Вы также хотите иметь возможность вводитьStartedPlayingHandler
и,StoppedPlayingHandler
если возможно.Ответы:
В большинстве систем существует множество «краев», которые не могут быть адекватно протестированы на модульном уровне. Например, все, что производит графику или звук. Для таких систем лучше всего проводить ручное тестирование. Даже учитывая автоматизированное решение, эти результаты предназначены для человеческого восприятия. Единственный способ узнать, что вы производите желаемый эффект - это заставить человека взаимодействовать с ними.
Может быть возможным выполнить ручной тест, затем записать результаты этого ручного теста и создать автоматический тест, который гарантирует, что выходные данные не изменятся. Имейте в виду, что подобные тесты невероятно хрупкие: любое изменение базового кода может потребовать повторения ручного теста, а затем создания новой записи для автоматического теста.
источник
Очевидно, что сложно автоматически проверить, что аудиоплеер действительно воспроизводит звук, но вы все равно можете создать полезные модульные тесты. Например, вы можете проверить, что StartPlaying () вызывает событие StartedPlaying, а StopPlaying () вызывает событие StoppedPlaying. Вы можете проверить поведение при попытке воспроизведения пустого списка воспроизведения или нулевого списка воспроизведения. Вы можете проверить, что AddFile действительно добавляет файл в список воспроизведения. Вы можете проверить, что после воспроизведения аудиофайла он удаляется из списка воспроизведения (если это необходимо). Может быть, есть угловые шкафы для сломанных аудио файлов и т. Д., Которые заслуживают тестирования.
Имея модульные тесты для этих вещей, вы можете быть уверены, что класс ведет себя хорошо, то есть выполняет свои контракты. Если это произойдет, но звук по-прежнему не воспроизводится, это сравнительно легко обнаружить в ручных тестах.
источник
Имейте в виду, что существует разница между модульным тестированием , которое заключается в написании небольших тестов, которые тестируют отдельные модули вашего кода, и автоматизированными тестовыми прогонами которые запускают ваши модульные тесты, как правило, как часть процесса сборки или какого-либо непрерывного система интеграции.
( http://en.wikipedia.org/wiki/Unit_testing#Techniques )
Вы можете легко написать модульный тест, чтобы проверить, что компонент аудиоплеера воспроизводит аудио правильно:
То, что вы не можете легко сделать, это включить этот тест в автоматизированную систему тестирования. Автоматизированное тестирование - это особая реализация модульного тестирования, но это не единственное реализация.
Смотрите также: /programming/1877118/is-unit-testing-always-automated
источник