ãèªåãæžããã³ãŒããæ¬åœã«æ£ããåããŠãïŒããããªäžå®ãæããããšã¯ãããŸãããïŒããã°ã©ã ãæ³å®éãã«åãããèªåã§ãã§ãã¯ããŠãããä»çµã¿ããã¹ãã³ãŒãã§ããäžåºŠæžããŠããŸãã°ãã³ãã³ãäžçºã§äœåºŠã§ãæ€èšŒã§ããââãããããããªããã§ãéçºäœéšã¯åçã«å€ãããŸãâš
ãã¹ãã³ãŒããæžãç¿æ £ã身ã«ã€ããšãæ©èœè¿œå ããªãã¡ã¯ã¿ãªã³ã°ã®ãã³ã«ãä»ã®éšåãå£ããŠããªããããèªåã§ç¢ºèªã§ããããã«ãªããŸããä¿®æ£ãæããªããªããã³ãŒããè²ãŠãŠããæ¥œãããäœåã«ããªããŸããð
ãã¹ããšã¯ãããã°ã©ã ãæ³å®éãã®åäœãããããšã確èªããäœæ¥ã®ããšã§ããäŸãã°æ¯æã®ã¹ãã代ãéèšããã¢ããªã§ãæ¬æ¥ã¯1æãã12æãŸã§ã®åèšãåºãã¯ããªã®ã«ããªãã1æãã11æãŸã§ããåèšãããŠããªãââãããªäžå ·åïŒãã°ïŒãæªç¶ã«é²ãã®ããã¹ãã®åœ¹å²ã§ãã
ãã¹ãã§ç¢ºèªããã®ã¯çµæã®æ£ããã ãã§ã¯ãããŸãããåŠçã«æéãããããããŠããªãããæ³å®ãã人æ°ã®åæã¢ã¯ã»ã¹ã«èãããããããšãã£ãããã©ãŒãã³ã¹ã»è² è·ã®èгç¹ãå«ãŸããŸããã絶察ã«ãã°ã®ãªãå®ç§ãªã³ãŒããæžãã人ãã¯ããªãã®ã§ããã¹ãã¯ãã¹ãŠã®éçºè ã«å¿ èŠãªæè¡ãšèšããŸãã
ãã¹ãã¯å€§ããåããŠæ¬¡ã®3çš®é¡ããããŸãã
ä»åæ±ãã®ã¯ããã£ãšãåºæ¬ãã€é »ç¹ã«æžãããšã«ãªãåäœãã¹ãã®é åã§ãã
Pythonã§ãã¹ãã³ãŒããæžããªããããã¡ã¯ãã¹ã¿ã³ããŒãã®ã©ã€ãã©ãªã pytest ã§ããæšæºã©ã€ãã©ãªã§ã¯ãªãã®ã§ããŸãã¯ã€ã³ã¹ããŒã«ããå§ããŸãããã
pip install pytest
ãã¹ãããã颿° sum_numbers ã code.py ã«æžãããŠãããšããŸããããã src ãã£ã¬ã¯ããªã«çœ®ããåãé局㫠tests ãã£ã¬ã¯ããªãäœã£ãŠããã®äžã«ãã¹ãã³ãŒããæžã test_code.py ãçšæããŸãã
src/code.py â ãã¹ã察象ã®é¢æ°ãæžããã¡ã€ã«tests/test_code.py â ãã¹ãã³ãŒããæžããã¡ã€ã«src/__init__.py ãš tests/__init__.py â äžèº«ã¯ç©ºã§OKãããããªããšãã¹ãå®è¡æã«ãšã©ãŒã«ãªããŸãå¶æ°ã®åèšãšå¥æ°ã®åèšãè¿ãã·ã³ãã«ãªé¢æ° sum_numbers ãäŸã«ããŸãã
# src/code.py
def sum_numbers(a, b):
    return a + b
