1

Đôi khi chúng ta đang ở giữa viết một bài kiểm tra và một bài kiểm tra không liên quan khác có thể xuất hiện trong tâm trí. Bây giờ chúng tôi đang ở trong một tình huống khó khăn: Phát triển dựa trên thử nghiệm bảo chúng tôi đi từng bước một vì những lý do chính đáng. Nhưng nếu chúng ta chỉ chờ đợi trước khi chèn bài kiểm tra đó, chúng ta có thể quên nó ngay cả khi đó là một trường hợp góc khó chịu.

Chúng tôi cần một cách tiếp cận để lưu trữ các thử nghiệm này ở đâu đó, hy vọng rằng trong tương lai chúng có thể được thực hiện (hoặc loại bỏ khi phân tích sâu hơn).

Những gì chúng ta muốn

Chúng tôi không muốn viết bài kiểm tra trên một ghi chú Post-it , vì nó có thể sẽ bị lãng quên giống như trong RAM não của chính chúng ta. Một điều tốt đẹp sẽ là giữ cho thử nghiệm mới này trong kiểm soát nguồn, ngay cả khi nó sẽ thất bại ngay bây giờ.

Nếu chúng tôi sẽ giới thiệu nó trong Lớp Testcase , chúng tôi không muốn có tác dụng phụ đối với các thử nghiệm đã có (không có sự bùng nổ của bộ phần mềm hoặc lỗi biên dịch).
Một xấp xỉ đầu tiên của giải pháp có thể là một Phương pháp kiểm tra trống:

public function testThatXDoesY() {}

hoặc tinh vi hơn một chút:

public function testThatXDoesY()
{
    //call method Z and check W is equal to K
}

Tuy nhiên, chúng tôi muốn được nói rằng thử nghiệm này không có màu xanh. Một bài kiểm tra trống là một kết quả dương tính giả : chúng ta thấy một dấu chấm ở đầu ra và chúng ta có thể quên đi qua bài kiểm tra đó một lần nữa để thực sự viết một số mã trong đó.

Do đó, một phép tính gần đúng khác có thể chỉ là ném một ngoại lệ để làm cho bài kiểm tra thất bại:

public function testThatXDoesY()
{
    throw new Exception('Write me!');
}

Nhưng thường chúng ta muốn phân biệt giữa các bài kiểm tra mà chúng ta vẫn phải viết và hồi quy. Trong trường hợp đó, chúng tôi muốn một thông điệp rõ ràng cho chúng tôi biết rằng bài kiểm tra này vẫn chưa hoàn thành (không thất bại: chỉ chưa hoàn thành) và chúng tôi có thể làm gì để khắc phục nó.

Trong tất cả các kịch bản này, chúng tôi có thể giới thiệu Xác nhận kiểm tra chưa hoàn thành , đây là một xác nhận luôn thất bại và cung cấp một thông điệp có ý nghĩa cho sự thất bại. Một số khẳng định này thất bại theo những cách đặc biệt (xem phần Thực hiện trong PHPUnit.)

Đó cũng là lẽ thường khi bao gồm các Xác nhận kiểm tra chưa hoàn thành khi các thử nghiệm được tạo ra (una tantum) bởi một số quy trình khác và được các nhà phát triển triển khai tại thời điểm đó. Ngay cả khi các thử nghiệm này được trải rộng trong bộ phần mềm của bạn, bạn luôn có thể theo dõi chúng bằng cách chạy toàn bộ.

Triển khai trong PHPUnit

Về cơ bản, bên trong PHPUnit_Framework_TestCase, bạn có ba phương thức để thực hiện Xác nhận kiểm tra chưa hoàn thành:

  • $ this-> fail ('message') hiển thị F thay vì a. trong kết quả, và ngụ ý một thanh màu đỏ . Đó chỉ là một cách ngữ nghĩa để thực thi $ this-> assertTrue (false).
  • $ this-> markTestSkipped ('message') hiển thị chữ S trong kết quả và ngụ ý một thanh màu vàng thay vì màu xanh lục.
  • $ this-> markTestIncomplete ('message') hiển thị I trong kết quả và cũng ngụ ý một thanh màu vàng .

Tất nhiên bạn có thể bọc các phương pháp cơ bản này với của bạn.

Sự khác biệt giữa các thử nghiệm bị bỏ qua và không đầy đủ chỉ là ngữ nghĩa, không có chức năng: các thử nghiệm không đầy đủ thiếu mã, bị bỏ qua là hoàn thành nhưng không thể chạy trong môi trường hiện tại hoặc do một số thử nghiệm khác đã thất bại.

Sự khác biệt giữa $ this-> fail () và các phương thức khác khá rõ ràng: ngay cả một thử nghiệm thất bại cũng dẫn đến một thanh màu đỏ, trong khi các thử nghiệm bị bỏ qua và không đầy đủ làm cho thanh màu vàng, đây là một vấn đề ít nghiêm trọng hơn.

Thí dụ

Tôi đã bao gồm một lớp Testcase mẫu cho thấy việc sử dụng các phương thức được xác định trước khác nhau, cộng với một phương thức tùy chỉnh.

Nếu bạn thực sự muốn xem các thông báo của các bài kiểm tra bị bỏ qua và không đầy đủ, bạn phải chạy phpunit --verbose thay vì chỉ đơn giản là phpunit .

Mã này cũng có sẵn trên kho Github cho loạt bài này: https://github.com/giorgiosironi/prreal-php-testing-potypes .

<?php
class UnfinishedTestAssertions extends PHPUnit_Framework_TestCase
{
    public function testThatFails()
    {
        $this->fail('Write this test, you should check that X does Y.');
    }

    public function testThatIsSkipped()
    {
        $this->markTestSkipped('To execute this test, you need an active Internet connection.');
    }

    public function testThatIsIncomplete()
    {
        $fixture = new ArrayObject();
        $fixture['key'] = 'value';

        $this->markTestIncomplete('This test needs to be finished: the act and assert parts are missing.');
    }

    public function testThatIsDeclaredIncompleteWithCustomUnifinishedTestAssertion()
    {
        $this->assertionWillBeNeeded();
    }

    private function assertionWillBeNeeded()
    {
        $this->markTestIncomplete('The test lacks an assert phase. Write it.');
    }
}
|