Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitHub Copilotを使って ちょっと楽にUnitTestを書けるようになった

GitHub Copilotを使って ちょっと楽にUnitTestを書けるようになった

DeNA×STORES×ラクマ iOS Meetup!! の登壇資料です。

Clean Swiftにおいてどのようなテストを書いているのか、そして昨今話題のGitHub Copilotがこのテストを書くのをちょっと…いやかなり楽にしてくれたのでその経験をご紹介します。

totokit4

May 22, 2023
Tweet

More Decks by totokit4

Other Decks in Programming

Transcript

  1. 2023/05/22 iOSMeetUp
    GitHub Copilotを使って
    ちょっと楽にUnitTestを書けるようになった

    View Slide

  2. 自己紹介
    2
    とと / @totokit4
    平口 咲 (ひらぐち さき)
    STORES 決済チームでiOSエンジニアやってます。
    関西型言語歴27年です。
    今週、関西へUターンします。
    関東には6年いました。
    関西弁のカンを取り戻す
    必要がありそうです。

    View Slide

  3. 自己紹介
    3
    じつは
    オフラインの登壇
    はじめてやから
    優しくしてな
    感想いっぱい
    つぶやいて!

    View Slide

  4. みんな

    View Slide

  5. Unitテスト
    書いてるぅ〜!?

    View Slide

  6. GitHub Copilot
    使ってるぅ〜!?

    View Slide

  7. という話をします。
    GitHub Copilotを使って
    ちょっと楽にUnitTestを書けるようになってん!!

    View Slide

  8. 目次
    8
    うちで採用しているアーキテクチャはこれやで
    どんなテスト書いてるんか教えたるわ
    GitHub Copilot使うとめちゃ楽やねんで
    01
    02
    03

    View Slide

  9. STORES 決済 iOSチームで採用されているアーキテクチャ
    9
    [Get Started with Clean Swift - Clean
    Swift](https://clean-swift.com/)
    公式ページ

    View Slide

  10. Clean Swift概要
    10
    Router
    View
    Contoroller
    View
    Worker
    Interactor
    Presenter
    Model.
    Request
    Model.
    Response
    Model.
    ViewModel

    View Slide

  11. Clean Swift 超概要1
    11
    View
    Contoroller
    Interactor Presenter
    イベント検知
    したで!
    処理するわ!
    ホレ結果
    ほんじゃ
    画面反映たのむわ〜

    View Slide

  12. で、どんなテストを書いてるん?

    View Slide

  13. Clean Swift 超概要2
    13
    View
    Contoroller
    Interactor Presenter
    doSomething() presentSomething()
    displaySomething()

    View Slide

  14. Interactorの実装
    14
    class HogeInteractor {
    // HogePresentationLogicはPresenterに適用しているプロトコル
    var presenter: HogePresentationLogic = HogePresenter()
    func doSomething(request: Hoge.Something.Request) {
    // 〜なんか処理〜
    presenter.presentSomething(response: .init())
    }
    }

    View Slide

  15. InteractorTestsの実装
    15
    class HogeInteractorTests: XCTestCase {
    var sut: HogeInteractor!
    // MARK: - Test doubles (Presenterの代替物)
    class HogePresentationLogicSpy: HogePresentationLogic {
    var presentSomethingCalled = false
    func presentSomething(response: Hoge.Something.Response) {
    presentSomethingCalled = true
    }
    }

    View Slide

  16. InteractorTestsの実装
    16
    func testDoSomething() {
    // Given
    let spy = HogePresentationLogicSpy()
    sut.presenter = spy
    // When
    sut.doSomething(request: .init())
    // Then
    XCTAssertTrue(spy.presentSomethingCalled)
    }

    View Slide

  17. テスト自体は
    めっちゃシンプル

    View Slide

  18. でもな
    18
    ひとつの機能・処理ごとに
    1周分のテストを書くとなると
    View
    Contoroller
    Interactor Presenter
    doSomething() presentSomething()
    displaySomething()

    View Slide

  19. よく似たテストが
    大量に増え続けるんよ!!
    (ほぼ)関数名しか違いがないんやわ

    View Slide

  20. 「(ほぼ)関数名しか違いがない」んやったら
    矩形選択と正規表現の置換で
    なんとか頑張ろか…

    View Slide

  21. このテストを書くのに必要な手順
    21
    1. ここに`Presenterの関数名+Called = false`を追加
    2. プロトコルで定義された関数を追加
    3. 関数内で`Presenterの関数名+Called = true`を追加
    4. テストケースを適当なところからコピー&ペースト
    5. `test関数名(頭文字を大文字に)`に変更
    6. Interactorの関数を呼び出す
    7. 期待値に`spy.Presenterの関数名+Called`を入れる
    8. コメントを`Interactorの関数 should ask the presenter to Presenterの関数名`に
    する
    ※読まんでええやつ

    View Slide

  22. いや
    地味〜〜〜〜〜〜〜〜に
    だっるいわ〜〜〜〜

    View Slide

  23. 出番やで

    View Slide

  24. GitHub CopilotでUnitテストを書く1
    24
    Xcodeがアシストしてくれる指示通りに従いましょか〜
    ポチッと!

    View Slide

  25. GitHub CopilotでUnitテストを書く2
    25
    Copilotちゃん、ありがとうな
    ポチッと

    View Slide

  26. GitHub CopilotでUnitテストを書く3
    26
    Copilotちゃん、ありがとうな
    ポチッと

    View Slide

  27. GitHub CopilotでUnitテストを書く4
    27
    Copilotちゃん、
    テストまで
    書いてくれんの!?
    ほんまありがとうな〜
    ポチッ!

    View Slide

  28. はい、おしまい

    View Slide

  29. 感想
    29
    ● 8stepから、4stepへ半減 🎉
    ● 精度は結構いける⭕
    ● ヒューマンエラー的なものが減る⭕
    ● サジェストまではワンテンポ待つ🔺
    ● 単純作業を肩代わりしてくれる⭕
    ● おかげで複雑なテストを書くのに集中力と工数を使える 🎉

    View Slide

  30. by とと
    みんなも、
    GitHub Copilotを使ってUnitTestを書いていこな!

    View Slide

  31. おわりに
    31
    今日の発表の内容は
    明日
    STORES Product Blogで公開します
    コードとかももっと見やすく
    詳しく見れますので
    おさらいしたい人は待っててな!

    View Slide

  32. Clean Swift メリット 
    32
    ● コードベースのメンテナンスの工数を減らせる
    ● データの方向性が一方向になりわかりやすい
    ● ViewControllerから完全にロジックを分離できる
    ● QAチームの工数を減らせる
    ● 単体テストが実施しやすい

    View Slide

  33. Clean Swift デメリット 
    33
    ● 多数のファイルを作成するのめんどくさい
    ● テンプレートで解消できる
    ● 慣れるまで多少ラーニングカーブがある
    ● ドキュメンテーションが豊富にある

    View Slide

  34. #2C85DE
    #F79A40
    #EB75AA #EE5253 #10AC84
    #6833D4 #0AB0DE
    #F5CC00
    Text A Text Text Text Text Text
    Text Text
    Text
    Text A Text Text Text Text Text
    Text Text
    Text

    View Slide