ããã«å¯Ÿãããã¹ãã³ãŒãã¯ããã§ãã
# tests/test_code.py
from src.code import sum_numbersdef test_sum_numbers():
    result = sum_numbers(1, 2)
    assert result == 3
ãã€ã³ãã¯2ã€ããã¹ã颿°ã®åå㯠test_ ã§å§ããããšãšãassert æã§ãæåŸ
ããçµæãšäžèŽãããããæžãããšã§ããassert ã®åŸãã®æ¡ä»¶ã True ãªããã¹ãæåãFalse ãªã倱æãšãªããŸãã
ã³ãã³ãã©ã€ã³ã§ãããžã§ã¯ãã®ã«ãŒãã«ç§»åããŠã次ã®ããã«å®è¡ããŸãã
pytest tests/test_code.py
æåããã°ã1 passedããšè¡šç€ºããã倱æããã°ã1 failedããšãšãã«ãã©ã® assert æãã©ããªå€ã§å€±æãããã詳ãã衚瀺ãããŸããäŸãã° assert result == 4 ãšééã£ãŠæžããŠããã°ããassert 3 == 4ãã®ããã«å®éã®å€ãäžç®ã§ãããã®ã§ããããã°ã楜ã
ã§ãð
1ã€ã®ãã¹ã颿°ã« assert æãè€æ°äžŠã¹ãããšãã§ããŸããäŸãã°é¢æ°ã2ã€ã®å€ãã¿ãã«ã§è¿ãå Žåãããããã®å€ãå¥ã
ã«æ€èšŒã§ããŸãããã¹ããã¡ã€ã«ãå¢ããŠãããããã¡ã€ã«åãæå®ããåã« pytest ãšæã€ã ãã§ãé
äžã®ãã¹ããã¹ãŠãäžæ°ã«å®è¡ããããšãå¯èœã§ãã
å®åã§ã¯ããã¹ãããã颿°ã®äžã§ãå€éšAPIãåŒã³åºããŠããããšããã±ãŒã¹ããããããŸããäŸãã°ãŠãŒã¶ãŒIDãåãåã£ãŠãå€éšãµãŒããŒããååãååŸããŠèŸæžãè¿ã颿°ãèããŠã¿ãŸãããã
# src/code.py
import requestsdef get_json_data(user_id):
    res = requests.get(f"https://api.example.com/users/{user_id}")
    return res.json()def get_username_dict(user_ids):
    result = {}
    for user_id in user_ids:
        data = get_json_data(user_id)
        result[user_id] = data["name"]
    return result
ãã®ãŸãŸ get_username_dict ããã¹ããããšãå€éšAPIã«å®éã«ã¢ã¯ã»ã¹ããŠããŸããŸãããµãŒããŒãèœã¡ãŠããããã¹ãã倱æããããæ¯åãããã¯ãŒã¯éä¿¡ãèµ°ãã®ãå°ããŸãããð
ãããªãšãã«äœ¿ãã®ã ã¢ãã¯ïŒmockïŒã§ããpytestã® monkeypatch ãšããä»çµã¿ã䜿ããšãç¹å®ã®é¢æ°ãäžæçã«å¥ã®ãããŒé¢æ°ã«å·®ãæ¿ããããŸãã
# tests/test_code.py
from src import code
from src.code import get_username_dictdef get_json_data_mock(user_id):
    return {"name": "ãµãã"}def test_get_username_dict(monkeypatch):
    monkeypatch.setattr(code, "get_json_data", get_json_data_mock)
    result = get_username_dict([1, 2])
    assert result == {1: "ãµãã", 2: "ãµãã"}
