การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ
เรียกใช้การทดสอบด้วยข้อมูลนำเข้าหลายชุดโดยใช้ @pytest.mark.parametrize
การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
@pytest.mark.parametrize
เรียกใช้การทดสอบเดียวกันกับอินพุตหลายค่าโดยใช้ @pytest.mark.parametrize ทูเพิลแต่ละชุดถือเป็นกรณีทดสอบแยกกัน
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
(10, -5, 5),
])
def test_add(a, b, expected):
assert a + b == expectedพารามิเตอร์เดียว
สำหรับอาร์กิวเมนต์เดียว ให้ส่งรายการค่าโดยตรง
import pytest
@pytest.mark.parametrize("n", [1, 2, 3, 4, 5])
def test_positive(n):
assert n > 0รหัสการทดสอบที่ตั้งชื่อ
ระบุรายการ ids เพื่อตั้งชื่อชุดพารามิเตอร์แต่ละชุด ทำให้เอาต์พุตอ่านได้ชัดเจนยิ่งขึ้น
import pytest
@pytest.mark.parametrize("value,result", [
(2, True),
(3, False),
], ids=["even", "odd"])
def test_is_even(value, result):
assert (value % 2 == 0) == resultการซ้อนตัวตกแต่ง parametrize
ซ้อนตัวตกแต่ง parametrize สองตัวเพื่อให้ได้ผลคูณคาร์ทีเซียนของอินพุต
import pytest
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_product(x, y):
assert x * y > 0 # 4 test cases: (1,10),(1,20),(2,10),(2,20)pytest-cov: การติดตั้ง
ติดตั้ง pytest-cov เพื่อวัดว่าโค้ดของคุณมีบรรทัดใดบ้างที่ถูกเรียกใช้โดยการทดสอบ
# pip install pytest-cov
# Basic usage:
# pytest --cov=mypackage
# HTML report:
# pytest --cov=mypackage --cov-report=htmlการอ่านเอาต์พุตความครอบคลุม
ความครอบคลุมแสดงว่าบรรทัด แขนง หรือคำสั่งใดบ้างที่ไม่ถูกเรียกใช้ระหว่างการทดสอบ
# Name Stmts Miss Cover
# ------- ----- ---- -----
# mypackage/utils.py 20 3 85%
#
# Missing: lines 45, 67, 88ความครอบคลุมของแขนง
ใช้ --cov-branch เพื่อติดตามว่าทั้งสองแขนงของเงื่อนไขได้รับการทดสอบหรือไม่
# pytest --cov=mypackage --cov-branch
def is_positive(n):
if n > 0: # branch 1: True
return True
return False # branch 2: Falseทำให้ล้มเหลวเมื่อความครอบคลุมต่ำ
ใช้ --cov-fail-under=N เพื่อทำให้บิลด์ล้มเหลว หากความครอบคลุมลดลงต่ำกว่า N เปอร์เซ็นต์
# pytest --cov=mypackage --cov-fail-under=80
# FAIL Required test coverage of 80% not reached. Total: 72%การกำหนดค่า .coveragerc
กำหนดค่าการยกเว้นจากความครอบคลุมใน .coveragerc เพื่อข้ามโค้ดโครงร่างสำเร็จรูป
# .coveragerc
[run]
omit =
*/migrations/*
*/tests/*
setup.py
[report]
exclude_lines =
pragma: no cover
if TYPE_CHECKING:ความหมายของความครอบคลุมที่ดี
ความครอบคลุมสูงไม่ได้รับประกันว่าการทดสอบจะถูกต้อง มุ่งเน้นการตรวจสอบที่มีความหมาย ไม่ใช่เพียงการทำให้บรรทัดถูกเรียกใช้ เป้าหมายที่ใช้ได้จริงสำหรับโครงการส่วนใหญ่คือ 80-90%
# A covered but useless test:
def test_nothing():
is_positive(5) # no assert — 100% coverage, zero confidence
# A meaningful test:
def test_positive():
assert is_positive(5) is True
assert is_positive(-1) is Falseการใช้ parametrize และความครอบคลุมร่วมกัน
การทดสอบแบบกำหนดพารามิเตอร์ช่วยเพิ่มความครอบคลุมได้โดยธรรมชาติ เพราะใช้คำจำกัดความการทดสอบเดียวเพื่อเรียกใช้เส้นทางการทำงานของโค้ดหลายแบบ
import pytest
@pytest.mark.parametrize("n,expected", [
(5, True), (-1, False), (0, False)
])
def test_is_positive(n, expected):
assert is_positive(n) == expectedตรวจสอบอย่างรวดเร็ว
--cov-fail-under=90 ทำอะไรในการเรียกใช้ pytest
สรุปทบทวน
ใช้ @pytest.mark.parametrize เพื่อทดสอบอินพุตหลายค่าอย่างเป็นระเบียบ วัดความครอบคลุมของโค้ดด้วย pytest-cov ติดตามแขนงด้วย --cov-branch และบังคับใช้ค่าขั้นต่ำด้วย --cov-fail-under
คำถามที่พบบ่อย
บทเรียน “การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ”
เรียกใช้การทดสอบด้วยข้อมูลนำเข้าหลายชุดโดยใช้ @pytest.mark.parametrize คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนการทดสอบ pytest แรกของคุณ
- ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน
- การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ
- การจำลองด้วย unittest.mock