Làm thế nào để chạy phương thức thử nghiệm đơn với phpunit?


334

Tôi đang vật lộn để chạy một phương thức thử nghiệm duy nhất có tên testSaveAndDroptrong tệp escalation/EscalationGroupTest.phpvới phpunit. Tôi đã thử các kết hợp sau:

phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=escalation/EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=testSaveAndDrop

Trong mỗi trường hợp, tất cả methode thử nghiệm trong tệp escalation/EscalationGroupTest.phpđược thực thi. Làm thế nào để chọn chỉ một phương thức thay thế?

Tên của lớp là EscalationGroupTestvà phiên bản phpunitlà 3.2.8.


Tên lớp của lớp kiểm tra của bạn là gì?
phái

Câu trả lời:


458

Lệnh sau chạy thử nghiệm trên một phương thức duy nhất:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

phpunit --filter methodName ClassName path/to/file.php

Đối với các phiên bản mới hơn của phpunit, nó chỉ là:

phpunit --filter methodName path/to/file.php

1
Đã viết EscalationgroupTest là bắt buộc? Công dụng của nó là gì?
mujaffars

2
Ok tôi hiểu rồi đó là tên lớp
mujaffars 23/2/2016

15
Nó cũng sẽ chạy phương thức thử nghiệm với tên testSaveAndDrop * (ví dụ: testSaveAndDropS Something). Để chạy chính xác testSaveAndDrop, hãy sử dụng --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov

1
@mujaffars Tôi nghi ngờ điều đó, "Tôi hiểu rồi" không phải là định danh hợp lệ trong php do khoảng trắng.
Jon McClung

2
Điều này không hoạt động bây giờ. Chỉ là phpunit --filter methodName path/to/testing/file, không ClassName .
CJ Dennis

213

Tôi thích đánh dấu bài kiểm tra trong chú thích là

/**
 * @group failing
 * Tests the api edit form
 */
public function testEditAction()

Sau đó chạy nó với

phpunit --group failing

Không cần chỉ định đường dẫn đầy đủ trong dòng lệnh, nhưng bạn phải nhớ loại bỏ điều này trước khi cam kết, không làm lộn xộn mã.

Bạn cũng có thể chỉ định một số nhóm cho một bài kiểm tra

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}

4
Tôi thích phương pháp này, có thể chỉ định nhiều nhóm thông qua chú thích không? @group failing, Integration
Chóng mặt Bryan

4
Phải, tất nhiên. Nhưng không được phân tách bằng dấu phẩy. Chỉnh sửa câu trả lời để minh họa điều này.
iamtankist

Tôi thích phương pháp này tốt hơn ... để tham khảo phần tử <Groups> trong phpunit.xml cũng có thể được sử dụng để lọc các bài kiểm tra ... sử dụng cái gì đó như thế này ngay dưới <phpunit>: <Groups> <include> <group> fail </ group > </ bao gồm> </ nhóm>
Nicolas Galler

2
Nhưng câu hỏi là - để chạy thử nghiệm SINGLE. Ngoài ra - nhóm có tên thất bại là điều tồi tệ nhất bạn có thể sử dụng. Bởi vì sau một số thử nghiệm thất bại, bạn có thể chạy phpunit - nhóm không chạy các thử nghiệm thất bại mà không cho chúng nhóm. Thật khó hiểu.
Rafał Mnich

Câu trả lời tốt nhất! KHÔNG có thử nghiệm SINGLE trong trường hợp nó @dependstừ một thử nghiệm khác vì vậy bạn phải xác định chính xác tất cả các thử nghiệm được kết nối với nhau và do đó sử dụng @groupchú thích.
centurian

116

Đây là câu trả lời chung chung hơn:

Nếu bạn chắc chắn tên phương thức là duy nhất, bạn chỉ có thể lọc theo tên phương thức (cách này hiệu quả với tôi)

phpunit --filter {TestMethodName}

Tuy nhiên, cũng an toàn hơn khi chỉ định đường dẫn / tham chiếu tệp

