Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

みんな

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

GitHub Copilot 使ってるぅ〜!?

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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 } }

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

このテストを書くのに必要な手順 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の関数名`に する ※読まんでええやつ

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

出番やで

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

はい、おしまい

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

#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