ปิดใช้งานการทดสอบหน่วย Python แต่ละรายการชั่วคราว


129

การทดสอบแต่ละหน่วยจะปิดใช้งานชั่วคราวเมื่อใช้unittestโมดูลใน Python ได้อย่างไร

คำตอบ:


231

วิธีการทดสอบส่วนบุคคลหรือชั้นเรียนสามารถปิดใช้งานได้โดยใช้unittest.skipมัณฑนากร

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

สำหรับตัวเลือกอื่น ๆ โปรดดูเอกสารสำหรับการข้ามการทดสอบและความล้มเหลวที่คาดไว้


9
ใน Python 3 คำตอบของ Akif ด้านล่าง@unittest.SkipTestใช้ได้ผลไม่ใช่@unittest.skip
lifebalance

7
ฉันใช้ Python 3.6.1 และใช้@unittest.skipงานได้ดี
พีท

2
@Pete ใน Python 3.4.0 @unittest.skipไม่ทำงาน
lifebalance

จะป้องกันไม่ให้ชั้นเรียนของเด็กถูกข้ามได้อย่างไร?
reubenjohn

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

26

คุณสามารถใช้มัณฑนากรเพื่อปิดใช้งานการทดสอบที่สามารถรวมฟังก์ชันและป้องกันไม่ให้การทดสอบหน่วย googletest หรือ python เรียกใช้ testcase

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

เอาท์พุท:

testFoo has been disabled

11

เวอร์ชันล่าสุด (2.7 - ยังไม่เผยแพร่) รองรับการทดสอบข้าม / ปิดใช้งานเช่นนี้ คุณสามารถรับโมดูลนี้และใช้กับการติดตั้ง Python ที่มีอยู่ได้ มันอาจจะใช้ได้

ก่อนหน้านี้ผมใช้ในการเปลี่ยนชื่อการทดสอบที่ผมอยากข้ามไปจากxtest_testnametest_testname


นี่คือสคริปต์ elisp ด่วนสำหรับทำสิ่งนี้ Elisp ของฉันเป็นสนิมเล็กน้อยดังนั้นฉันจึงขออภัยล่วงหน้าสำหรับปัญหาที่เกิดขึ้น ยังไม่ทดลอง

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1 แต่ในโครงการทั้งหมดที่ฉันทำงานทุกคนใช้ python v2.6.2 และฉันไม่คิดว่าสิ่งนี้จะเปลี่ยนแปลง: / แต่เป็นวิธีแก้ปัญหาขอบคุณ
coelhudo

คุณสามารถปรับแต่งตัวแก้ไขของคุณเล็กน้อยเพื่อให้คุณมีมาโครเพื่อเปิด / ปิดการใช้งาน testcase แต่ฉันพูดในฐานะผู้ใช้ Emacs ดังนั้น ... :)
Noufal Ibrahim

ฉันเป็นผู้ใช้ Emacs เหมือนกันคุณทำมาโครหรือเปล่า
coelhudo

Nope ฉันแค่ปล่อยให้พวกเขาล้มเหลว แต่มันก็ไม่ยาก ฉันได้อัปเดตคำตอบด้วยความกุ๊กกิ๊ก
Noufal Ibrahim

คำตอบที่ยอมรับนี้ไม่ใช่คำตอบเพียงแค่ลิงค์ คำตอบที่แท้จริงในปัจจุบันไม่ใช่คำตอบที่ได้รับการโหวตสูงสุดเช่นกัน จริงอยู่ที่มันมีอายุ 4 ปี เสียงกระซิบที่ไร้เหตุผลเป็นเพียงการทำให้สับสน
jwd630

10

เพียงแค่วาง@unittest.SkipTestมัณฑนากรไว้เหนือการทดสอบก็เพียงพอแล้ว


ฉันไม่รู้ว่าใครเป็นคนทำ แต่ฉันกำลังอ่านเอกสารและมันบอกว่า SkipTest เป็นข้อยกเว้น อย่างไรก็ตามมันแตกต่างจาก unittest.skip ในแง่ที่ว่าการข้ามไม่เคยดำเนินการทดสอบ (ทำให้ปิดใช้งาน) ในขณะที่จุดประสงค์ของ SkipTest จะถูกยกขึ้นหากมีสิ่งที่ไม่คาดคิดเกิดขึ้นในขณะที่กำลังดำเนินการทดสอบ ฉันถูกไหม? ยากที่น่าสนใจ
coelhudo

unittest.skip(โดยไม่มีเหตุผล) ทำให้ฉันมีข้อผิดพลาดใน Python 2 แต่ไม่ใช่ใน Python 3
Akif

5

ฉันเพิ่งเปลี่ยนชื่อวิธีกรณีทดสอบด้วยขีดล่าง: test_myfunc กลายเป็น _test_myfunc



1

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

สำหรับกรณีการใช้งานของฉันวิธีแก้ปัญหาอยู่ในตัวทดสอบไม่ใช่ในรหัสทดสอบ ฉันใช้pytest ด้วย pytest ทำให้ง่ายต่อการระบุการทดสอบเดียวจากบรรทัดคำสั่ง:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(แทนที่ตัวพิมพ์ใหญ่ด้วยค่าของคุณ)

ฉันเข้าใจว่าคำถามนั้นมีไว้สำหรับ python-unitest ฉันไม่ได้ใช้มันมานานแล้ว ฉันจะไม่แปลกใจเลยถ้ามันมีอะไรที่คล้ายกับ pytest หากไม่เป็นเช่นนั้นคุณสามารถเปลี่ยนไปใช้ pytest ได้อย่างง่ายดาย คุณไม่จำเป็นต้องแก้ไขรหัสของคุณ เพียงแค่ติดตั้งและเปลี่ยนคำสั่งนักวิ่งทดสอบของคุณ

นอกจากนี้ฉันใช้ PyCharm Pro ในหน้าที่แสดงรหัสการทดสอบของฉันมีไอคอนเล็ก ๆ ถัดจาก def สำหรับการทดสอบแต่ละครั้ง ฉันสามารถคลิกไอคอนนั้นและเรียกใช้การทดสอบนั้นทีละรายการ

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