phpunit --filter {TestMethodName} {FilePath}

Thí dụ:

phpunit --filter testSaveAndDrop reference/to/escalation/EscalationGroupTest.php

Lưu ý nhanh: Tôi nhận thấy rằng nếu tôi có một chức năng được đặt tên testSavevà một chức năng khác có tên testSaveAndDropbằng cách sử dụng lệnh phpunit --filter testSavecũng sẽ chạy testSaveAndDropvà bất kỳ chức năng nào khác bắt đầu testSave*, điều đó thật kỳ lạ !!


4
Nó không có gì lạ cả, về cơ bản nó là một trận đấu chuỗi con. Nếu bạn muốn hành vi đó, hãy sử dụng mã thông báo kết thúc chuỗi:/testSave$/
Christian

Điều gì xảy ra nếu bạn chỉ muốn chỉ định đường dẫn tệp để tất cả các kiểm tra trong tệp đó được chạy?
still_dreaming_1

48

Lệnh sau sẽ thực hiện kiểm tra chính xác testSaveAndDrop .

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php

4
Không làm việc cho tôi. Sử dụng \bthay vì $cuối cùng đã thực hiện các mẹo : --filter '/::testSaveAndDrop\b/'.
Joe

1
Cả hai kết thúc tên phương thức '/::testSaveAndDrop\b/''/::testSaveAndDrop$/'làm việc cho tôi như thế này phpunit --filter ClassName::methodName$phpunit --filter ClassName::methodName\b(trên Linux)
Valentine Shi

22

để chạy thử nghiệm phpunit trong laravel bằng nhiều cách ..

vendor/bin/phpunit --filter methodName className pathTofile.php

vendor/bin/phpunit --filter 'namespace\\directoryName\\className::methodName'

cho lớp kiểm tra đơn:

vendor/bin/phpunit --filter  tests/Feature/UserTest.php
vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest'
vendor/bin/phpunit --filter 'UserTest' 

cho phương pháp thử nghiệm duy nhất:

 vendor/bin/phpunit --filter testExample 
 vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest::testExample'
 vendor/bin/phpunit --filter testExample UserTest tests/Feature/UserTest.php

để chạy thử nghiệm từ tất cả các lớp trong không gian tên:

vendor/bin/phpunit --filter 'Tests\\Feature'

để biết thêm cách chạy thử, xem thêm


21

Vì vậy, một cái gì đó như thế này

phpunit --filter 'EscalationGroupTest::testSaveAndDrop' EscalationGroupTest escalation/EscalationGroupTest.php 

Không có =và có'

https://phastait.de/manual/3.7/en/textui.html


Không, cái này không hoạt động. Tất cả các bài kiểm tra trong lớp EscalationGroupTestđang được xử lý.
Alex

Vẫn còn tất cả 9 bài kiểm tra đang được chạy. Phiên bản phpunit 3.2.8
Alex

2
Di chuyển --filterđến trước tên tệp và mọi thứ sẽ hoạt động đúng.
Schleis

Làm việc cho tôi trên PHPUnit 4.8.10
Asaph

Điều này mang lại cho tôi No tests executed!trên PHPUnit 4.8.35 @Schleis Bạn đã thay đổi lệnh chính xác như thế nào?
Andru

13
  • Chạy này trong thư mục gốc dự án của tôi, tôi đang sử dụng trong thư mục gốc laravel.

vendor/bin/phpunit --filter 'Your method name'

Ví dụ với tên phương thức tùy chỉnh.

 /** @test //Initilize this for custom method name, without test keyword
  *  
  * Test case For Dashboard When User Not logged In it will redirect To login page
  */
  public function only_logged_in_user_see_dashboard()
  {
    $response = $this->get('/dashboard')
                   ->assertRedirect('/login');
  }

Ví dụ với từ khóa kiểm tra

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }

1
Hãy cụ thể hơn về những gì mã của bạn đang làm.
dpapadopoulos

