Eu herdei um projeto pequeno e quero estendê-lo e estabilizá-lo ao mesmo tempo, escrevendo Testes de Unidade para todo o novo código que estou adicionando. A primeira classe TypedAudioCreator
cria arquivos de áudio e isso foi muito fácil de testar primeiro e escrever código para o segundo.
No entanto, quando chegou a hora de escrever TypedAudioPlayer
, eu não tinha ideia de como poderia testá-lo. É uma turma muito pequena, focada nos princípios básicos da reprodução de som:
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);
}
}
Ainda sou muito novo na TDD, mas percebo os benefícios da prática e gostaria de tentar melhorar. Escrevi Code primeiro, sem testes aqui, mas era apenas eu que estava com preguiça de pensar adequadamente na maneira TDD de resolvê-lo. A pergunta que tenho é: como devo / posso testar esta aula?
audioFile.SoundPlayer
. Então teste com esta simulação, e verificar sePlaySync
eDispose
são chamados para os lugares certos. Você também deseja injetar oStartedPlayingHandler
e,StoppedPlayingHandler
se possível.Respostas:
Há muitas coisas "nas bordas" da maioria dos sistemas que não podem ser adequadamente testadas em unidade. Por exemplo, qualquer coisa que produz gráficos ou som. Para esses tipos de sistemas, provavelmente é melhor você testar manualmente. Mesmo com uma solução automatizada, esses resultados destinam-se à percepção humana. A única maneira de saber que você está produzindo o efeito desejado é ter um humano interagindo com eles.
Pode ser possível executar um teste manual, registrar a saída desse teste manual e criar um teste automatizado que garanta que a saída não seja alterada. Entretanto, esteja avisado de que testes como esses são incrivelmente frágeis: qualquer alteração no código subjacente pode exigir uma repetição do teste manual e, em seguida, criar uma nova gravação para o teste automatizado.
fonte
Obviamente, é difícil testar automaticamente se o audioplayer realmente reproduz áudio, mas você pode criar testes de unidade úteis de qualquer maneira. Por exemplo, você pode testar se StartPlaying () causa o evento StartedPlaying e StopPlaying () causa o evento StoppedPlaying. Você pode testar o comportamento ao tentar reproduzir uma lista de reprodução vazia ou uma lista de reprodução nula. Você pode testar se o AddFile realmente adiciona o arquivo à lista de reprodução. Você pode testar se, depois de reproduzir um arquivo de áudio, ele é removido da lista de reprodução (se desejado). Talvez existam casos em que arquivos de áudio quebrados etc. também merecem ser testados.
Tendo testes de unidade para essas coisas, você pode ter certeza de que a classe se comporta bem, ou seja, cumpre seus contratos. Se sim, mas ainda não reproduz som, é relativamente fácil de detectar em testes manuais.
fonte
Lembre-se de que existe uma diferença entre o Teste de Unidade , que é o ato de escrever pequenos testes que testam unidades individuais do seu código e os Executores de Teste Automatizados, que executam os testes de unidade, geralmente como parte do processo de compilação ou algum tipo de processo contínuo. sistema de integração.
( http://en.wikipedia.org/wiki/Unit_testing#Techniques )
Você pode escrever facilmente um teste de unidade para testar se um componente do reprodutor de áudio reproduz o áudio corretamente:
O que você não pode fazer facilmente é incluir esse teste em um sistema de teste automatizado. O teste automatizado é uma implementação específica do teste de unidade, mas não é a única implementação.
Consulte também: /programming/1877118/is-unit-testing-always-automated
fonte