ฉันจะทดสอบเสียงได้อย่างไร


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 แต่ฉันตระหนักถึงประโยชน์ของการฝึกฝนและต้องการลองและทำให้ดีขึ้น ฉันได้เขียน Code ก่อนไม่มีการทดสอบที่นี่ แต่นั่นเป็นเพียงฉันที่ขี้เกียจเกินกว่าที่จะคิดวิธีการแก้ไข TDD ได้อย่างถูกต้อง คำถามที่ฉันมีคือฉันจะ / ทดสอบคลาสนี้ได้อย่างไร?


2
ไม่ได้มีการเยาะเย้ยกรอบใน C #? สิ่งนี้จะช่วยแก้ปัญหาของคุณได้
user43552

2
@ user43552: นั่นเป็นเพียงการทดสอบจำลอง ... สถานการณ์นี้มีวัตถุประสงค์เพื่อทดสอบเครื่องเล่นเสียง
Steven Evers

5
ฉันไม่คุ้นเคยกับวิธีการทำเสียงใน C # แต่มันดูเหมือนว่าฉันว่าคุณจำเป็นต้อง refactor audioFile.SoundPlayerระดับนี้เพื่อให้คุณสามารถฉีดจำลองในสถานที่ของ จากนั้นทดสอบด้วยการจำลองนี้และตรวจสอบว่าPlaySyncและDisposeถูกเรียกในสถานที่ที่เหมาะสม คุณต้องการที่จะฉีดStartedPlayingHandlerและStoppedPlayingHandlerถ้าเป็นไปได้
Dawood กล่าวว่าคืนสถานะโมนิก้า

2
สิ่งนี้ไม่ควรอยู่ใน stackoverflow หรือ
Amr H. Abd Elmajeed

3
@ AmrH.AbdelMajeed - เพราะอะไร เพียงเพราะมันมีรหัส?
ChrisF

คำตอบ:


10

มีหลายสิ่ง "ที่ขอบ" ของระบบส่วนใหญ่ที่ไม่สามารถทดสอบได้อย่างเพียงพอ ตัวอย่างเช่นสิ่งใดก็ตามที่สร้างกราฟิกหรือเสียง สำหรับระบบประเภทนี้คุณน่าจะดีที่สุดเมื่อใช้การทดสอบด้วยตนเอง แม้จะได้รับโซลูชันอัตโนมัติผลลัพธ์เหล่านี้มีไว้สำหรับการรับรู้ของมนุษย์ วิธีเดียวที่จะรู้ว่าคุณกำลังสร้างเอฟเฟกต์ที่ต้องการคือการมีปฏิสัมพันธ์กับมนุษย์

อาจเป็นไปได้ที่จะทำการทดสอบด้วยตนเองจากนั้นบันทึกผลลัพธ์ของการทดสอบด้วยตนเองนั้นและสร้างการทดสอบอัตโนมัติที่ทำให้มั่นใจได้ว่าผลลัพธ์จะไม่เปลี่ยนแปลง ได้รับการเตือนว่าการทดสอบเช่นนี้มีความเปราะบางอย่างไม่น่าเชื่อ: การเปลี่ยนแปลงใด ๆ กับรหัสอ้างอิงอาจต้องมีการทดสอบซ้ำด้วยตนเองจากนั้นจึงสร้างการบันทึกใหม่สำหรับการทดสอบอัตโนมัติ


1
+1 สำหรับ 'มีหลายสิ่ง "ที่ขอบ" ของระบบส่วนใหญ่ที่ไม่สามารถทดสอบหน่วยได้อย่างเพียงพอ'

2
คำตอบนี้ทำให้เข้าใจผิดอย่างมาก เพียงเพราะอุปกรณ์ส่งออกสุดท้ายสำหรับรหัสเสียงมักจะเป็นคู่ของลำโพงก็ไม่ได้หมายความว่ารหัสเสียงไม่สามารถทดสอบหน่วยหรือว่าจะต้องมีการทดสอบการรับรู้ ซอฟต์แวร์เสียงทั้งหมดมีเอาต์พุตดิจิตอลที่สามารถวัดและเปรียบเทียบกับเอาต์พุตที่ต้องการ วิธีหนึ่งในการทดสอบเสียงหน่วยสามารถพบได้ในบทความนี้
jb

