Como posso testar o áudio do aparelho?

13

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 TypedAudioCreatorcria 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?

IAE
fonte
2
Não existem estruturas de simulação em C #? Isso deve resolver seus problemas.
user43552
2
@ user43552: Isso seria apenas um teste simulado ... este cenário destina-se a testar o reprodutor de áudio.
Steven Evers
5
Eu não estou familiarizado com como fazer áudio em C #, mas parece-me que você precisa refatorar essa classe para poder injetar uma simulação no lugar de audioFile.SoundPlayer. Então teste com esta simulação, e verificar se PlaySynce Disposesão chamados para os lugares certos. Você também deseja injetar o StartedPlayingHandlere, StoppedPlayingHandlerse possível.
Dawood diz que restabelece Monica
2
Isso não deveria estar no stackoverflow?
Amr H. Abd Elmajeed
3
@ AmrH.AbdelMajeed - por que? Só porque tem código?
ChrisF

Respostas:

10

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.

Chris Pitman
fonte
1
+1 em 'Há muitas coisas "nas bordas" da maioria dos sistemas que não podem ser adequadamente testadas em unidade. "
2
Esta resposta é altamente enganadora. Só porque o dispositivo de saída final para o código de áudio geralmente é um par de alto-falantes, isso não significa que o código de áudio não pode ser testado em unidade ou que precisa ser testado perceptivamente. Todo software de áudio possui uma saída digital que pode ser medida e comparada com uma saída esperada. Uma abordagem para o áudio de teste de unidade pode ser encontrada neste documento
jb
9

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.

user281377
fonte
3

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.

O teste de unidade é geralmente automatizado, mas ainda pode ser realizado manualmente. O IEEE não favorece um sobre o outro. O objetivo no teste de unidade é isolar uma unidade e validar sua correção. Uma abordagem manual ao teste de unidade pode empregar um documento instrucional passo a passo.

( 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:

  1. Verifique se os alto-falantes estão funcionando e se o volume está alto.
  2. Vá para / my / test / folder.
  3. Execute myTestRunner audioPlayerTest.script.thingee.
  4. Você deve ouvir a 5ª Sinfonia de Beethoven tocando por 15 segundos.
  5. Se você não ouviu nada, o áudio foi reproduzido por mais de 15 segundos ou foi distorcido de alguma forma, o teste falhou. Caso contrário, o teste passou.

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

lfalin
fonte