pytest 2026-এ পাইথন কোড পরীক্ষা করার জন্য প্রকৃত মানদণ্ড — বিল্ট-ইন ইউনিট টেস্টের চেয়ে সহজ এবং আরও শক্তিশালী। ভাল পরীক্ষাগুলি উত্পাদনের আগে বাগগুলি ধরে, আত্মবিশ্বাসী রিফ্যাক্টরিং সক্ষম করে এবং আপনার কোড কীভাবে আচরণ করা উচিত তা নথিভুক্ত করে। এই নির্দেশিকা আপনাকে আপনার প্রথম পরীক্ষা থেকে উন্নত প্যাটার্নে নিয়ে যায়।
📋 Table of Contents
- সেটআপ
- আপনার প্রথম পরীক্ষা
- AAA প্যাটার্ন (ব্যবস্থা, আইন, জাহির)
- ফিক্সচার — পুনরায় ব্যবহারযোগ্য পরীক্ষা সেটআপ
- প্যারামেট্রিকরণ — অনেক ক্ষেত্রে পরীক্ষা করুন
- উপহাস — নির্ভরতা থেকে বিচ্ছিন্ন কোড
- টেস্টিং এক্সেপশন এবং এজ কেস
- পরিমাপ কভারেজ
- কনফিগারেশন (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"
AAA প্যাটার্ন (ব্যবস্থা, আইন, জাহির)
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কোড না পড়ে কি ভেঙ্গেছে তা বলে - পরীক্ষা আচরণ, বাস্তবায়ন নয়: ফাংশনটি কী করে তা পরীক্ষা করুন, কীভাবে নয় — তাই রিফ্যাক্টরিং পরীক্ষাগুলি ভঙ্গ করে না
- পরীক্ষা দ্রুত এবং বিচ্ছিন্ন রাখুন: প্রতিটি পরীক্ষা যেকোনো ক্রমে স্বাধীনভাবে চালানো উচিত
- মোক বাহ্যিক নির্ভরতা: ডেটাবেস, API এবং ফাইল সিস্টেমগুলি ইউনিট পরীক্ষায় উপহাস করা উচিত
- অর্থপূর্ণ কভারেজের লক্ষ্য: 80%+ একটি ভাল লক্ষ্য, কিন্তু 100% তাড়া করার পরিবর্তে জটিল পথগুলিকে পুঙ্খানুপুঙ্খভাবে কভার করুন
প্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রশ্ন: পাইটেস্ট বনাম ইউনিটটেস্ট?
উত্তর: পাইটেস্ট সহজ (সাধারণassert, কোন বয়লারপ্লেট ক্লাস নেই), আরও শক্তিশালী (ফিক্সচার, প্যারামেট্রিাইজেশন), এবং একটি সমৃদ্ধ প্লাগইন ইকোসিস্টেম রয়েছে। এটি ইউনিটটেস্ট পরীক্ষাও চালাতে পারে। নতুন প্রকল্পের জন্য pytest ব্যবহার করুন.
প্রশ্ন: আমার কত পরীক্ষার কভারেজ দরকার?
উত্তর: 80% একটি সাধারণ লক্ষ্য। কিন্তু কভারেজ একটি গাইড, লক্ষ্য নয় — দুর্বল দাবী সহ 100% কভারেজ সমালোচনামূলক যুক্তির পুঙ্খানুপুঙ্খ পরীক্ষা সহ 80% এর চেয়ে খারাপ। গুরুত্বপূর্ণ কোড কভার উপর ফোকাস.
প্রশ্ন: আমি কি ডাটাবেসকে উপহাস করব বা একটি পরীক্ষা ডাটাবেস ব্যবহার করব?
উত্তর: ইউনিট পরীক্ষায় এটি উপহাস করুন (দ্রুত, বিচ্ছিন্ন)। ইন্টিগ্রেশন পরীক্ষায় একটি বাস্তব পরীক্ষার ডাটাবেস ব্যবহার করুন (প্রকৃত প্রশ্নের কাজ যাচাই করে)। উভয়েরই জায়গা আছে — যুক্তিবিদ্যার জন্য ইউনিট পরীক্ষা, ডেটা স্তরের জন্য ইন্টিগ্রেশন পরীক্ষা।
প্রশ্ন: একটি ফিক্সচার এবং একটি নিয়মিত ফাংশনের মধ্যে পার্থক্য কী?
উত্তর: ফিক্সচারগুলি pytest দ্বারা পরিচালিত হয় — সেগুলি পরীক্ষার আগে সেট আপ করা হয় যা তাদের অনুরোধ করে এবং পরে পরিষ্কার করতে পারে (ফলের মাধ্যমে)। তারা স্বয়ংক্রিয় জীবনচক্র ব্যবস্থাপনার সাথে পুনরায় ব্যবহারযোগ্য, বিচ্ছিন্ন পরীক্ষা নির্ভরতা প্রদান করে।
প্রশ্ন: আমি কীভাবে অ্যাসিঙ্ক কোড পরীক্ষা করব?
উ: ইনস্টল করুনpytest-asyncio এবং@pytest.mark.asyncioদিয়ে পরীক্ষা চিহ্নিত করুন . তাহলে আপনি পারবেনawait অ্যাসিঙ্ক ফাংশন পরীক্ষা করতে আপনার পরীক্ষার ফাংশনের ভিতরে।
উপসংহার
pytest পাইথন পরীক্ষাকে সহজ এবং শক্তিশালী করে তোলে। প্লেইন দিয়ে শুরু করুনassert AAA প্যাটার্নে বিবৃতি, পুনঃব্যবহারযোগ্য সেটআপের জন্য ফিক্সচার ব্যবহার করুন, অনেক ক্ষেত্রে সংক্ষিপ্তভাবে কভার করার জন্য প্যারামেট্রিজ করুন এবং পরীক্ষাগুলি দ্রুত এবং বিচ্ছিন্ন রাখতে বাহ্যিক নির্ভরতাকে উপহাস করুন। অ-পরীক্ষিত কোড খুঁজে পেতে কভারেজ পরিমাপ করুন, কিন্তু 100% তাড়া করার চেয়ে পুঙ্খানুপুঙ্খভাবে সমালোচনামূলক যুক্তি পরীক্ষাকে অগ্রাধিকার দিন। ভাল পরীক্ষা হল এমন একটি বিনিয়োগ যা প্রতিবার আপনি আত্মবিশ্বাসের সাথে রিফ্যাক্টর বা বৈশিষ্ট্য যোগ করার সময় পরিশোধ করে।
🔗 Share this article
✍️ Leave a Comment