לכתוב test-ים של js ב-python

אני פייתוניסט שנה וחצי, והאמת שזה מאד כיף. זה כמו לכתוב פסאודו קוד שאיכשהו פשוט עובד בצורה המצופה;
כמו לכתוב טקסט באנגלית לפי מקרים; כמו להלחין מוזיקה רק מזמזומים. הבנתם את הנקודה.

אבל חלק בנשמה הפרונטאנדיסטית שלי – לא שיש לי כזאת, תסתכלו על האתר. ה-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 הבא :(((

מאמרים נוספים

מהם תפקידי ה-on-call?

מה בעצם האחריות של on-call, ועל פי מה היא נקבעת? זאת בעיה שמתמודד אתה כל ארגון שנדרש לתת שירות מעבר לשעות העבודה. מה בעצם תפקיד הכונן בכלל? בעיקר לדאוג ליציבות המוצר או השירות בהתאם

עלויות מעבר מערכות לוגים ואלרטים

שינויים תשתיתיים הם תמיד החלטה מורכבת: בין אם המערכת היא בחיתוליה והשינוי בפועל אפשרי, יש הרבה אי וודאות שאופפת בחירות אחרות. בין כל בחירה יש טריידאופים, ובמכפלות גבוהות – יש להם מחיר שמרגישים. במאמר:

אחריות SRE

יש נטייה, בכל יצירה של תפקיד חדש – לשאול מאי נפקא מינה? בהקשר של SRE עולה השאלה האלמותית: מה ההבדל בין SRE ל-devops? גוגל הפיקו את הסרטון הנהדר הבא: אני חושב שזה קצת סמנטי,

אלרט טוב, ואלרט רע

לצערי, זאת בעיה של כל ארגון שגדל: לאורך הזמן הניטור על המערכת הופך לקשה יותר ויותר כמות ההתנהגויות של המערכת עולה כל אלו עלולים להשפיע על ההתנהגויות של הפיצ׳רים במוצר; לפעמים, תכנון של אלרט

יציבות בפרוייקטים? יאן ווגינפירר מסביר

יאן מנהל את החברות eventrys ו-daynix יאן, ספר על daynix שלך הקמנו אותה עם עוד שותפים לפני 9 שנים, כולנו מפתחי קרנל. בין אם זה לינוקס קרנל, וונדוז קרנל דרייברז או אמבדד. הרגשנו שצריך