PHPUnit - 'ไม่มีการทดสอบที่ดำเนินการ' เมื่อใช้ไฟล์กำหนดค่า


91

ปัญหา

เพื่อปรับปรุงคุณภาพของโค้ดฉันได้ตัดสินใจที่จะลองเรียนรู้วิธีทดสอบโค้ดของฉันโดยใช้การทดสอบหน่วยแทนที่จะเป็นโซลูชันการทดสอบระดับปานกลางที่ดีที่สุด

ฉันตัดสินใจติดตั้ง PHPUnit โดยใช้โปรแกรมแต่งสำหรับไลบรารีส่วนตัวที่ช่วยให้ฉันสามารถใช้งานฟังก์ชันฐานข้อมูลทั่วไปได้ ตอนแรกฉันไม่มีไฟล์กำหนดค่าสำหรับ PHPUnit และเมื่อฉันรันคำสั่งเช่น:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

โปรดทราบว่านี่เป็นคำสั่งเทอร์มินัลดังนั้นฉันจึงไม่ได้รวม.phpส่วนขยายไว้ GeneralStringFunctionsTest ที่อ้างถึงข้างต้นเป็นGeneralStringFunctionsTest.phpไฟล์จริงๆ

ผลลัพธ์คือสิ่งที่ฉันคาดหวัง:

เวลา: 31 ms, หน่วยความจำ: 2.75Mb

ตกลง (1 การทดสอบ 1 การยืนยัน)

จากนั้นฉันพยายามใช้ไฟล์คอนฟิกูเรชันเพื่อโหลดชุดทดสอบโดยอัตโนมัติแทนที่จะต้องพิมพ์ไฟล์ด้วยตนเองทุกครั้ง ฉันสร้างไฟล์ที่เรียกว่าphpunit.xmlในไดเรกทอรีรากของฉันและป้อนสิ่งต่อไปนี้ลงในไฟล์: http://pastebin.com/0j0L4WBD :

<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
    <testsuites>
        <testsuite name="Tests">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

ตอนนี้เมื่อฉันรันคำสั่ง:

phpunit

ฉันได้รับผลลัพธ์ต่อไปนี้:

PHPUnit 4.5.0 โดย Sebastian Bergmann และผู้ร่วมให้ข้อมูล

การกำหนดค่าอ่านจาก /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

เวลา: 16 ms, หน่วยความจำ: 1.50Mb

ไม่มีการทดสอบ!

ในกรณีที่เป็นประโยชน์โครงสร้างไดเร็กทอรีของฉันจะเป็นดังนี้:
src -
การทดสอบไดเรกทอรีระดับบนสุด (พร้อมซอร์สโค้ดทั้งหมดของฉัน) - ไดเรกทอรีระดับบนสุด (พร้อมการทดสอบทั้งหมดของฉันมีโครงสร้างเหมือนกับโฟลเดอร์srcของฉัน)
- ไฟล์ของบุคคลที่สามของผู้แต่ง

ฉันยังมีไฟล์ json และไฟล์ล็อคเช่นเดียวกับไฟล์ phpunit xml ในระดับบนสุดเป็นไฟล์

สิ่งที่ฉันพยายาม

  • การเปลี่ยนไดเร็กทอรีphpunit.xmlเป็นtests/GeneralStringFunctions
  • การเปลี่ยนไดเร็กทอรีphpunit.xmlเป็น./tests
  • ย้ายphpunit.xmlไฟล์ไปยังtestsไดเร็กทอรีจากนั้นเปลี่ยนไดเร็กทอรีเป็น./แทนtests.
  • การเพิ่มแอตทริบิวต์คำต่อท้ายให้กับแท็กไดเร็กทอรีphpunit.xmlเพื่อระบุ "Tests" เป็นคำต่อท้ายอย่างชัดเจน

คือtests/GeneralStringFunctions/GeneralStringFunctionsTestโฟลเดอร์หรือชื่อไฟล์หรือไม่?
hek2mgl

@ hek2mgl GeneralStringFunctionsTest.phpมันเป็นชื่อไฟล์ก็เรียกว่าจริง ในอินเทอร์เฟซบรรทัดคำสั่งฉันไม่ได้ป้อน.phpส่วนขยายเพราะมันใช้งานได้โดยไม่มีมัน
Muyiwa Olu

