จะรันวิธีทดสอบเดี่ยวด้วย phpunit ได้อย่างไร


335

ฉันกำลังดิ้นรนที่จะใช้วิธีการทดสอบเดียวชื่อtestSaveAndDropในแฟ้มที่มีescalation/EscalationGroupTest.php phpunitฉันลองชุดค่าผสมต่อไปนี้:

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

ในแต่ละกรณีทั้งหมด Methode ทดสอบในไฟล์escalation/EscalationGroupTest.phpจะดำเนินการ วิธีการเลือกเพียงวิธีเดียวแทนได้อย่างไร

ชื่อของคลาสคือEscalationGroupTestและรุ่นของphpunit3.2.8


ชื่อคลาสของคลาสทดสอบของคุณคืออะไร?
ส่วนของ

คำตอบ:


459

คำสั่งต่อไปนี้รันการทดสอบด้วยวิธีการเดียว:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

สำหรับ phpunit เวอร์ชั่นใหม่มันเป็นเพียง:

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

1
จำเป็นต้องใช้การเขียน EscalationGroupTest หรือไม่ การใช้งานของมันคืออะไร?
mujaffars

2
ตกลงฉันได้รับมันเป็นชื่อคลาส
mujaffars

15
มันจะรันเมธอดการทดสอบด้วยชื่อ testSaveAndDrop * (ตัวอย่าง: testSaveAndDropSomething) เช่นกัน เมื่อต้องการเรียกใช้ testSaveAndDrop ให้ใช้ --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov

1
@mujaffars ฉันสงสัยว่า "ฉันเข้าใจแล้ว" ไม่ใช่ตัวระบุที่ถูกต้องใน php เนื่องจากช่องว่าง
Jon McClung

2
ไม่สามารถใช้งานได้ในขณะนี้ มันเป็นเพียงแค่ไม่มีphpunit --filter methodName path/to/testing/file ClassName
CJ Dennis

213

ฉันชอบทำเครื่องหมายการทดสอบในคำอธิบายประกอบเป็น

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

จากนั้นรันด้วย

phpunit --group failing

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

คุณอาจระบุหลายกลุ่มสำหรับการทดสอบเดี่ยว

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

4
ฉันชอบวิธีนี้เป็นไปได้ไหมที่จะกำหนดกลุ่มหลายกลุ่มผ่านการเพิ่มความคิดเห็น @group failing, Integration
Dizzy Bryan High

4
ใช่แน่นอน แต่ไม่คั่นด้วยเครื่องหมายจุลภาค แก้ไขคำตอบเพื่อแสดงสิ่งนี้
iamtankist

ฉันชอบวิธีนี้ดีกว่า ... สำหรับการอ้างอิงองค์ประกอบ <groups> ใน phpunit.xml นอกจากนี้ยังสามารถใช้ในการกรองการทดสอบ ... ใช้สิ่งเช่นนี้ภายใต้<phpunit>: <groups><include> <group> ล้มเหลว </ กลุ่ม > </include> </groups>
Nicolas Galler

2
แต่คำถามก็คือ - เพื่อรันการทดสอบ SINGLE นอกจากนี้กลุ่มที่ล้มเหลวคือชื่อที่แย่ที่สุดที่คุณสามารถใช้ได้ เพราะหลังจากการทดสอบบางอย่างล้มเหลวคุณสามารถเรียกใช้ phpunit - กลุ่มล้มเหลวในการเรียกใช้การทดสอบที่ล้มเหลวโดยไม่ต้องให้กลุ่ม มันสับสน
Rafał Mnich

คำตอบที่ดีที่สุด! ไม่มีการทดสอบแบบเดี่ยวในกรณีที่มีการทดสอบ@dependsอื่นดังนั้นคุณต้องระบุการทดสอบที่เชื่อมต่อทั้งหมดและใช้@groupคำอธิบายประกอบ
centurian

117

นี่คือคำตอบทั่วไปเพิ่มเติม:

หากคุณแน่ใจว่าชื่อวิธีนั้นไม่เหมือนใครคุณสามารถกรองตามชื่อวิธีเท่านั้น(ใช้ได้กับฉัน)

phpunit --filter {TestMethodName}

อย่างไรก็ตามมันจะปลอดภัยกว่าในการระบุพา ธ / การอ้างอิงของไฟล์เช่นกัน

phpunit --filter {TestMethodName} {FilePath}

ตัวอย่าง:

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

บันทึกด่วน: ฉันสังเกตเห็นว่าถ้าฉันมีฟังก์ชั่นที่มีชื่อtestSaveและฟังก์ชั่นอื่นที่ชื่อว่าการtestSaveAndDropใช้คำสั่งphpunit --filter testSaveจะทำงานtestSaveAndDropและฟังก์ชั่นอื่น ๆ ที่เริ่มต้นด้วยtestSave*มันแปลก !!


4
มันไม่แปลกเลยมันเป็นการจับคู่สตริงย่อย หากคุณต้องการพฤติกรรมที่ใช้จุดสิ้นสุดของสายโทเค็น:/testSave$/
คริสเตียน

ถ้าคุณต้องการระบุพา ธ ของไฟล์เพื่อให้การทดสอบทั้งหมดในไฟล์นั้นรัน
Still_dreaming_1

48

คำสั่งต่อไปนี้จะดำเนินการทดสอบอย่างแน่นอน testSaveAndDrop

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

4
ไม่ได้ผลสำหรับฉัน ใช้\bแทนในที่สุดได้เคล็ดลับ:$ --filter '/::testSaveAndDrop\b/'
Joe

1
ทั้งสองชื่อวิธีสิ้นสุด'/::testSaveAndDrop\b/'และ'/::testSaveAndDrop$/'ทำงานให้ฉันเช่นนี้phpunit --filter ClassName::methodName$และphpunit --filter ClassName::methodName\b(บน Linux)
Valentine Shi

