Làm thế nào tôi có thể đơn vị kiểm tra âm thanh?


13

Tôi đã kế thừa một dự án nhỏ và muốn mở rộng nó và ổn định nó cùng một lúc bằng cách viết Bài kiểm tra đơn vị cho tất cả các mã mới mà tôi đang thêm. Lớp đầu tiên TypedAudioCreator, tạo các tệp âm thanh và điều này hóa ra rất dễ dàng để kiểm tra đầu tiên và viết mã cho lần thứ hai.

Tuy nhiên, khi đến lúc viết TypedAudioPlayer, tôi không biết làm thế nào tôi có thể kiểm tra nó. Đó là một lớp rất nhỏ tập trung vào những điều cơ bản của việc phát âm thanh:

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);
    }
}

Tôi vẫn còn rất mới ở TDD, nhưng tôi nhận ra lợi ích của việc luyện tập và muốn thử và cải thiện nó. Tôi đã viết Code trước, không có bài kiểm tra nào ở đây, nhưng đó chỉ là tôi quá lười biếng để nghĩ đúng cách giải quyết TDD. Câu hỏi tôi có là, làm thế nào tôi có thể / kiểm tra lớp này?


2
Không có khung mô phỏng trong C #? Điều này sẽ giải quyết vấn đề của bạn.
dùng43552

2
@ user43552: Đó sẽ chỉ là thử nghiệm giả ... kịch bản này nhằm kiểm tra trình phát âm thanh.
Steven Evers

5
Tôi không quen với cách tạo âm thanh trong C #, nhưng dường như với tôi rằng bạn cần cấu trúc lại lớp này để bạn có thể đưa ra một bản giả thay thế audioFile.SoundPlayer. Sau đó kiểm tra với giả này, và xác minh điều đó PlaySyncDisposeđược gọi đúng nơi. Bạn cũng muốn có thể tiêm StartedPlayingHandlerStoppedPlayingHandlernếu có thể.
Dawood nói phục hồi Monica

2
Đây không phải là trên stackoverflow?
Amr H. Abd Elmajeed

3
@ AmrH.AbdelMajeed - tại sao? Chỉ vì nó có mã?
ChrisF

Câu trả lời:


10

Có nhiều thứ "trên các cạnh" của hầu hết các hệ thống không thể được kiểm tra đầy đủ đơn vị. Ví dụ, bất cứ thứ gì tạo ra đồ họa hoặc âm thanh. Đối với các loại hệ thống này, có lẽ bạn là tốt nhất với thử nghiệm thủ công. Ngay cả khi đưa ra một giải pháp tự động, những đầu ra này có ý nghĩa đối với nhận thức của con người. Cách duy nhất để biết rằng bạn đang tạo ra hiệu ứng mong muốn là có một con người tương tác với chúng.

Có thể thực hiện kiểm tra thủ công, sau đó ghi lại đầu ra của kiểm tra thủ công đó và tạo một kiểm tra tự động để đảm bảo rằng đầu ra không thay đổi. Được cảnh báo mặc dù các thử nghiệm như thế này rất dễ vỡ: mọi thay đổi đối với mã cơ bản có thể yêu cầu lặp lại thử nghiệm thủ công và sau đó tạo bản ghi mới cho thử nghiệm tự động.


1
+1 cho 'Có nhiều thứ "trên các cạnh" của hầu hết các hệ thống không thể được kiểm tra đầy đủ đơn vị.'

2
Câu trả lời này rất sai lệch. Chỉ vì thiết bị đầu ra cuối cùng cho mã âm thanh thường là một cặp loa, điều đó không có nghĩa là mã âm thanh không thể được kiểm tra đơn vị hoặc nó cần phải được kiểm tra theo cảm nhận. Tất cả các phần mềm âm thanh có đầu ra kỹ thuật số có thể được đo và so sánh với đầu ra dự kiến. Một cách tiếp cận với âm thanh thử nghiệm đơn vị có thể được tìm thấy trong bài báo này
jb

9

Rõ ràng rất khó để tự động kiểm tra rằng audioplayer thực sự phát âm thanh, nhưng dù sao bạn cũng có thể tạo các bài kiểm tra đơn vị hữu ích. Ví dụ: bạn có thể kiểm tra xem StartPlay () gây ra sự kiện StartedPlay và StopPlay () gây ra sự kiện StoppedPlay. Bạn có thể kiểm tra hành vi khi cố gắng phát danh sách phát trống hoặc danh sách phát null. Bạn có thể kiểm tra xem AddFile thực sự thêm tệp vào danh sách phát. Bạn có thể kiểm tra xem sau khi phát tệp âm thanh, tệp đó sẽ bị xóa khỏi danh sách phát (nếu muốn). Có thể có các cornercase cho các tập tin âm thanh bị hỏng, vv quá xứng đáng để thử nghiệm.

Có các bài kiểm tra đơn vị cho những điều đó, bạn có thể chắc chắn rằng lớp học cư xử tốt, tức là đáp ứng các hợp đồng của nó. Nếu có, nhưng vẫn không phát ra âm thanh, điều đó tương đối dễ bắt trong các bài kiểm tra thủ công.


3

Hãy nhớ rằng có một sự khác biệt giữa Kiểm thử đơn vị , đó là hành động viết các thử nghiệm nhỏ kiểm tra từng đơn vị mã của bạn và Chạy thử nghiệm tự động chạy thử nghiệm đơn vị của bạn, thường là một phần của quá trình xây dựng hoặc một loại liên tục hệ thống tích hợp.

Kiểm tra đơn vị thường tự động, nhưng vẫn có thể được thực hiện thủ công. Các IEEE không ủng hộ cái này hơn cái kia. Mục tiêu trong thử nghiệm đơn vị là cô lập một đơn vị và xác nhận tính đúng đắn của nó. Một cách tiếp cận thủ công để kiểm tra đơn vị có thể sử dụng một tài liệu hướng dẫn từng bước.

( http://en.wikipedia.org/wiki/Unit_testing#T kỹ thuật )

Bạn có thể dễ dàng viết một bài kiểm tra đơn vị để kiểm tra xem thành phần trình phát âm thanh có phát âm thanh chính xác không:

  1. Đảm bảo loa của bạn đang hoạt động và âm lượng được bật lên.
  2. Chuyển đến / my / test / thư mục.
  3. Thực thi myTestRunner audioPlayerTest.script.thingee.
  4. Bạn nên nghe Bản giao hưởng số 5 của Beethoven trong 15 giây.
  5. Nếu bạn không nghe thấy gì, âm thanh phát nhiều hơn hoặc ít hơn 15 giây hoặc bị biến dạng theo bất kỳ cách nào, thử nghiệm thất bại. Nếu không, bài kiểm tra đã qua.

Những gì bạn không thể dễ dàng làm là bao gồm kiểm tra đó trong một hệ thống kiểm tra tự động. Kiểm thử tự động là một triển khai cụ thể của kiểm thử đơn vị, nhưng nó không phải là triển khai duy nhất .

Xem thêm: /programming/1877118/is-unit-testing-always-automated

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.