monkeypatch.setattr ã®3ã€ã®åŒæ°ã§ããã©ã®ã¢ãžã¥ãŒã«ã®ã»ã©ã®é¢æ°ãã»äœã«çœ®ãæãããããæå®ããŸããããã§ get_username_dict ã®äžã§åŒã°ãã get_json_data ã¯ãå€éšéä¿¡ããåžžã«åºå®ã®èŸæžãè¿ããããŒé¢æ°ã«å·®ãæ¿ããããå®å®ãããã¹ããå¯èœã«ãªããŸãð¯
ãäžæ£ãªå
¥åãæ¥ãããã¡ããšäŸå€ãæããŠããããããããã¹ãã§ç¢ºèªãããéèŠãªãã€ã³ãã§ããäŸãã°ååã None ãªã ValueError ãæãã颿°ãèŠãŠã¿ãŸãããã
# src/code.py
def username_validation(username):
    if username is None:
        raise ValueError("ååãèšå®ãããŠããŸãã")
ããããã¹ãããã«ã¯ãpytestã® pytest.raises ã with æã§äœ¿ããŸãã
import pytest
from src.code import username_validationdef test_username_validation():
    with pytest.raises(ValueError) as e:
        username_validation(None)
    assert str(e.value) == "ååãèšå®ãããŠããŸãã"
