पाइटेस्ट 2026 में पायथन कोड के परीक्षण के लिए वास्तविक मानक है – अंतर्निहित यूनिटटेस्ट की तुलना में सरल और अधिक शक्तिशाली। अच्छे परीक्षण उत्पादन से पहले बग पकड़ते हैं, विश्वसनीय रिफैक्टरिंग सक्षम करते हैं, और दस्तावेज करते हैं कि आपका कोड कैसा व्यवहार करना चाहिए। यह मार्गदर्शिका आपको आपके पहले परीक्षण से लेकर उन्नत पैटर्न तक ले जाती है।
📋 Table of Contents
- सेटअप
- आपका पहला टेस्ट
- एएए पैटर्न (व्यवस्थित करें, कार्य करें, जोर दें)
- फिक्स्चर – पुन: प्रयोज्य परीक्षण सेटअप
- पैरामीट्रिज़ेशन – कई मामलों का परीक्षण करें
- मॉकिंग – निर्भरता से कोड को अलग करें
- परीक्षण अपवाद और किनारे के मामले
- कवरेज मापना
- कॉन्फ़िगरेशन (pytest.ini)
- सर्वोत्तम अभ्यास
- अक्सर पूछे जाने वाले प्रश्न
- पाइटेस्ट पायथन परीक्षण को सरल और शक्तिशाली बनाता है। सादे से शुरू करें
सेटअप
pip install pytest pytest-cov
# Project structure
myproject/
├── src/
│ └── calculator.py
├── tests/
│ └── test_calculator.py
└── pytest.ini
आपका पहला टेस्ट
# src/calculator.py
def add(a, b):
return a + b
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
# tests/test_calculator.py
from src.calculator import add, divide
import pytest
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
def test_divide():
assert divide(10, 2) == 5
def test_divide_by_zero_raises():
with pytest.raises(ValueError, match="Cannot divide by zero"):
divide(10, 0)
# Run the tests
pytest # run all tests
pytest -v # verbose (shows each test name)
pytest tests/test_calculator.py::test_add # run one test
pytest -k "divide" # run tests matching "divide"
एएए पैटर्न (व्यवस्थित करें, कार्य करें, जोर दें)
def test_user_discount():
# Arrange — set up test data
user = User(name="Alice", is_premium=True)
cart = Cart(total=100)
# Act — call the code under test
final_price = apply_discount(cart, user)
# Assert — verify the result
assert final_price == 80 # 20% premium discount
फिक्स्चर – पुन: प्रयोज्य परीक्षण सेटअप
import pytest
@pytest.fixture
def sample_user():
# Provides a fresh user for each test that needs one
return User(name="Alice", email="alice@example.com")
@pytest.fixture
def db_connection():
# Setup and teardown - code after yield runs as cleanup
conn = create_test_db()
yield conn # test runs here
conn.close() # cleanup after test
# Tests receive fixtures as arguments
def test_user_email(sample_user):
assert sample_user.email == "alice@example.com"
def test_save_user(sample_user, db_connection):
db_connection.save(sample_user)
assert db_connection.count() == 1
पैरामीट्रिज़ेशन – कई मामलों का परीक्षण करें
import pytest
@pytest.mark.parametrize("a, b, expected", [
(2, 3, 5),
(0, 0, 0),
(-1, 1, 0),
(100, 200, 300),
])
def test_add_many_cases(a, b, expected):
assert add(a, b) == expected
# Runs 4 separate tests, one per tuple — clear failure reporting per case
मॉकिंग – निर्भरता से कोड को अलग करें
from unittest.mock import patch, MagicMock
# Mock an external API call so tests don't hit the network
def test_fetch_user_data():
with patch('src.api.requests.get') as mock_get:
mock_get.return_value.json.return_value = {"id": 1, "name": "Alice"}
mock_get.return_value.status_code = 200
result = fetch_user_data(1)
assert result["name"] == "Alice"
mock_get.assert_called_once_with("https://api.example.com/users/1")
# Mock with pytest-mock (cleaner)
def test_with_mocker(mocker):
mock_db = mocker.patch('src.service.database')
mock_db.get_user.return_value = {"name": "Bob"}
result = get_user_name(1)
assert result == "Bob"
परीक्षण अपवाद और किनारे के मामले
def test_raises_on_invalid_input():
with pytest.raises(ValueError) as exc_info:
validate_age(-5)
assert "must be positive" in str(exc_info.value)
def test_edge_cases():
assert process([]) == [] # empty input
assert process([1]) == [1] # single item
assert process(None) is None # None handling
कवरेज मापना
# Run tests with coverage report
pytest --cov=src --cov-report=term-missing
# Output shows which lines aren't tested:
# Name Stmts Miss Cover Missing
# src/calculator.py 10 1 90% 15
# Generate an HTML report
pytest --cov=src --cov-report=html
# Open htmlcov/index.html to see line-by-line coverage
कॉन्फ़िगरेशन (pytest.ini)
# pytest.ini
[pytest]
testpaths = tests
python_files = test_*.py
python_functions = test_*
addopts = -v --cov=src --cov-report=term-missing
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
integration: integration tests
सर्वोत्तम अभ्यास
- प्रति परीक्षण एक अभिकथन अवधारणा: प्रत्येक परीक्षण एक व्यवहार की पुष्टि करता है – विफलताएं सीधे समस्या की ओर इशारा करती हैं
- वर्णनात्मक नाम:
test_divide_by_zero_raises_valueerrorकोड पढ़े बिना आपको बताता है कि क्या टूटा - व्यवहार का परीक्षण करें, कार्यान्वयन का नहीं: परीक्षण करें कि फ़ंक्शन क्या करता है, न कि कैसे – इसलिए रीफैक्टरिंग परीक्षणों को नहीं तोड़ती है
- परीक्षण तेज़ और पृथक रखें: प्रत्येक परीक्षण किसी भी क्रम में स्वतंत्र रूप से चलना चाहिए
- नकली बाहरी निर्भरताएँ: यूनिट परीक्षणों में डेटाबेस, एपीआई और फ़ाइल सिस्टम का मज़ाक उड़ाया जाना चाहिए
- सार्थक कवरेज का लक्ष्य: 80%+ एक अच्छा लक्ष्य है, लेकिन 100% का पीछा करने के बजाय महत्वपूर्ण रास्तों को अच्छी तरह से कवर करें
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: पाइटेस्ट बनाम यूनिटेस्ट?
ए: पाइटेस्ट सरल है (सादा , कोई बॉयलरप्लेट क्लास नहीं), अधिक शक्तिशाली (फिक्स्चर, पैरामीट्रिजेशन), और इसमें एक समृद्ध प्लगइन पारिस्थितिकी तंत्र है। यह यूनिटटेस्ट परीक्षण भी चला सकता है। नई परियोजनाओं के लिए पाइटेस्ट का उपयोग करें।assertप्रश्न: मुझे कितना परीक्षण कवरेज चाहिए?
उत्तर: 80% एक सामान्य लक्ष्य है। लेकिन कवरेज एक मार्गदर्शक है, लक्ष्य नहीं – कमजोर दावों के साथ 100% कवरेज महत्वपूर्ण तर्क के गहन परीक्षणों के साथ 80% से भी बदतर है। उस कोड को कवर करने पर ध्यान दें जो मायने रखता है।
प्रश्न: क्या मुझे डेटाबेस का अनुकरण करना चाहिए या परीक्षण डेटाबेस का उपयोग करना चाहिए?
ए: इसे यूनिट परीक्षणों (तेज, पृथक) में मॉक करें। एकीकरण परीक्षणों में वास्तविक परीक्षण डेटाबेस का उपयोग करें (वास्तविक प्रश्नों के कार्य को सत्यापित करता है)। दोनों का अपना स्थान है – तर्क के लिए इकाई परीक्षण, डेटा स्तर के लिए एकीकरण परीक्षण।
प्रश्न: फिक्स्चर और नियमित फ़ंक्शन के बीच क्या अंतर है?
ए: फिक्स्चर को पाइटेस्ट द्वारा प्रबंधित किया जाता है – वे उन परीक्षणों से पहले स्थापित किए जाते हैं जो उनसे अनुरोध करते हैं और बाद में (उपज के माध्यम से) साफ किए जा सकते हैं। वे स्वचालित जीवनचक्र प्रबंधन के साथ पुन: प्रयोज्य, पृथक परीक्षण निर्भरता प्रदान करते हैं।
प्रश्न: मैं एसिंक कोड का परीक्षण कैसे करूं?
ए: इंस्टॉल करें
और परीक्षणों कोpytest-asyncioसे चिह्नित करें . तब आप कर सकते हैं@pytest.mark.asyncio async फ़ंक्शंस का परीक्षण करने के लिए अपने परीक्षण फ़ंक्शंस के अंदर।awaitनिष्कर्ष
पाइटेस्ट पायथन परीक्षण को सरल और शक्तिशाली बनाता है। सादे से शुरू करें
एएए पैटर्न में कथन, पुन: प्रयोज्य सेटअप के लिए फिक्स्चर का उपयोग करें, कई मामलों को संक्षेप में कवर करने के लिए पैरामीट्रिज़ करें, और परीक्षणों को तेज़ और पृथक रखने के लिए बाहरी निर्भरता का अनुकरण करें। परीक्षण न किए गए कोड को खोजने के लिए कवरेज को मापें, लेकिन 100% का पीछा करने से अधिक महत्वपूर्ण तर्क का परीक्षण करने को प्राथमिकता दें। अच्छे परीक्षण एक ऐसा निवेश है जो हर बार जब आप रिफैक्टर करते हैं या आत्मविश्वास के साथ सुविधाएँ जोड़ते हैं तो आपको लाभ मिलता है।assert एएए पैटर्न में कथन, पुन: प्रयोज्य सेटअप के लिए फिक्स्चर का उपयोग करें, कई मामलों को संक्षेप में कवर करने के लिए पैरामीट्रिज़ करें, और परीक्षणों को तेज़ और पृथक रखने के लिए बाहरी निर्भरता का अनुकरण करें। परीक्षण न किए गए कोड को खोजने के लिए कवरेज को मापें, लेकिन 100% का पीछा करने से अधिक महत्वपूर्ण तर्क का परीक्षण करने को प्राथमिकता दें। अच्छे परीक्षण एक ऐसा निवेश है जो हर बार जब आप रिफैक्टर करते हैं या आत्मविश्वास के साथ सुविधाएँ जोड़ते हैं तो आपको लाभ मिलता है।
🔗 Share this article
✍️ Leave a Comment