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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  20. このテストを書くのに必要な手順
    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 full-size slide

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

    View full-size slide

  22. 出番やで

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. はい、おしまい

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  33. #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 full-size slide