1
Chắc chắn bây giờ tôi là người mới bắt đầu sẽ thử mã cụ thể hơn cho các phản hồi sắp tới
Connectify_user

7

Nếu bạn đang ở netbeans, bạn có thể nhấp chuột phải vào phương thức kiểm tra và nhấp vào "Chạy Phương pháp kiểm tra tập trung".

Chạy menu Phương pháp kiểm tra tập trung


7

Bạn có thể thử điều này tôi có thể chạy các trường hợp thử nghiệm duy nhất

phpunit tests/{testfilename}

Ví dụ:

phpunit tests/StackoverflowTest.php

Nếu bạn muốn chạy các trường hợp thử nghiệm duy nhất trong Laravel 5.5 Hãy thử

vendor/bin/phpunit tests/Feature/{testfilename} 

vendor/bin/phpunit tests/Unit/{testfilename} 

Ví dụ:

vendor/bin/phpunit tests/Feature/ContactpageTest.php 

vendor/bin/phpunit tests/Unit/ContactpageTest.php

Câu hỏi là làm thế nào để chạy thử nghiệm PHƯƠNG PHÁP duy nhất (không phải lớp học)
Aleksei Akireikin

4

Lý do tất cả các bài kiểm tra của bạn đang được chạy là bạn có --filtercờ sau tên tệp. PHPUnit hoàn toàn không đọc các tùy chọn và vì vậy đang chạy tất cả các trường hợp thử nghiệm.

Từ màn hình trợ giúp:

 Usage: phpunit [options] UnitTest [UnitTest.php]
        phpunit [options] <directory>

Vì vậy, di chuyển --filterđối số trước tệp thử nghiệm mà bạn muốn như được đề cập trong các câu trả lời @Alex và @Ferid Mövsümov. Và bạn chỉ nên có bài kiểm tra mà bạn muốn chạy.


Tôi không nghĩ rằng điều này giải quyết câu hỏi ban đầu ... Tôi có cùng một vấn đề là chỉ cần chạy một trong các bài kiểm tra trong một tệp chứa nhiều bài kiểm tra đơn vị và hai câu trả lời khác sử dụng bộ lọc làm việc cho tôi
jfoo

@jfoo Một trong những vấn đề với các lệnh của OP là --filtertùy chọn nằm sau tên tệp. Hai câu trả lời khác có câu trả lời đúng nhưng không chỉ ra lý do tại sao bộ lọc được áp dụng.
Schleis


1

Tôi đến bữa tiệc muộn. Nhưng như cá nhân tôi ghét viết cả dòng.

Thay vào đó, tôi sử dụng các phím tắt sau trong tệp .bash_profile để đảm bảo nguồn .bash_profile tệp sau khi thêm bất kỳ bí danh mới nào khác mà nó không hoạt động.

alias pa="php artisan"
alias pu="vendor/bin/phpunit" 
alias puf="vendor/bin/phpunit --filter"

Sử dụng:

puf function_name

puf filename

Nếu bạn sử dụng Visual Studio Code, bạn có thể sử dụng gói sau để thực hiện các thử nghiệm của mình.

Package Name: Better PHPUnit
Link: https://marketplace.visualstudio.com/items?itemName=calebporzio.better-phpunit

Sau đó, bạn có thể đặt liên kết phím trong cài đặt. Tôi sử dụng ràng buộc Command + T trong MAC của tôi.

Bây giờ một khi bạn đặt con trỏ lên bất kỳ chức năng nào và sau đó sử dụng liên kết khóa thì nó sẽ tự động chạy thử nghiệm đơn lẻ đó.

Nếu bạn cần chạy cả lớp thì đặt con trỏ lên trên cùng của lớp và sau đó sử dụng phím ràng buộc.

Nếu bạn có bất cứ điều gì khác thì luôn luôn sẵn sàng với Terminal

Chúc mừng mã hóa!


0

Bạn phải sử dụng --filter để chạy một phương thức thử nghiệm duy nhất php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Bộ lọc trên sẽ chạy testMethod một mình.

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.