1
ตกลงการกำหนดค่าของคุณควรใช้งานได้ Btw หากคุณระบุคำต่อท้ายควรเป็นTest.phpมากกว่าTestในกรณีของคุณอย่างไรก็ตามคุณมีอิสระที่จะละเว้นเนื่องจากTest.phpเป็นค่าเริ่มต้น
hek2mgl

@ hek2mgl ขอบคุณสำหรับหัว! คุณมีความคิดว่าทำไมการทดสอบของฉันไม่ได้ทำงานอยู่กับการตั้งค่าไฟล์phpunit.xml?
Muyiwa Olu

ทำไมคุณไม่แสดงไฟล์กำหนดค่าให้เราดู?

คำตอบ:


195

สำหรับสิ่งที่คุ้มค่า (มาช้า) ฉันเพิ่งเจอสิ่งนี้ในขณะที่ฉันกำลังสร้างโปรเจ็กต์ Laravel 5.1 ใหม่สำหรับเว็บไซต์ง่ายๆ ฉันพยายามแก้ไขข้อบกพร่องและรู้สึกสับสนเมื่อพยายาม:

php artisan make:test homeTest

(ซึ่งมีการทดสอบเริ่มต้นที่ยืนยันว่าจริงเป็นจริง)

และเห็นผลลัพธ์

No tests executed!

สิ่งที่เป็นปัญหาสำหรับฉันคือเกี่ยวข้องกับการติดตั้ง PHP ของฉัน - "phpunit" ได้รับการลงทะเบียนทั่วโลกและกำหนดค่าต่างกันในขณะที่ phpunit ที่มาพร้อมกับการติดตั้ง Laravel ได้รับการกำหนดค่าอย่างถูกต้องและทำงานได้อย่างสมบูรณ์

ดังนั้นการแก้ไขจึงเรียกใช้ phpunit ที่กำหนดค่าไว้ของผู้ขาย (จากไดเร็กทอรีรูทเดียวกันกับแอพ / และการทดสอบ /):

./vendor/bin/phpunit

หวังว่าจะช่วยคนอื่น!


4
ฉันคิดว่านี่น่าจะเป็นคำตอบที่ถูกต้องที่สุด ฉันได้ลบโปรเจ็กต์ออกไปแล้วดังนั้นฉันจึงไม่มีวิธีตรวจสอบอีกครั้ง แต่สำหรับโปรเจ็กต์ในอนาคตที่มีผู้แต่งฉันมักจะใช้vendor/bin/phpunitแทนphpunitไบนารีส่วนกลาง ฉันได้ไปไกลถึงการลบphpunitไบนารีทั่วโลกแล้วดังนั้นฉันจะไม่ทำผิดพลาดแบบเดิมอีกโดยไม่ได้ตั้งใจ - และมันก็ไม่โผล่ขึ้นมาตั้งแต่นั้น ฉันจะทำเครื่องหมายว่านี่เป็นคำตอบที่ยอมรับเพราะมันน่าจะเป็นเหตุผล
Muyiwa Olu

3
การโทร./vendor/bin/phpunitเป็นเคล็ดลับสำหรับฉันในการติดตั้ง laravel 5.4 ใหม่
ira

ในทำนองเดียวกันสิ่งนี้ช่วยฉันในขณะที่ทำงานในโครงการ Wordpress ปัญหาเดียวกัน: "phpunit" สามารถลงทะเบียนและกำหนดค่าได้ทั่วโลก ขอบคุณสำหรับการแชร์!
sqsinger

สิ่งนี้ได้รับการแก้ไขสำหรับฉันแล้ว แต่มีวิธีแก้ไข phpunit ทั่วโลกหรือไม่ คงจะดีไม่น้อยหากฉันสามารถพิมพ์phpunit
Noitidart

2
@Noitidart คุณสามารถสร้างaliasสำหรับ ./vendor/bin/phpunit
Ganesh K

101

ไฟล์ XML ของคุณใช้ได้ดีเหมือนเดิม อย่างไรก็ตามคุณต้องแน่ใจว่าไฟล์ PHP ในtests/โฟลเดอร์ของคุณมีชื่อดังนี้:

การทดสอบ / Test.php <--- หมายเหตุการ
ทดสอบ"T" ตัวพิมพ์ใหญ่/ การทดสอบผู้ใช้Test.php
/ fooBar Test.php
เป็นต้น

ชื่อไฟล์ต้องลงท้ายด้วย "test.php" นี่คือสิ่งที่ PHPUnit กำลังมองหาภายในไดเรกทอรี