with pytest.raises(ValueError) ã®ãããã¯å
ã§æå®ããäŸå€ãçºçããã°ãã¹ãæåããã以å€ã®äŸå€ïŒãŸãã¯äŸå€ãçºçããªãå ŽåïŒã¯ãã¹ã倱æãšãªããŸããe.value ããäŸå€ã¡ãã»ãŒãžã«ãã¢ã¯ã»ã¹ã§ããã®ã§ãã¡ãã»ãŒãžå
容ãŸã§å«ããŠæ€èšŒã§ããã®ã䟿å©ã§ãã
ãã¹ãã³ãŒãã®ç䟡ã¯ãæåã®åäœç¢ºèªãã§ã¯ãªããæ©èœè¿œå ããªãã¡ã¯ã¿ãªã³ã°ãããåŸã«çºæ®ãããŸããã³ãŒãã倿Žãããšãã倿ŽããŠããªãæ¢åæ©èœãŸã§å£ããŠããŸã£ãŠããªããââãããç®èŠã§ç¢ºèªããã®ã¯èšå€§ãªåŽåã§ãããpytest ã³ãã³ãäžçºã§å
šèªåãã§ãã¯ã§ããŸãð
ããã¹ããæžãæéããªãããšæãããããããŸããããåŸããæåã§åäœç¢ºèªããæéãšæ¯ã¹ããå§åçã«ç¯çŽã«ãªããŸããè€éã§éèŠãªæ©èœããåªå çã«ãã¹ããæžãããšãããã©ã³ã¹æèŠã§åãå ¥ããã®ãããããã§ãã
ãã¹ãã³ãŒãã¯äžåºŠç¿åŸããã°ãäžçã¢ãã®ã¹ãã«ã«ãªããŸããäœç³»çã«åŠã¹ãæžç±ãæå ã«çœ®ããŠãããšãåŠç¿å¹çãäžæ°ã«äžãããŸããâš
pytestã®åºæ¬ããå®è·µçãªãã¯ããã¯ãŸã§ç¶²çŸ çã«è§£èª¬ããã£ã¯ã¹ãã£ããã©ã¡ã¿ã©ã€ãºãã¢ãã¯ãªã©ãçŸå Žã§äœ¿ãæ©èœãé ã远ã£ãŠåŠã¹ãŸãã
åãã³ãã»ãã¹ãã»äŸå€èšèšãªã©ããå£ãã«ããã³ãŒãããæžãããã®ãã©ã¯ãã£ã¹ã培åºè§£èª¬ãäžçŽè ãžã®ã¹ãããã¢ããã«æé©ã§ãã
ãã¹ãå®¹ææ§ã®é«ãã³ãŒãèšèšããã¢ãã¯ã®äœ¿ãã©ãããªã©ãPythonéçºè ãæŒãããã¹ã90é ç®ãåçž®ãããŠããŸãã
é·æéã®ã³ãŒãã£ã³ã°ã»ãã¹ãèšè¿°ã§ãç²ãã«ããããŒããŒãã¯ãåŠç¿ç¶ç¶ã®å¿åŒ·ã峿¹ã«ãªããŸãã
ãã¹ã察象ã®ã³ãŒããšãã¹ãã³ãŒãã䞊ã¹ãŠèŠããããã¥ã¢ã«ãã£ã¹ãã¬ã€ç°å¢ã¯ãéçºå¹çãäžæ°ã«åºäžãããŠãããŸãã
A. ããã¹ãŠã®é¢æ°ã«100%ã®ãã¹ããæžããã®ã¯çŸå®çã§ã¯ãããŸãããè€éãªããžãã¯ãéèŠãªæ©èœããåªå çã«ãã¹ããæžãã®ãçŸå®çã§ãããã¹ãã«ãããæéãšããã°ãçºçãããšãã®åœ±é¿åºŠã倩秀ã«ãããŠå€æããŸãããã
A. unittest ã¯Pythonæšæºã©ã€ãã©ãªã§ãããçŸä»£ã§ã¯ããç°¡æœã«æžãã pytest ãäž»æµã§ããèšè¿°éãå°ãªãã倱ææã®è¡šç€ºããããããããããç¹å¥ãªçç±ããªããã°pytestãéžã¶ã®ãããããã§ãã
A. ãã¹ãé§åéçºïŒTDDïŒã¯ãã¹ããå ã«æžããŠããå®è£ ããææ³ã§ãã³ãŒãã®èšèšãè¯ããªãã¡ãªããããããŸãããã ãæ £ããå¿ èŠãªã®ã§ããŸãã¯ãå®è£ åŸã«ãã¹ããæžããç¿æ £ããå§ããŠãæ £ããŠãããTDDã«ææŠããã®ãã¹ã ãŒãºã§ãã
A. ãã¡ããå¯èœã§ãããã¹ãã³ãŒãå
ã§ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã¡ãœãããåŒã³åºã㊠assert æã§æ€èšŒããã ãã颿°ã®ãã¹ããšã»ãŒåãæµãã§æžããŸãã
__init__.py ããªããšã©ãããŠãšã©ãŒã«ãªãã®ïŒA. Pythonããã£ã¬ã¯ããªããããã±ãŒãžããšããŠèªèããããã®ç®å°ã __init__.py ã§ããããããªããšãfrom src.code import ... ã®ãããªã€ã³ããŒãã解決ã§ããããã¹ãå®è¡æã«ãšã©ãŒã«ãªããŸãã空ãã¡ã€ã«ã§ãæ§ããŸããã®ã§å¿
ã眮ããŸãããã
pytestã䜿ãã°ãassert æãæžãã ãã®ã·ã³ãã«ãªã³ãŒãã§ãæ³å®éãã«åããããæ©æ¢°çã«ç¢ºèªã§ããããã«ãªããŸããããã« monkeypatch ã§å€éšäŸåãã¢ãã¯åããããpytest.raises ã§äŸå€ãæ€èšŒããããšãå®åã§å¿
èŠãªæ©èœãäžéãæã£ãŠããŸãð ïž
æåã®1è¡ããå§ããã°ãåŸã
ã«ãã¹ãã®æžãæ¹ãäœã«éŠŽæãã§ããŸãã仿¥åŠãã å
容ãå
ã«ãèªåã®æžããå°ããªé¢æ°ããã§ã test_ 颿°ãæžããŠã¿ãŠãã ãããã倿ŽããŠãå£ããŠããªãããšèªä¿¡ãæã£ãŠèšããéçºäœéšã¯ãäžåºŠå³ãããšããææŸããŸãããâš
ð ãåãã³ãŒãããããèœã¡ãª…
ð Pythonã®ãå¶åŸ¡æ§æã…
ð ãæååãèªåšã«æãã人ã…
ð ãèªã¿ãããã³ãŒããã¯å€æ°…
ð ããã°ã©ãã³ã°ã®ãã¹ãŠã¯ã…
ð ãæååã«å€æ°ãå ¥ãããã…