22

สำหรับการรัน phpunit test ใน laravel หลายวิธี ..

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

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

สำหรับการทดสอบชั้นเดียว:

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

สำหรับการทดสอบวิธีการเดียว:

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

สำหรับรันการทดสอบจากคลาสทั้งหมดภายในเนมสเปซ:

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

สำหรับวิธีทดสอบการวิ่งเพิ่มเติมดูเพิ่มเติม


21

ดังนั้นสิ่งนี้

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

โดยไม่ต้อง=และด้วย'

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


ไม่มันไม่ทำงาน การทดสอบทั้งหมดในชั้นเรียนEscalationGroupTestจะถูกดำเนินการ
อเล็กซ์

ยังคงมีการทดสอบทั้งหมด 9 รายการ phpunit เวอร์ชั่น 3.2.8
อเล็กซ์

2
ย้าย--filterไปยังก่อนชื่อไฟล์และสิ่งต่าง ๆ ควรทำงานอย่างถูกต้อง
Schleis

ทำงานกับฉันใน PHPUnit 4.8.10
Asaph

สิ่งนี้ให้ฉันNo tests executed!ใน PHPUnit 4.8.35 @Schleis คุณเปลี่ยนคำสั่งได้อย่างไร?
Andru

14
  • เรียกใช้สิ่งนี้ในไดเรกทอรีรากโครงการของคุณฉันใช้ในไดเรกทอรีราก laravel

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

ตัวอย่างที่มีชื่อวิธีการที่กำหนดเอง

 /** @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');
  }

ตัวอย่างที่มีคำหลักทดสอบ

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

1
แน่นอนว่าฉันเป็นผู้เริ่มต้นแล้วจะลองใช้รหัสเฉพาะเพิ่มเติมเกี่ยวกับการตอบกลับที่กำลังจะเกิดขึ้น
Connectify_user

7

หากคุณอยู่ในเน็ตคุณสามารถคลิกขวาในวิธีทดสอบแล้วคลิก "เรียกใช้วิธีทดสอบที่โฟกัส"

เรียกใช้เมนูวิธีการทดสอบที่โฟกัส


7

คุณสามารถลองนี้ฉันสามารถเรียกใช้กรณีทดสอบเดียว

phpunit tests/{testfilename}

เช่น:

phpunit tests/StackoverflowTest.php

หากคุณต้องการเรียกใช้กรณีทดสอบเดียวใน Laravel 5.5 ลอง

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

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

เช่น:

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

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

คำถามคือทำอย่างไรถึงจะทำการทดสอบเดี่ยววิธี (ไม่ใช่คลาส)
Aleksei Akireikin

4

เหตุผลที่การทดสอบของคุณกำลังทำงานอยู่ก็คือคุณมี --filterตั้งค่าสถานะหลังจากชื่อไฟล์ PHPUnit ไม่ได้อ่านตัวเลือกเลยและกำลังเรียกใช้กรณีทดสอบทั้งหมด

จากหน้าจอช่วยเหลือ:

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

ดังนั้นให้ย้าย--filterอาร์กิวเมนต์ก่อนไฟล์ทดสอบที่คุณต้องการตามที่กล่าวไว้ใน @Alex และ @Ferid Mövsümovคำตอบ และคุณควรมีการทดสอบที่คุณต้องการเรียกใช้


ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามเดิม ... ฉันมีปัญหาแบบเดียวกันกับที่ต้องใช้การทดสอบหนึ่งไฟล์ในหนึ่งไฟล์ที่มีการทดสอบหลายหน่วยและคำตอบอีกสองคำโดยใช้ตัวกรองที่เหมาะกับฉัน
jfoo

@jfoo หนึ่งในปัญหาที่เกิดขึ้นกับคำสั่งของ OP คือ--filterตัวเลือกนั้นอยู่หลังชื่อไฟล์ อีกสองคำตอบมีคำตอบที่ถูกต้อง แต่ไม่ได้ชี้ให้เห็นว่าเหตุใดจึงใช้ตัวกรอง
Schleis


1

แม้ว่าฉันจะไปงานปาร์ตี้สาย แต่ส่วนตัวฉันเกลียดที่จะเขียนทั้งบรรทัด

แต่ฉันใช้ทางลัดต่อไปนี้ในไฟล์. bash_profileตรวจสอบให้แน่ใจว่าได้จัดหา. bash_profileไฟล์หลังจากเพิ่มนามแฝงใหม่ที่ไม่สามารถใช้งานได้

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

การใช้งาน:

puf function_name

puf filename

หากคุณใช้Visual Studio Codeคุณสามารถใช้แพ็คเกจต่อไปนี้เพื่อทำการทดสอบ

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

จากนั้นคุณสามารถตั้งค่าการผูกกุญแจในการตั้งค่า ฉันใช้การผูกคำสั่ง + Tใน MAC ของฉัน

ตอนนี้เมื่อคุณวางเคอร์เซอร์บนฟังก์ชั่นใด ๆแล้วใช้การผูกกุญแจจากนั้นมันจะทำการทดสอบเดี่ยวนั้นโดยอัตโนมัติ

ถ้าคุณต้องการเรียกใช้คลาสทั้งหมดจากนั้นวางเคอร์เซอร์ไว้ด้านบนของคลาสจากนั้นใช้การโยงคีย์

หากคุณมีสิ่งอื่นใดให้ทำเสมอด้วยเทอร์มินัล

Happy Coding!


0

คุณต้องใช้ - ตัวกรองเพื่อเรียกใช้วิธีการทดสอบเดียว php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

ตัวกรองด้านบนจะเรียกใช้การทดสอบวิธีการเพียงอย่างเดียว

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