ಪೈಟೆಸ್ಟ್ (pytest) - ಸರಳ ಮತ್ತು ಶಕ್ತಿಯುತ ಟೆಸ್ಟಿಂಗ್ ಫ್ರೇಮ್ವರ್ಕ್
pytest ಪೈಥಾನ್ನ ಅತ್ಯಂತ ಜನಪ್ರಿಯ ಮೂರನೇ-ಪಕ್ಷದ (third-party) ಟೆಸ್ಟಿಂಗ್ ಫ್ರೇಮ್ವರ್ಕ್ ಆಗಿದೆ. ಇದು unittest ಗಿಂತ ಕಡಿಮೆ ಕೋಡ್ (boilerplate) ಬಳಸಿ, ಹೆಚ್ಚು ಓದಬಲ್ಲ ಮತ್ತು ನಿರ್ವಹಿಸಬಲ್ಲ ಟೆಸ್ಟ್ಗಳನ್ನು ಬರೆಯಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ.
pytest ಅನ್ನು ಏಕೆ ಬಳಸಬೇಕು?
- ಸರಳ ಸಿಂಟ್ಯಾಕ್ಸ್: ಟೆಸ್ಟ್ಗಳನ್ನು ಸಾಮಾನ್ಯ ಪೈಥಾನ್ ಫಂಕ್ಷನ್ಗಳಾಗಿ ಬರೆಯಬಹುದು.
TestCaseಕ್ಲಾಸ್ಗಳ ಅಗತ್ಯವಿಲ್ಲ. - ಶಕ್ತಿಯುತ ಅಸರ್ಷನ್ಗಳು: ಸಾಮಾನ್ಯ
assertಸ್ಟೇಟ್ಮೆಂಟ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ವಿಫಲವಾದಾಗ ವಿವರವಾದ ಮಾಹಿತಿಯನ್ನು ನೀಡುತ್ತದೆ. - ಫಿಕ್ಸ್ಚರ್ಗಳು (Fixtures): ಟೆಸ್ಟ್ಗಳಿಗೆ ಬೇಕಾದ ಸೆಟಪ್, ಟಿಯರ್ಡೌನ್ ಮತ್ತು ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲು ಅತ್ಯಂತ ಶಕ್ತಿಯುತವಾದ ವ್ಯವಸ್ಥೆ.
- ದೊಡ್ಡ ಪ್ಲಗಿನ್ ವ್ಯವಸ್ಥೆ: ಕೋಡ್ ಕವರೇಜ್ (
pytest-cov), ಸಮಾನಾಂತರ ಟೆಸ್ಟಿಂಗ್ (pytest-xdist) ಮುಂತಾದ ಸಾವಿರಾರು ಪ್ಲಗಿನ್ಗಳು ಲಭ್ಯವಿದೆ. - ಉತ್ತಮ ಏಕೀಕರಣ:
unittestಮತ್ತುnoseಟೆಸ್ಟ್ ಸ್ಯೂಟ್ಗಳನ್ನು ಸಹ ಚಲಾಯಿಸಬಲ್ಲದು.
pytest ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದು
pytest ಅನ್ನು pip ಬಳಸಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಬಹುದು:
ಸರಳ ಟೆಸ್ಟ್ ಬರೆಯುವುದು
unittest ಉದಾಹರಣೆಯಲ್ಲಿ ಬಳಸಿದ ಅದೇ my_math.py ಫೈಲ್ ಅನ್ನು pytest ಬಳಸಿ ಟೆಸ್ಟ್ ಮಾಡೋಣ.
ಹಂತ 1: ಟೆಸ್ಟ್ ಮಾಡಬೇಕಾದ ಕೋಡ್
ಹಂತ 2: pytest ಟೆಸ್ಟ್ ಫೈಲ್ ರಚಿಸುವುದು
test_math_pytest.py ಎಂಬ ಫೈಲ್ ರಚಿಸಿ. pytest ಸ್ವಯಂಚಾಲಿತವಾಗಿ test_*.py ಅಥವಾ *_test.py ಫೈಲ್ಗಳಲ್ಲಿರುವ test_ ನಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಫಂಕ್ಷನ್ಗಳನ್ನು ಟೆಸ್ಟ್ಗಳೆಂದು ಗುರುತಿಸುತ್ತದೆ.
# test_math_pytest.py
from my_math import add, is_even
def test_add():
"""add ಫಂಕ್ಷನ್ ಅನ್ನು ಟೆಸ್ಟ್ ಮಾಡುತ್ತದೆ."""
assert add(5, 3) == 8
assert add(-1, 1) == 0
assert add(-5, -5) == -10
def test_is_even():
"""is_even ಫಂಕ್ಷನ್ ಅನ್ನು ಟೆಸ್ಟ್ ಮಾಡುತ್ತದೆ."""
assert is_even(2)
assert not is_even(3)
assert is_even(0)
unittest ಜೊತೆಗಿನ ವ್ಯತ್ಯಾಸಗಳು:
* unittest.TestCase ಕ್ಲಾಸ್ ಅನ್ನು ಇನ್ಹೆರಿಟ್ ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ.
* ಟೆಸ್ಟ್ಗಳು ಕೇವಲ ಸಾಮಾನ್ಯ ಫಂಕ್ಷನ್ಗಳು.
* self.assertEqual ಬದಲಿಗೆ, ಸರಳ assert ಸ್ಟೇಟ್ಮೆಂಟ್ಗಳನ್ನು ಬಳಸಲಾಗಿದೆ.
ಹಂತ 3: ಟೆಸ್ಟ್ಗಳನ್ನು ಚಲಾಯಿಸುವುದು
ಟರ್ಮಿನಲ್ನಲ್ಲಿ, ನಿಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಕೇವಲ pytest ಎಂದು ಟೈಪ್ ಮಾಡಿ:
pytest ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಎಲ್ಲಾ ಟೆಸ್ಟ್ ಫೈಲ್ಗಳನ್ನು ಮತ್ತು ಟೆಸ್ಟ್ ಫಂಕ್ಷನ್ಗಳನ್ನು ಹುಡುಕಿ ಚಲಾಯಿಸುತ್ತದೆ.
ಔಟ್ಪುಟ್:
============================= test session starts ==============================
...
collected 2 items
test_math_pytest.py .. [100%]
============================== 2 passed in ...s ===============================
ಫಿಕ್ಸ್ಚರ್ಗಳು (Fixtures)
ಫಿಕ್ಸ್ಚರ್ಗಳು pytest ನ ಅತ್ಯಂತ ಶಕ್ತಿಯುತ ವೈಶಿಷ್ಟ್ಯ. ಇವು ಟೆಸ್ಟ್ಗಳಿಗೆ ಬೇಕಾದ ಡೇಟಾ, ಆಬ್ಜೆಕ್ಟ್ಗಳು ಅಥವಾ ಯಾವುದೇ ಸೆಟಪ್ ಕೋಡ್ ಅನ್ನು ಒದಗಿಸುತ್ತವೆ. @pytest.fixture ಡೆಕೋರೇಟರ್ ಬಳಸಿ ಫಿಕ್ಸ್ಚರ್ಗಳನ್ನು ಡಿಫೈನ್ ಮಾಡಲಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ: ಒಂದು ಟೆಸ್ಟ್ಗೆ ಒಂದು ನಿರ್ದಿಷ್ಟ ಡೇಟಾ ಲಿಸ್ಟ್ ಬೇಕೆಂದು ಭಾವಿಸೋಣ.
import pytest
@pytest.fixture
def sample_data():
"""ಟೆಸ್ಟ್ಗಳಿಗಾಗಿ ಒಂದು ಮಾದರಿ ಲಿಸ್ಟ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ."""
print("\n(ಫಿಕ್ಸ್ಚರ್: sample_data ರಚಿಸಲಾಗುತ್ತಿದೆ...)")
return [10, 20, 30, 40, 50]
def test_sum(sample_data):
"""ಲಿಸ್ಟ್ನ ಮೊತ್ತವನ್ನು ಟೆಸ್ಟ್ ಮಾಡುತ್ತದೆ."""
print("test_sum ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ...")
assert sum(sample_data) == 150
def test_length(sample_data):
"""ಲಿಸ್ಟ್ನ ಉದ್ದವನ್ನು ಟೆಸ್ಟ್ ಮಾಡುತ್ತದೆ."""
print("test_length ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ...")
assert len(sample_data) == 5
sample_data ಎಂಬ ಫಿಕ್ಸ್ಚರ್ ಅನ್ನು ಡಿಫೈನ್ ಮಾಡಲಾಗಿದೆ.
* test_sum ಮತ್ತು test_length ಫಂಕ್ಷನ್ಗಳು sample_data ಅನ್ನು ಆರ್ಗ್ಯುಮೆಂಟ್ ಆಗಿ ಕೇಳುತ್ತಿವೆ.
* pytest ಸ್ವಯಂಚಾಲಿತವಾಗಿ sample_data ಫಿಕ್ಸ್ಚರ್ ಅನ್ನು ಚಲಾಯಿಸಿ, ಅದರ ರಿಟರ್ನ್ ಮೌಲ್ಯವನ್ನು ಈ ಟೆಸ್ಟ್ ಫಂಕ್ಷನ್ಗಳಿಗೆ ಪಾಸ್ ಮಾಡುತ್ತದೆ.
ಪ್ಯಾರಾಮೀಟರೈಸಿಂಗ್ ಟೆಸ್ಟ್ಗಳು (Parametrizing Tests)
ಒಂದೇ ಟೆಸ್ಟ್ ಫಂಕ್ಷನ್ ಅನ್ನು ಹಲವು ವಿಭಿನ್ನ ಇನ್ಪುಟ್ಗಳು ಮತ್ತು ನಿರೀಕ್ಷಿತ ಔಟ್ಪುಟ್ಗಳೊಂದಿಗೆ ಚಲಾಯಿಸಲು @pytest.mark.parametrize ಡೆಕೋರೇಟರ್ ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.
ಉದಾಹರಣೆ:
add ಫಂಕ್ಷನ್ ಅನ್ನು ಹಲವು ಇನ್ಪುಟ್ಗಳೊಂದಿಗೆ ಟೆಸ್ಟ್ ಮಾಡೋಣ.
import pytest
from my_math import add
@pytest.mark.parametrize("a, b, expected", [
(5, 3, 8), # ಟೆಸ್ಟ್ ಕೇಸ್ 1
(-1, 1, 0), # ಟೆಸ್ಟ್ ಕೇಸ್ 2
(-5, -5, -10), # ಟೆಸ್ಟ್ ಕೇಸ್ 3
(100, 200, 300) # ಟೆಸ್ಟ್ ಕೇಸ್ 4
])
def test_add_parametrized(a, b, expected):
assert add(a, b) == expected
pytest ಚಲಾಯಿಸಿದಾಗ, test_add_parametrized ಫಂಕ್ಷನ್ ನಾಲ್ಕು ಬಾರಿ ಚಲಾಯಿಸಲ್ಪಡುತ್ತದೆ, ಪ್ರತಿ ಬಾರಿ parametrize ನಲ್ಲಿ ನೀಡಿದ ಮೌಲ್ಯಗಳೊಂದಿಗೆ. ಇದು ಕೋಡ್ ಪುನರಾವರ್ತನೆಯನ್ನು ತಪ್ಪಿಸುತ್ತದೆ.
pytest ನ ಕೆಲವು ಉಪಯುಕ್ತ ಫ್ಲ್ಯಾಗ್ಗಳು
pytest -v: ಹೆಚ್ಚು ವಿವರವಾದ ಔಟ್ಪುಟ್ (Verbose).pytest -k "add": ಹೆಸರಿನಲ್ಲಿ "add" ಇರುವ ಟೆಸ್ಟ್ಗಳನ್ನು ಮಾತ್ರ ಚಲಾಯಿಸುತ್ತದೆ.pytest --maxfail=1: ಒಂದು ಟೆಸ್ಟ್ ವಿಫಲವಾದ ತಕ್ಷಣ ನಿಲ್ಲಿಸುತ್ತದೆ.pytest -x:maxfail=1ನ ಶಾರ್ಟ್ಕಟ್.
pytest ತನ್ನ ಸರಳತೆ, ಶಕ್ತಿಯುತ ಫೀಚರ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೀಯತೆಯಿಂದಾಗಿ ಆಧುನಿಕ ಪೈಥಾನ್ ಡೆವಲಪ್ಮೆಂಟ್ನಲ್ಲಿ ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಟೆಸ್ಟಿಂಗ್ ಟೂಲ್ ಆಗಿದೆ.