จะข้ามการทดสอบใน PHPunit ได้อย่างไร?


89

ฉันใช้ phpunit ในการเชื่อมต่อกับเจนกินส์และฉันต้องการข้ามการทดสอบบางอย่างโดยตั้งค่าการกำหนดค่าในไฟล์ XML phpunit.xml

ฉันรู้ว่าฉันสามารถใช้ในบรรทัดคำสั่ง:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

ฉันจะแปลไฟล์นั้นเป็นไฟล์ XML ได้อย่างไรเนื่องจาก<filters>แท็กมีไว้สำหรับการครอบคลุมโค้ดเท่านั้น

ฉันต้องการเรียกใช้การทดสอบทั้งหมดนอกเหนือจาก testStuffThatAlwaysBreaks


1
KO: แล้วการแก้ไขการทดสอบล่ะ? btw สวัสดีจาก welly ;-)
zerkms

ฉันไม่ได้เขียนการทดสอบมันเป็นสิ่งที่ไม่เกี่ยวข้องและไม่ต้องการเปลี่ยนไฟล์หลัก
Filype

ไม่ต้องสงสัยเลยว่าคุณสามารถทำได้ มันเป็นข้อกำหนดที่แปลกมาก
zerkms

PS: คุณพูดถึงตัวกรอง - แต่ไม่สามารถช่วยคุณได้เพราะมันไม่รวมเส้นทางทั้งหมด มิฉะนั้น<exclude>- จะทำงานให้คุณ
zerkms

คุณสามารถโพสต์ไฟล์ phpunit.xml.dist ที่เสนอได้หรือไม่
Filype

คำตอบ:


170

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

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

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

6
เนื่องจากเป็นวิธีการแบบคงที่ (อย่างน้อยใน PHPUnit 3) และบางคลาสใช้ afaik การผูกแบบคงที่ในช่วงปลายคุณควรใช้static::markTestSkipped('');แทน$this->. มันจะสร้างคำเตือนใน PHP เวอร์ชันที่ใหม่กว่า ลายเซ็น: public static function markTestSkipped($message = '')
Daniel W.

ต้องการตัวอย่างที่ดีกว่าของไฟล์ทดสอบหน่วยเต็ม ไม่ใช่แค่ตัวอย่าง
Ligemer

@ แดเนียลว. คู่มือ PHPUnit อย่างเป็นทางการมีตัวอย่างการแสดง$this->markTestSkipped()
บริล็อก

@nulll คุณสามารถดูใน sourcecode ของ 6.5 , markTestSkipped()ยังคงเป็นวิธีการที่คงที่
Daniel W.

31

หากคุณสามารถจัดการกับการละเว้นไฟล์ทั้งหมดได้

<?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>

นี่คือสิ่งที่ฉันลองแล้วยังคงบอกว่า 893 การทดสอบโดยไม่มีการทดสอบ<exclude>และ 893 การทดสอบด้วย<exclude>
Filype

1
การทดสอบใช้เวลาประมาณ 20 นาทีมีวิธีง่ายๆในการดูว่าจะมีการทดสอบกี่ครั้ง? ตอนนี้ฉันต้องรอจนกว่าแถวแรกจะเสร็จสมบูรณ์....... 63 / 893 ( 7%)
Filype

5
@Filype: ถ้าอย่างนั้นคุณอาจระบุเส้นทางผิด มันทำงานได้ดีสำหรับฉัน ไม่แน่ใจว่าจะสามารถรับการทดสอบได้หรือไม่ PS: การทดสอบหน่วยไม่ควรดำเนินการนานนัก ฉันขอแนะนำให้ใช้@groupคำอธิบายประกอบและการทดสอบแยกตามธรรมชาติ
zerkms

21

บางครั้งการข้ามการทดสอบทั้งหมดจากไฟล์เฉพาะตามเงื่อนไขที่กำหนดเองซึ่งกำหนดเป็นโค้ด php ก็มีประโยชน์ คุณสามารถทำได้อย่างง่ายดายโดยใช้ฟังก์ชัน setUp ซึ่ง makeTestSkipped ทำงานได้เช่นกัน

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

your_custom_conditionสามารถส่งผ่านเมธอด / คุณสมบัติคลาสแบบคงที่ค่าคงที่ที่กำหนดในไฟล์ phpunit bootstrap หรือแม้แต่ตัวแปรส่วนกลาง


คืออะไรConfigชั้น? ฉันจะวางไว้ที่ไหน
cronfy

@cronfy สามารถเป็นคลาสที่สามารถเข้าถึงขอบเขตส่วนกลาง (รูปแบบการออกแบบ Singleton / Register) หรือแม้แต่ตัวแปรส่วนกลางที่ตั้งค่าในไฟล์ bootstrap ใน phpunit โดยทั่วไปตรรกะคือ if ($ testingFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (... ); }
Konrad Gałęzowski

ลบเงื่อนไขออกและคำตอบของคุณจะตรงไปตรงมา ... "markTestSkipped ภายในการตั้งค่าเพื่อข้ามทั้งไฟล์"
SparK

1
@SparK ฉันเห็นประเด็นของคุณ แต่ฉันให้วิธีการข้ามแบบมีเงื่อนไขของคลาสทดสอบทั้งหมด ฉันได้เปลี่ยนมันเล็กน้อยโดยลบวิธีการทำตามกฎทั่วไปออกไป
Konrad Gałęzowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.