오디오를 단위 테스트하려면 어떻게해야합니까?


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에서 매우 신입이지만 연습의 이점을 깨닫고 더 열심히 노력하고 싶습니다. 코드를 먼저 작성했지만 여기에는 테스트가 없지만 TDD를 해결하는 방법을 제대로 생각하기에는 너무 게으른 것입니다. 내가 가진 질문은 어떻게이 수업을 테스트해야합니까?


2
C #에 조롱 프레임 워크가 없습니까? 문제를 해결해야합니다.
user43552

2
@ user43552 : 모의 테스트 중입니다 ...이 시나리오는 오디오 플레이어를 테스트하기위한 것입니다.
Steven Evers

5
C #에서 오디오를 수행하는 방법에 익숙하지 않지만이 클래스를 리팩터링하여 mock 대신 mock을 주입해야 할 것 같습니다 audioFile.SoundPlayer. 그런 다음이 모의과 시험, 그리고 다음을 확인 PlaySync하고 Dispose적절한 장소라고합니다. 또한 주입 할 수 있기를 원하는 StartedPlayingHandler과를 StoppedPlayingHandler가능하면.
Dawood는 Monica Monica를

2
이것이 stackoverflow에 있지 않아야합니까?
Amr H. Abd Elmajeed 오전

3
@ AmrH.AbdelMajeed-왜? 코드가 있다고해서?
ChrisF

답변:


10

단위 테스트를 제대로 수행 할 수없는 대부분의 시스템에는 "가장자리에"많은 것들이 있습니다. 예를 들어, 그래픽이나 사운드를 생성하는 모든 것. 이러한 종류의 시스템의 경우 수동 테스트를 수행하는 것이 가장 좋습니다. 자동화 된 솔루션을 제공하더라도 이러한 결과는 인간의 인식을위한 것입니다. 원하는 효과를 내고 있다는 것을 아는 유일한 방법은 인간이 그 효과를 느끼도록하는 것입니다.

수동 테스트를 수행 한 다음 해당 수동 테스트의 출력을 기록하고 출력이 변경되지 않는 자동화 된 테스트를 생성 할 수 있습니다. 기본 코드를 변경하면 수동 테스트를 반복 한 다음 자동 테스트를위한 새 기록을 만들어야 할 수 있습니다.


1
'대부분의 시스템에는 유닛 테스트를 할 수없는 많은 것들이 있습니다.'

2
이 답변은 오도의 소지가 있습니다. 오디오 코드 의 최종 출력 장치 가 종종 스피커 쌍 이기 때문에 오디오 코드를 단위로 테스트 할 수 없거나 지각 적으로 테스트해야한다는 의미는 아닙니다. 모든 오디오 소프트웨어에는 측정 및 예상 출력과 비교할 수있는 디지털 출력이 있습니다. 단위 테스트 오디오에 대한 하나의 접근 방식에서 찾을 수 있습니다 본 논문
JB

9

오디오 플레이어가 실제로 오디오를 재생 하는지 자동으로 테스트하는 것은 어렵지만 어쨌든 유용한 단위 테스트를 만들 수 있습니다. 예를 들어 StartPlaying ()으로 인해 BeginPlaying 이벤트가 발생하고 StopPlaying ()으로 인해 StoppedPlaying 이벤트가 발생하는지 테스트 할 수 있습니다. 빈 재생 목록이나 null 재생 목록을 재생하려고 할 때 동작을 테스트 할 수 있습니다. AddFile이 실제로 파일을 재생 목록에 추가하는지 테스트 할 수 있습니다. 오디오 파일을 재생 한 후 재생 목록에서 해당 파일이 제거되는지 테스트 할 수 있습니다 (필요한 경우). 테스트를받을만한 오디오 파일 등이있을 수 있습니다.

이러한 것들에 대한 단위 테스트를 통해 클래스가 잘 작동하는지, 즉 계약을 충족하는지 확인할 수 있습니다. 그래도 소리가 들리지 않으면 수동 테스트에서 쉽게 잡을 수 있습니다.


3

코드의 개별 단위를 테스트하는 작은 테스트를 작성하는 작업 인 단위 테스팅 과 일반적으로 빌드 프로세스의 일부 또는 연속적인 일부로 단위 테스트를 실행하는 자동화 된 테스트 러너 간에는 차이점 이 있습니다. 통합 시스템.

단위 테스트는 일반적으로 자동화되지만 여전히 수동으로 수행 될 수 있습니다. IEEE는 다른 것보다 선호하지 않습니다. 단위 테스트의 목표는 단위를 분리하고 정확성을 확인하는 것입니다. 단위 테스트에 대한 수동 접근 방식은 단계별 지침 문서를 사용할 수 있습니다.

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

오디오 플레이어 구성 요소가 오디오를 올바르게 재생하는지 테스트하기 위해 단위 테스트를 쉽게 작성할 수 있습니다.

  1. 스피커가 작동하고 볼륨이 켜져 있는지 확인하십시오.
  2. / my / test / folder로 이동하십시오.
  3. myTestRunner audioPlayerTest.script.thingee를 실행하십시오.
  4. 15 초 동안 베토벤의 5 번 교향곡 연주를들을 수 있습니다.
  5. 아무 소리도 들리지 않거나 오디오가 15 초 이상 재생되거나 어떤 방식 으로든 왜곡 된 경우 테스트에 실패한 것입니다. 그렇지 않으면 테스트가 통과되었습니다.

쉽게 할 수없는 것은 자동화 된 테스트 시스템에 해당 테스트를 포함시키는 것입니다. 자동 테스트는 단위 테스트의 특정 구현이지만 이것이 유일한 구현 은 아닙니다 .

참조 : https : //.com/questions/1877118/is-unit-testing-always-automated

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.