אני פייתוניסט שנה וחצי, והאמת שזה מאד כיף. זה כמו לכתוב פסאודו קוד שאיכשהו פשוט עובד בצורה המצופה;
כמו לכתוב טקסט באנגלית לפי מקרים; כמו להלחין מוזיקה רק מזמזומים. הבנתם את הנקודה.
אבל חלק בנשמה הפרונטאנדיסטית שלי – לא שיש לי כזאת, תסתכלו על האתר. ה-CSS הסתכל עליו ואמר: ״אוי זה מקרה אבוד״
והתאבד; אז הרכיב הזה שבי התגעגע לספריות הטסטים מעולות שב-js מאותן הסיבות שאני דווקא אוהב פייתון: ספריות ב-js כתובות כמו אנגלית.
כדי לתאר מה אתה בודק – אתה פשוט משתמש במשפט שמתאר מה אתה בודק. סטרינג.
אין לך צורך להשתמש בפונקציה עם קו תחתון בין מילה למילה כמו כאן:
calc_example = Calc(5, 10)
class MyTestCase(unittest.TestCase):
def test_get_false_for_incorrect_results(self):
self.assertFalse(calc_example.add() === 50)
לעומת היופי הבא:
const calc_example = new Calc(5, 10);
describe('Check if the add method works as inteded', () => {
test('Check is 5 + 10 is falsey', () => {
expect(calc_example.add() === 50).toBeFalsy();
});
כתרגיל קטן, החלטתי לממש את jest ב-python:
ה-interface אליו פשוט:
from python_project.test_logger import TestLogger
class PyJest:
def __init__(self, logger: TestLogger, expression):
self.tester_logger = logger
self.expression = expression
def to_be(self, assertion: bool):
is_equal = self.expression == assertion
return self.tester_logger.conditional_logger_writer(is_equal)
....
בנתיים, הפונקציה הממומשת היחידה היא to_be. היא בודקת בפשטות האם ה-expression שנבדק אכן שווה ל-assertion, ואותו מעבירה לפונקציה conditional_logger_writer.
מה היא עושה? היא חלק ממחלקת הלוגים לטסטים, ופשוטבודקת האם is_equal. הוא true או false:
import logging
from abc import ABC
from typing import Optional
class TestLogger(ABC):
def __init__(self, logging_name: Optional[str]):
logging_name = logging_name if not None else "testing"
self.logger = logging.getLogger(logging_name)
def _success_writer(self):
raise NotImplemented
def _failure_writer(self):
raise NotImplemented
def conditional_logger_writer(self, condition: bool):
if condition:
return self._success_writer()
else:
return self._failure_writer()
כפי שניתן לראות, ה-test logger הוא אבסטרקטי ומבקש ממי שיורש את הממשק שהוא נותן לממש את _success_writer ואת _failure_writer. ואיך מימשתי אותם?
from python_project.py_jest import PyJest
from python_project.test_logger import TestLogger
class PythonJestLogger(TestLogger):
def describe(self, description, fn):
# self.logger.info(description)
print(description)
fn()
def it(self, msg, fn):
self.describe(f'{msg}', fn)
def _success_writer(self):
print("pass")
self.logger.info("pass")
return True
def _failure_writer(self):
print("fail")
# self.logger.error("fail")
return False
tester_logger = PythonJestLogger("jest_test")
def expect(exp):
return PyJest(tester_logger, exp)
אחרונה חביבה היא הפונקציה expect שמחזירה את pyJest.
אז הנה כמה דוגמאות:
expect(5).to_be(5)
expect(add(10, 20)).to_be(30)
בצורה דומה אפשר לממש את not_to_be ועוד פונקציות. פשוט, קל ובנאלית מובנת.
אני הייתי אייל ומתי אני מרצה ב-pycon הבא :(((