Làm thế nào để bỏ qua các bài kiểm tra trong PHPunit?


88

Tôi đang sử dụng phpunit liên quan đến jenkins và tôi muốn bỏ qua một số kiểm tra nhất định bằng cách đặt cấu hình trong tệp XML phpunit.xml

Tôi biết rằng tôi có thể sử dụng trên dòng lệnh:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

làm cách nào để dịch nó sang tệp XML vì <filters>thẻ chỉ dành cho phạm vi mã?

Tôi muốn chạy tất cả các bài kiểm tra ngoài testStuffThatAlwaysBreaks


1
KO: sửa bài kiểm tra thì sao? btw, xin chào từ rất tốt ;-)
zerkms

Tôi đã không viết các bài kiểm tra, đó là một cái gì đó không thích hợp, và cũng không muốn thay đổi các tập tin cốt lõi
Filype

Không ngờ rằng bạn có thể làm như vậy. Đó là một yêu cầu rất lạ
zerkms

Tái bút: bạn đã đề cập đến bộ lọc - nhưng nó không thể giúp bạn, vì nó loại trừ tất cả đường dẫn. Nếu không <exclude>- sẽ làm việc cho bạn
zerkms

bạn có thể đăng tệp phpunit.xml.dist được đề xuất không?
Filype

Câu trả lời:


167

Cách nhanh nhất và dễ nhất để bỏ qua các bài kiểm tra bị hỏng hoặc bạn cần tiếp tục làm việc sau đó là chỉ cần thêm phần sau vào đầu bài kiểm tra đơn vị cá nhân của bạn:

$this->markTestSkipped('must be revisited.');

bạn luôn có thể thêm thư mục hoặc kiểm tra vào tệp cấu hình xml, tuy nhiên, nếu đây là bộ điều khiển hoặc tương tự thì điều đó thực sự không thực tế lắm vì bạn có thể có hàng tá kiểm tra khác trong tệp đó. Tôi đoán nếu bạn không có quyền truy cập vào các bài kiểm tra đơn vị, không chắc tôi hiểu tại sao, thì bạn không có lựa chọn nào khác ngoài việc loại trừ.
jsteinmann

5
Vì nó là một phương thức tĩnh (ít nhất là trong PHPUnit 3) và một số lớp sử dụng afaik liên kết tĩnh muộn, bạn nên sử dụng static::markTestSkipped('');thay thế $this->. Nó sẽ tạo ra một cảnh báo trong các Phiên bản PHP mới hơn. Chữ ký: public static function markTestSkipped($message = '')
Daniel W.

Cần một ví dụ tốt hơn về tệp thử nghiệm đơn vị đầy đủ. Không chỉ là một đoạn trích.
Ligemer

@DanielW. các phpunit hướng dẫn chính thức có ví dụ cho thấy$this->markTestSkipped()
nulll

@nulll bạn có thể thấy trong mã nguồn của 6.5 , markTestSkipped()vẫn là một phương thức tĩnh.
Daniel W.

30

Nếu bạn có thể giải quyết việc bỏ qua toàn bộ tệp thì

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>

Đây là những gì tôi đã cố gắng, vẫn nó nói 893 bài kiểm tra mà không có sự <exclude>và 893 xét nghiệm với<exclude>
Filype

1
Các bài kiểm tra mất khoảng 20 phút để chạy, có cách nào dễ dàng để xem nó sẽ chạy bao nhiêu bài kiểm tra không? hiện nay, tôi phải chờ đến hàng đầu tiên được hoàn thành....... 63 / 893 ( 7%)
Filype

5
@Filype: thì có thể bạn đã chỉ định sai đường dẫn. Nó hoạt động tốt cho tôi. Không chắc liệu có thể nhận được số lượng xét nghiệm hay không. PS: các bài kiểm tra đơn vị không nên chạy quá lâu. Tôi khuyên bạn nên sử dụng @groupchú thích và chia kiểm tra bởi bản chất của họ
zerkms

20

Đôi khi, rất hữu ích khi bỏ qua tất cả các bài kiểm tra từ tệp cụ thể dựa trên (các) điều kiện tùy chỉnh được xác định là mã php. Bạn có thể dễ dàng làm điều đó bằng cách sử dụng hàm setUp trong đó makeTestSkipped cũng hoạt động.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition có thể được truyền qua một số phương thức / thuộc tính lớp tĩnh, một hằng số được xác định trong tệp bootstrap phpunit hoặc thậm chí là một biến toàn cục.


Một là những gì Configlớp học? Tôi đặt nó ở đâu?
cronfy

@cronfy nó có thể là bất kỳ lớp nào có thể truy cập phạm vi toàn cầu (mẫu thiết kế Singleton / Register) hoặc thậm chí là biến toàn cục được đặt trong tệp bootstrap trong phpunit. Về cơ bản logic là: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski

loại bỏ các điều kiện và câu trả lời của bạn sẽ là thẳng về phía trước ... "markTestSkipped bên trong thiết lập để bỏ qua toàn bộ tập tin"
Spark

1
@SparK Tôi hiểu ý bạn nhưng tôi đã đưa ra cách bỏ qua có điều kiện toàn bộ lớp kiểm tra. Tôi đã thay đổi nó một chút, loại bỏ cách làm tùy chỉnh của tôi để có lợi cho quy tắc chung.
Konrad Gałęzowski
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.