นอกจากนี้วิธีการทดสอบทุกวิธีต้องมีชื่อที่ขึ้นต้นด้วย "test":

public function testFooBar()
{
    // Your test code
}

หวังว่าจะช่วยได้!


4
หรือคุณสามารถใช้--test-suffix=anything.phpเพื่อลบล้าง
checksum

สำหรับฉันมันมีประโยชน์ในการแทนที่เส้นทางสัมพัทธ์ไปยังโฟลเดอร์ทดสอบด้วยพา ธ สัมบูรณ์
Timur Samkharadze

ฉันจะลบล้างสิ่งนี้ในไฟล์กำหนดค่าได้อย่างไร
Jonathan

21

บน windows ใช้คำสั่งต่อไปนี้บนเทอร์มินัล

.\vendor\bin\phpunit

นั่นคือถ้าคำสั่ง

phpunit

ส่งกลับ "ไม่มีการทดสอบ!"

ในขณะที่ใช้ Mac

./vendor/bin/phpunit

หวังว่าจะช่วยได้


ขอบคุณมากสำหรับคำตอบสิ่งนี้ช่วยได้มาก
Goke Obasa

ตรวจสอบให้แน่ใจว่าไม่มีphpunitใน global path ของคุณ (คุณสามารถตรวจสอบว่ามันทำงานอย่างที่ต้องการphpunit --versionและดูว่าตรงกับสิ่งที่คุณคาดหวังหรือไม่ Xampp มักจะติดตั้ง phpunit ที่ php bin dir เดียวกันนั่นเป็นปัญหาสำหรับฉัน
giovannipds

ฉันเป็นหนึ่งในคนที่โง่เขลาที่สุดในโลกเมื่อพูดถึงการทดสอบหน่วยดังนั้นมันก็น่าจะดีสำหรับเหตุผลนี้ แต่มันช่วยได้จริงๆ ขอบคุณต่อไป!
Mycodingproject

12

ฉันมีปัญหาเดียวกันหลังจาก PHPUnit บนเครื่องเสมือนของเราอัปเดตเป็นเวอร์ชัน 6 แม้ --debug และ --verbose จะบอกว่าไม่มีประโยชน์ก็แค่ "ไม่มีการทดสอบดำเนินการ" ในที่สุดปรากฎว่าคลาสและเนมสเปซมีการเปลี่ยนแปลงในเวอร์ชันใหม่และไม่ต้องการเรียกใช้ไฟล์ที่มีการอ้างอิงถึงคลาสเก่า การแก้ไขสำหรับฉันคือการแทนที่ในทุกกรณีการทดสอบนี้:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

กับ:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

อ่าใช่แม้ว่ามันจะไม่ได้เป็นคำตอบสำหรับคำถามเดิม แต่ก็ช่วยแก้ปัญหาของฉันได้หลังจากอัปเกรดเป็น 6.x!
ทามะ

นี่เป็นปัญหาสำหรับฉันเมื่ออัปเกรดจาก PHPUnit 5.7 เป็น 8.5 เช่นกัน - ขอบคุณสำหรับเคล็ดลับ!
ยืนยัน

8

ฉันรู้ว่านี่มันเก่ามาก แต่มันก็เกิดขึ้นกับฉันเช่นกัน หวังว่านี่จะช่วยใครบางคนได้

ปัญหาของฉันคือฉันลืมสัญลักษณ์ '@' ใน / ** @test * /

ไม่ถูกต้อง:

/** test */
function a_thread_can_be_deleted()
{
    ...
}

ขวา:

/** @test */
function a_thread_can_be_deleted()
{
    ...
}

1
2 ปีต่อมาและนี่คือสิ่งนี้สำหรับฉัน มันจะต้องเป็นรูปแบบความคิดเห็นนั้นจริงๆ ฉันมีช่องว่างที่ขาดหายไปในนั้น ตรวจไม่พบ มีอะไรน่ารำคาญเล็กน้อยใน laravel 6.1 ฉันใช้คำสั่ง artisan make และไม่รวมความคิดเห็นนั้น
aibarra

1
คำตอบนี้มีประโยชน์
Sundar

ฉันพบปัญหาเมื่อฉันกำลังพัฒนาแพ็คเกจ เมื่อฉันเรียกใช้ 'php artisan make: test SomeTest' และย้ายไปยังไดเร็กทอรีการทดสอบแพ็กเกจความคิดเห็นของเมธอด testExample พื้นฐานมีเพียงคำอธิบายพื้นฐาน@return voidและไม่มี '@test' ซึ่งเป็นสาเหตุที่ phpunit ไม่สามารถระบุได้ เป็นการทดสอบ
DAMIEN JIANG

6

ฉันดึงผมเป็นเวลา 10 นาทีก่อนที่จะตัดสินใจใช้--debug (วิธีที่ดีในการหลีกเลี่ยง) เพื่อค้นพบข้อเท็จจริงง่ายๆว่าชื่อไฟล์ไม่สอดคล้องกับหลักการตั้งชื่อฉันมี "s" พิเศษในตอนท้าย .

ไม่ถูกต้อง

CreateAdminTests

ขวา

CreateAdminTest

หวังว่าบันทึกนี้จะช่วยใครบางคนได้


1
เยี่ยมมากฉันสามารถทำการทดสอบได้หลังจากนั้น
WindSaber

5

คุณต้องการเพียงแค่โทรหาจากไฟล์ผู้ขาย

vendor\bin\phpunit ข้อสังเกต \ ไม่ /



3

มางานปาร์ตี้ช้า แต่ข้อมูลนี้อาจช่วยคนอื่นได้

วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน ตามค่าเริ่มต้นของ Laravel 7.x PHPUnit จะรันเฉพาะไฟล์ PHP ที่ต่อท้ายด้วย "Test.php" ตัวอย่างเช่นหากคุณสร้างการทดสอบการตั้งชื่อCreateUserจะใช้ไม่ได้ในขณะที่การตั้งชื่อนั้นCreateUserTestจะใช้งานได้

เพื่อเอาชนะข้อ จำกัด ไปที่phpunit.xmlและแก้ไขsuffixแอตทริบิวต์จากdirectoryองค์ประกอบ:

...
<testsuite name="Unit">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Unit</directory>

</testsuite>
<testsuite name="Feature">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Feature</directory>

</testsuite>
...

สิ่งนี้จะสั่งให้ PHPUnit เรียกใช้ไฟล์ทั้งหมดที่มี.phpนามสกุลจากไดเรกทอรี หมายเหตุเพื่อล้างแคชของแอปหลังจากอัปเดตphpunit.xml:

php artisan config:cache

สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า PHPUnit XML ได้ที่นี่: https://phpunit.de/manual/6.5/en/appendixes.configuration.html


2

หากคุณใช้PHPSTORMให้ไปที่การตั้งค่าจากนั้นไปที่

  • Test Frameworks

    แล้วคลิก + และเลือก

  • PHPUnit Local แล้ว

  • Use Composer Auto Loader จากนั้นวางสิ่งนี้ในช่องเส้นทางไปยังสคริปต์

  • C:\{YOUR PROJECT NAME}\vendor\autoload.php

  • คลิกตกลง

  • HAPPY TESTING


2

ตรวจสอบไฟล์phpunit.xmlดูภายใน testsuites

phpunit (2019) เวอร์ชันของฉันกำลังค้นหาไฟล์ที่ลงท้ายด้วย (คำต่อท้าย) * Test.php ดังนั้นตรวจสอบให้แน่ใจว่าไฟล์ทดสอบทั้งหมดตั้งชื่ออย่างถูกต้อง (เช่น BookTest.php ถูกต้อง BookTests.php ไม่ใช่ BookTestCase.php)


1

คุณได้เพิ่มชุดทดสอบลงในไฟล์ phpunit.xml แล้วหรือยัง?

<phpunit>
    <testsuite name="app1" >
        <directory>./</directory>
    </testsuite>
</phpunit>

คุณสามารถเพิ่มไดเร็กทอรีได้หลายรายการ


สวัสดีขออภัยหากฉันไม่ได้อธิบายให้ชัดเจนในคำถาม แต่ฉันได้เพิ่มชุดทดสอบและชื่อที่สอดคล้องกับไฟล์ XML สำเนาสามารถพบได้ที่นี่: pastebin.com/0j0L4WBD
Muyiwa Olu

ลอง <directory> ./tests </directory>
Aine

ขอบคุณสำหรับการอัปเดตขออภัยที่ฉันยังคงพบปัญหาเดียวกันกับ. / testในไดเรกทอรีของฉัน Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu

น่าเสียดายที่ปัญหาเดียวกัน :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!มันใช้งานได้แน่นอนเมื่อฉันอ้างอิงด้วยตนเองมันไม่ชอบการโหลดจากไฟล์กำหนดค่าด้วยเหตุผลบางประการ :(
Muyiwa Olu

เดาครั้งสุดท้าย. ลองย้ายไฟล์ phpunit.xml ไปไว้ในไดเรกทอรี testing / ในไฟล์ให้เปลี่ยนไดเร็กทอรีเป็น <directory> ./ </directory>
Aine

1

ชื่อฟังก์ชันในไฟล์ทดสอบต้องมีคำนำหน้าtestหรือควรมีการเพิ่มข้อคิดเห็นก่อนฟังก์ชัน

/** @test */

ตรวจสอบให้แน่ใจว่าไม่ใช่

/* @test */

เพราะไม่ได้ผล จะต้องมีเครื่องหมายดอกจันสองตัวหลังจากเฉือนไม่ใช่หนึ่งตัว


0

สำหรับฉันการใช้ phpunit --debug แสดงให้ฉันเห็นว่าการทดสอบใดที่ไม่ได้ดำเนินการภายในฉันมี

$this->visit('/')
         ->see('Laravel');

และฉันคิดว่าเนื่องจากไดเร็กทอรีได้รับการป้องกันด้วยการพิสูจน์ตัวตน. htaccess จึงไม่สามารถเข้าสู่หน้านี้ได้

วิธีแก้ปัญหาสำหรับฉันคือทำการทดสอบนี้ (หรือส่วนใหญ่จะใช้การรับรองความถูกต้อง. htaccess)


0

นี่มันดึกมากแล้ว แต่ฉันหวังว่ามันจะช่วยใครสักคนได้

ฉันได้รับการทดสอบโดยใช้การอ้างอิงแบบสัมบูรณ์ โครงสร้างโฟลเดอร์ [โครงการ / การทดสอบ / test.php]

บรรทัดไดเรกทอรีของฉันมีลักษณะเช่นนี้. /tests/test.php


0

ด้านข้างอาจจะเล็กน้อย แต่ถ้าคุณ (เหมือนฉัน) ใช้ Laravel ใน Vagrant ตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้ phpunit ภายในกล่องคนจรจัดไม่ใช่ที่ "ฝั่งหน้าต่าง" :)


0

ฉันมีปัญหาเรื่องการไม่ดำเนินการทดสอบแม้ว่าจะตั้งค่าต่างๆเรียบร้อย

สาเหตุคือเนมสเปซไม่ใช่คำสั่งแรกของไฟล์ซึ่งเกิดจากความคิดเห็นบล็อกเอกสาร

การเปลี่ยนกลับทำให้ phpunit เห็นการทดสอบและรันอย่างถูกต้อง


0

ฉันเป็นคนตลกเล็กน้อย

เมื่อฉันใช้php artisan make:testฉันบังเอิญใส่. phpเช่นProductRewardPointController.phpที่สร้างProductRewardPointController.php.phpและphpunitก็ละเลยมันไป

ฉันเพิ่งลบ. phpพิเศษและสิ่งต่างๆกลับเป็นปกติ


0

ฉันมีปัญหาเดียวกันกับการไม่ดำเนินการทดสอบ! แก้ไขได้โดยใช้ชื่อไฟล์และชื่อคลาสเดียวกัน


0

หากคุณใช้ IDE เช่นJetBrains PHPStormโปรดสังเกตด้วยว่า: ในRun/Debug Configurationsหน้าต่างTest scopeจำเป็นต้องตั้งค่าdirectoryและชี้ไดเรกทอรีนั้นไปยังตำแหน่งที่คุณtestsโฟลเดอร์อยู่

ฉันใช้เวลาครึ่งชั่วโมงในการคิดออกว่าฉันลืมตั้งไดเร็กทอรี คุณสามารถใช้ global ได้phpunit.pharตราบเท่าที่คุณตั้งค่าขอบเขตการทดสอบและไดเร็กทอรีอย่างถูกต้อง IDE จะจัดการสิ่งอื่น ๆ ให้คุณ


-2

การใช้คอนโซล de cmd ช่วยแก้ปัญหานี้โดยผ่านการทดสอบเส้นทางทั้งหมด

ฉันไม่พบวิธีอื่นที่จะทำ มันไม่ได้ผลจากวิธีนี้

ฉันหวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน


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