ฉันจะปิดการทดสอบโดยใช้ pytest ได้อย่างไร


88

สมมติว่าฉันมีการทดสอบมากมาย:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

มีมัณฑนากรหรือสิ่งที่คล้ายกันที่ฉันสามารถเพิ่มลงในฟังก์ชันเพื่อป้องกันไม่ให้pytestเรียกใช้การทดสอบนั้นได้หรือไม่? ผลลัพธ์อาจมีลักษณะคล้าย ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

คำตอบ:


137

Pytest มีเฮี๊ยบและ skipif ตกแต่งคล้ายกับงูหลาม UnitTest โมดูล (ซึ่งใช้skipและskipIf) ซึ่งสามารถพบได้ในเอกสารที่นี่

ตัวอย่างจากลิงค์สามารถพบได้ที่นี่:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

ตัวอย่างแรกจะข้ามการทดสอบเสมอตัวอย่างที่สองช่วยให้คุณข้ามการทดสอบตามเงื่อนไขได้ (ดีเมื่อการทดสอบขึ้นอยู่กับแพลตฟอร์มเวอร์ชันปฏิบัติการหรือไลบรารีเสริม

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

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...

มีอะไรที่คล้ายกับสง่างาม.skipที่ Mocha (Node.js) มีหรือไม่? it('tests something'...)-> it.skip('tests something'...)ซึ่งจะปิดการใช้งานการทดสอบนั้น ๆ นอกจากนี้ยังมีประโยชน์ตรงข้าม: .onlyซึ่งจะเรียกใช้การทดสอบนั้นเท่านั้น
Juha Untinen

ฉันหมายถึงonlyส่วนนี้คุณสามารถทำได้ผ่านทางบรรทัดคำสั่งหรืออะไรก็ตามที่คุณใช้ในการเริ่มต้นนักวิ่งทดสอบ: stackoverflow.com/a/36539692/4131059 สำหรับitและit.skipฉันเชื่อว่าฟังก์ชันการทำงานที่นี่ครอบคลุมอย่างเต็มที่
Alexander Huszagh

21

skipมัณฑนากรจะทำผลงานได้:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

( reasonอาร์กิวเมนต์เป็นทางเลือก แต่คุณควรระบุสาเหตุที่การทดสอบข้ามไป)

นอกจากนี้ยังมีskipif()ที่อนุญาตให้ปิดการทดสอบหากตรงตามเงื่อนไขบางประการ


นักตกแต่งเหล่านี้สามารถนำไปใช้กับวิธีการฟังก์ชันหรือคลาสต่างๆ

หากต้องการข้ามการทดสอบทั้งหมดในโมดูลให้กำหนดpytestmarkตัวแปรส่วนกลาง:

# test_module.py
pytestmark = pytest.mark.skipif(...)

10

ฉันไม่แน่ใจว่าเลิกใช้แล้วหรือยัง แต่คุณสามารถใช้pytest.skipฟังก์ชันภายในการทดสอบได้:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3

2
มาเพื่อขอความช่วยเหลืออย่างล้นหลามอยู่เพื่อการอ้างอิง
Uzebeckatrente

มันอ้างอิงอะไร ฉันต้องรู้
XChikuX


ฉันกลัวว่านี่จะดีก่อนเวลาของฉัน แต่ตอนนี้ฉันดีใจที่รู้แล้ว
XChikuX

6

คุณอาจต้องการเรียกใช้การทดสอบแม้ว่าคุณจะสงสัยว่าการทดสอบนั้นจะล้มเหลวก็ตาม สำหรับสถานการณ์ดังกล่าวhttps://docs.pytest.org/en/latest/skipping.htmlแนะนำให้ใช้มัณฑนากร@ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

ในกรณีนี้ Pytest จะยังคงเรียกใช้การทดสอบของคุณและแจ้งให้คุณทราบว่าผ่านหรือไม่ แต่จะไม่บ่นและทำลายโครงสร้าง


2

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

pytest test/test_script.py -k 'not test_func_one'

2

คุณสามารถทำเครื่องหมายการทดสอบกับที่skipและการตกแต่งเมื่อคุณต้องการที่จะข้ามการทดสอบในskipifpytest

ข้ามการทดสอบ

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

วิธีที่ง่ายที่สุดในการข้ามการทดสอบคือการทำเครื่องหมายด้วยskipมัณฑนากรซึ่งอาจส่งผ่านทางเลือกreasonก็ได้

นอกจากนี้ยังสามารถข้ามไปอย่างไม่จำเป็นในระหว่างการดำเนินการทดสอบหรือการตั้งค่าโดยเรียกใช้pytest.skip(reason)ฟังก์ชัน สิ่งนี้มีประโยชน์เมื่อไม่สามารถประเมินเงื่อนไขการข้ามระหว่างเวลานำเข้าได้

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

การข้ามการทดสอบตามเงื่อนไข

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

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

สุดท้ายนี้หากคุณต้องการข้ามการทดสอบเพราะแน่ใจว่าไม่ผ่านคุณอาจพิจารณาใช้xfailเครื่องหมายเพื่อระบุว่าคุณคาดว่าการทดสอบจะล้มเหลว

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