$30 off During Our Annual Pro Sale. View Details »

クリーンアーキテクチャとTDDの中でGitHub Copilotを使ってみた! - NIFTY Tech Talk #14

クリーンアーキテクチャとTDDの中でGitHub Copilotを使ってみた! - NIFTY Tech Talk #14

ニフティ株式会社

October 02, 2023
Tweet

More Decks by ニフティ株式会社

Other Decks in Programming

Transcript

  1. ΫϦʔϯΞʔΩςΫνϟͱTDDͷதͰ
    GitHub CopilotΛ࢖ͬͯΈͨʂ
    @͚ͨΖ͍Ͳ
    Tech Talk #14

    View Slide

  2. ͜Μʹͪ͸ʂ

    ୈೋ։ൃΦϓγϣϯαϒνʔϜ
    ʹॴଐ͍ͯ͠·͢ɻ
    ͚ͨΖ͍Ͳ
    @takenokoroid

    View Slide

  3. ճઢʹ෇ਵ͢ΔΦϓγϣϯαʔ
    ϏεΛӡ༻ɾอक͍ͯ͠·͢ɻ
    ͚ͨΖ͍Ͳ
    @takenokoroid
    https://security.nifty.com/sec24/

    View Slide

  4. ΫϦʔϯΞʔΩςΫνϟʹଇΓ
    ։ൃΛߦ͍ͬͯ·͢ɻ
    ͚ͨΖ͍Ͳ
    @takenokoroid
    https://amzn.asia/d/0auO8rM

    View Slide

  5. ࠷ۙ͸TDDͰ։ൃΛਐΊ͍ͯ͘
    Α͏ʹ΋͍ͯ͠·͢ɻ
    ͚ͨΖ͍Ͳ
    @takenokoroid
    https://marsner.com/blog/why-test-driven-development-tdd/

    View Slide

  6. ෳࡶͳ֊૚ߏ଄ɾϜϥͷ͋Δς
    ετ͕ͭΒ͍ʙ
    ͚ͨΖ͍Ͳ
    @takenokoroid

    View Slide

  7. ෳࡶͳ֊૚ߏ଄ɾϜϥͷ͋Δς
    ετ͕ͭΒ͍ʙ
    ͚ͨΖ͍Ͳ
    @takenokoroid
    @takenokoroid
    ๻͕खॿ͚ͯ͋͛͠ΔΑʂ
    Copilot
    @copilot
    @copilot Ϛʁ
    ͚ͨΖ͍Ͳ
    @takenokoroid

    View Slide

  8. - ෳࡶͳ֊૚ߏ଄
    - ґଘؔ܎͕DIPʹΑΓҰ෦ෳࡶԽ
    - ॳݟ߈ུΉΓΆʢֶशίετ૿ʣ
    ෳࡶͳ֊૚ߏ଄ͷ໰୊

    View Slide

  9. ෳࡶͳ֊૚ߏ଄ͷ໰୊


    ґଘؔ܎
    υϝΠϯ஌ࣝ
    ࠓ೔ͷ༦൧
    ਓੜઃܭ
    ࢥ͍΍Γ

    View Slide

  10. ෳࡶͳ֊૚ߏ଄ͷ໰୊


    ґଘ
    ؔ܎
    υϝΠϯ஌ࣝ
    ࠓ೔ͷ༦൧
    ਓੜઃܭ
    ࢥ͍΍Γ

    View Slide

  11. - ςετίʔυͷϜϥ
    - ݸਓͷखบ΍ࢥ૝Ͱςετίʔυͷॻ͖ํ͕Ұ෦ҟͳΔ
    - ϨϏϡʔίετ͕૿Ճ͢Δ
    - ݸਓͷεΩϧʹΑͬͯςετ͕มԽ͢Δෆ݈શͳঢ়ଶʹ
    ςετίʔυͷϜϥͷ໰୊

    View Slide

  12. def test_must_bill_in_bill_month(self):
    subscription = Subscription(
    ...
    )
    # mockͷઃఆ
    ...
    test_cases: list[dict] = [
    {
    ...
    }
    ]
    for test_case in test_cases:
    with self.subTest(test_case["name"]):
    # ࣮ߦ
    actual = ...
    # ݺͼग़͠ςετ
    self.assertEqual(...)
    # returnͷςετ
    self.assertEqual(...)
    UsecaseͷςετͰ
    େ͖ͳҧ͍͕
    ςετέʔεͷॻ͖ํʹ஫໨

    View Slide

  13. def test_subscription_is_active_with_single_entry(self):
    # ਖ਼ৗܥ:αϒεΫϦϓγϣϯ͕ACTIVE׌ͭ1݅ͷ࣌
    request_value = {
    ...
    }
    rs = ...,
    ɹwith self.app.app_context():
    # ਖ਼ৗܥ
    result = self.interactor.handle(
    request=request_value["request"],
    _txs=request_value["transaction"],
    )
    # ฦΓ஋͕True͔Ͳ͏͔ΛνΣοΫ
    self.assertEqual(...)
    self.assertEqual(...)
    def test_subscription_is_active_with_single_entry(self):
    # ਖ਼ৗܥ:αϒεΫϦϓγϣϯ͕ACTIVE׌ͭ2݅Ҏ্ͷ࣌
    ...
    UsecaseͷςετͰ
    େ͖ͳҧ͍͕
    ͪ͜ΒͰ͸ςετέʔε͝ͱ
    ʹϝιουΛ෼͚͍ͯΔ

    View Slide

  14. - ෳࡶͳ֊૚ߏ଄
    - ґଘؔ܎͕೴ͷϝϞϦΛѹഭͯ͠ɺίʔυ΁ͷࢥ͍΍Γ͕ඈͿ
    - ࣮૷࣌ʹർΕΔ
    - ςετίʔυͷϜϥ
    - ϨϏϡʔ͕ਏ͍
    - ݸਓͷεΩϧʹΑ࣭͕ͬͯมΘΔෆ݈શͳঢ়ଶʹ
    ໰୊఺·ͱΊ

    View Slide

  15. - ෳࡶͳ֊૚ߏ଄
    - ґଘؔ܎͕೴ͷϝϞϦΛѹഭͯ͠ɺίʔυ΁ͷࢥ͍΍Γ͕ඈͿ
    - ࣮૷࣌ʹർΕΔ
    - ςετίʔυͷϜϥ
    - ϨϏϡʔ͕ਏ͍
    - ݸਓͷεΩϧʹΑ࣭͕ͬͯมΘΔෆ݈શͳঢ়ଶʹ
    ໰୊఺·ͱΊ

    View Slide

  16. ෳࡶͳ֊૚ߏ଄ʹରͯ͠Copilot͸Ͳ͏ͩͬͨ


    ґଘ
    ؔ܎
    υϝΠϯ஌ࣝ
    ࠓ೔ͷ༦൧
    ਓੜઃܭ
    ࢥ͍΍Γ

    View Slide

  17. ෳࡶͳ֊૚ߏ଄ʹରͯ͠Copilot͸Ͳ͏ͩͬͨ


    ґଘؔ܎
    υϝΠϯ஌ࣝ
    ࠓ೔ͷ༦൧
    ਓੜઃܭ
    ࢥ͍΍Γ
    ґଘؔ܎
    ΞϧΰϦζϜ
    etc..

    View Slide

  18. - ৭ʑͳॻ͖ํ͕Ͱ͖ͯ͠·ͬͨςετίʔυ
    - ϨϏϡʔ΍ίʔυϦʔσΟϯά͕೉͘͠...
    ςετίʔυͷϜϥʹର͠Copilot͸Ͳ͏ͩͬͨ

    View Slide

  19. - طଘςετίʔυͷίϯςΩετΛཧղ͠ఏҊͯ͘͠ΕΔ
    - ίʔυ͕౷Ұ͞ΕɺϨϏϡʔ͠΍͘͢ͳͬͨ
    ςετίʔυͷϜϥʹର͠Copilot͸Ͳ͏ͩͬͨ

    View Slide

  20. - ͔ͬ͠Γͱλϒ؅ཧ͠ίϯςΩετΛಡΈࠐ·ͤΔ
    - ։ൃऀࣗ਎΋࣮૷ʹूதͰ͖ΔΑ͏ʹͳͬͨ
    - ໨త΍ҙਤΛߟ͑ɺͦΕΛ఻͑Δͷ͕ओʹͳͬͨ
    ςετίʔυͷϜϥʹର͠Copilot͸Ͳ͏ͩͬͨ

    View Slide

  21. - ଟॏԽͨ͠֊૚ߏ଄ͷͳ͔Ͱ΋ޮՌతʹಇ͍ͨ
    - ΤϯδχΞ͸֓೦Λཧղ͠ɺಛఆͷϑΝΠϧΛ։͚ͩ͘Ͱྑ͍
    - ஸೡͳίϝϯτΛߟ͑ͨΓͱʮࢥ͍΍Γʯͷ͕࣌ؒ૿͑ͨ
    - ςετίʔυ͸ϨϏϡϫʔʹ༏͘͠ͳͬͨ
    - λϒ؅ཧΛҙࣝ͢Δ͜ͱͰ࣮૷ʹूதͰ͖Δ
    - ίʔυͷҙਤ΍໨తͰձ࿩͢Δ͜ͱ͕ҎલΑΓ૿Ճͨ͠
    ·ͱΊ

    View Slide

  22. Copilot͸͍͍ͧ
    ͚ͨΖ͍Ͳ
    @takenokoroid

    View Slide