9

เห็นได้ชัดว่าเป็นการยากที่จะทดสอบโดยอัตโนมัติว่า audioplayer เล่นเสียงจริงๆแต่คุณสามารถสร้างการทดสอบหน่วยที่มีประโยชน์ได้ ตัวอย่างเช่นคุณสามารถทดสอบได้ว่า StartPlaying () เป็นสาเหตุของเหตุการณ์ StartedPlaying และ StopPlaying () ทำให้เกิดเหตุการณ์ StoppedPlaying คุณสามารถทดสอบพฤติกรรมเมื่อพยายามเล่นเพลย์ลิสต์เปล่าหรือเพลย์ลิสต์ว่าง คุณสามารถทดสอบว่า AddFile เพิ่มไฟล์ลงในเพลย์ลิสต์จริงๆ คุณสามารถทดสอบได้ว่าหลังจากเล่นไฟล์เสียงแล้วไฟล์นั้นจะถูกลบออกจากเพลย์ลิสต์ (หากต้องการ) อาจจะมี cornercases สำหรับไฟล์เสียงที่ใช้งานไม่ได้เป็นต้นซึ่งควรได้รับการทดสอบ

มีการทดสอบหน่วยสำหรับสิ่งเหล่านั้นคุณสามารถมั่นใจได้ว่าระดับการทำงานที่ดีคือตรงตามสัญญา ถ้าเป็นเช่นนั้น แต่ยังคงไม่มีเสียงนั่นเป็นเรื่องง่ายในการทดสอบด้วยตนเอง


3

โปรดทราบว่ามีความแตกต่างระหว่างการทดสอบหน่วยซึ่งเป็นการเขียนการทดสอบขนาดเล็กที่ทดสอบแต่ละหน่วยของรหัสของคุณและAutomated Test Runnersที่ใช้การทดสอบหน่วยของคุณซึ่งมักจะเป็นส่วนหนึ่งของกระบวนการสร้างหรือต่อเนื่องบางชนิด ระบบบูรณาการ

การทดสอบหน่วยเป็นเรื่องปกติโดยอัตโนมัติ แต่อาจยังดำเนินการด้วยตนเอง IEEE ไม่ชอบสิ่งใดสิ่งหนึ่งเหนือสิ่งอื่นใด วัตถุประสงค์ในการทดสอบหน่วยคือการแยกหน่วยและตรวจสอบความถูกต้องของมัน วิธีการทดสอบหน่วยด้วยตนเองอาจใช้เอกสารการเรียนการสอนทีละขั้นตอน

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

คุณสามารถเขียนการทดสอบหน่วยเพื่อทดสอบว่าองค์ประกอบเครื่องเล่นเสียงเล่นเสียงอย่างถูกต้อง:

  1. ตรวจสอบให้แน่ใจว่าลำโพงของคุณใช้งานได้และเปิดเสียงแล้ว
  2. ไปที่ / my / test / โฟลเดอร์
  3. ดำเนินการ myTestRunner audioPlayerTest.script.thingee
  4. คุณควรจะได้ยินการเล่นซิมโฟนีที่ 5 ของ Beethoven เป็นเวลา 15 วินาที
  5. หากคุณไม่ได้ยินเสียงใด ๆ เสียงที่เล่นมากหรือน้อยกว่า 15 วินาทีหรือผิดเพี้ยนไปการทดสอบล้มเหลว มิฉะนั้นการทดสอบผ่าน

สิ่งที่คุณไม่สามารถทำได้อย่างง่ายดายคือการทดสอบนั้นในระบบทดสอบอัตโนมัติ การทดสอบอัตโนมัติเป็นการดำเนินการทดสอบหน่วยโดยเฉพาะ แต่มันไม่ได้เป็นการติดตั้งเพียงอย่างเดียว

ดูเพิ่มเติมที่: /programming/1877118/is-unit-testing-always-automated

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.