DeNA×STORES×ラクマ iOS Meetup!! の登壇資料です。
Clean Swiftにおいてどのようなテストを書いているのか、そして昨今話題のGitHub Copilotがこのテストを書くのをちょっと…いやかなり楽にしてくれたのでその経験をご紹介します。
2023/05/22 iOSMeetUpGitHub Copilotを使ってちょっと楽にUnitTestを書けるようになった
View Slide
自己紹介2とと / @totokit4平口 咲 (ひらぐち さき)STORES 決済チームでiOSエンジニアやってます。関西型言語歴27年です。今週、関西へUターンします。関東には6年いました。関西弁のカンを取り戻す必要がありそうです。
自己紹介3じつはオフラインの登壇はじめてやから優しくしてな感想いっぱいつぶやいて!
みんな
Unitテスト書いてるぅ〜!?
GitHub Copilot使ってるぅ〜!?
という話をします。GitHub Copilotを使ってちょっと楽にUnitTestを書けるようになってん!!
目次8うちで採用しているアーキテクチャはこれやでどんなテスト書いてるんか教えたるわGitHub Copilot使うとめちゃ楽やねんで010203
STORES 決済 iOSチームで採用されているアーキテクチャ9[Get Started with Clean Swift - CleanSwift](https://clean-swift.com/)公式ページ
Clean Swift概要10RouterViewContorollerViewWorkerInteractorPresenterModel.RequestModel.ResponseModel.ViewModel
Clean Swift 超概要111ViewContorollerInteractor Presenterイベント検知したで!処理するわ!ホレ結果ほんじゃ画面反映たのむわ〜
で、どんなテストを書いてるん?
Clean Swift 超概要213ViewContorollerInteractor PresenterdoSomething() presentSomething()displaySomething()
Interactorの実装14class HogeInteractor {// HogePresentationLogicはPresenterに適用しているプロトコルvar presenter: HogePresentationLogic = HogePresenter()func doSomething(request: Hoge.Something.Request) {// 〜なんか処理〜presenter.presentSomething(response: .init())}}
InteractorTestsの実装15class HogeInteractorTests: XCTestCase {var sut: HogeInteractor!// MARK: - Test doubles (Presenterの代替物)class HogePresentationLogicSpy: HogePresentationLogic {var presentSomethingCalled = falsefunc presentSomething(response: Hoge.Something.Response) {presentSomethingCalled = true}}
InteractorTestsの実装16func testDoSomething() {// Givenlet spy = HogePresentationLogicSpy()sut.presenter = spy// Whensut.doSomething(request: .init())// ThenXCTAssertTrue(spy.presentSomethingCalled)}
テスト自体はめっちゃシンプル
でもな18ひとつの機能・処理ごとに1周分のテストを書くとなるとViewContorollerInteractor PresenterdoSomething() presentSomething()displaySomething()
よく似たテストが大量に増え続けるんよ!!(ほぼ)関数名しか違いがないんやわ
「(ほぼ)関数名しか違いがない」んやったら矩形選択と正規表現の置換でなんとか頑張ろか…
このテストを書くのに必要な手順211. ここに`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の関数名`にする※読まんでええやつ
いや地味〜〜〜〜〜〜〜〜にだっるいわ〜〜〜〜
出番やで
GitHub CopilotでUnitテストを書く124Xcodeがアシストしてくれる指示通りに従いましょか〜ポチッと!
GitHub CopilotでUnitテストを書く225Copilotちゃん、ありがとうなポチッと
GitHub CopilotでUnitテストを書く326Copilotちゃん、ありがとうなポチッと
GitHub CopilotでUnitテストを書く427Copilotちゃん、テストまで書いてくれんの!?ほんまありがとうな〜ポチッ!
はい、おしまい
感想29● 8stepから、4stepへ半減 🎉● 精度は結構いける⭕● ヒューマンエラー的なものが減る⭕● サジェストまではワンテンポ待つ🔺● 単純作業を肩代わりしてくれる⭕● おかげで複雑なテストを書くのに集中力と工数を使える 🎉
by ととみんなも、GitHub Copilotを使ってUnitTestを書いていこな!
おわりに31今日の発表の内容は明日STORES Product Blogで公開しますコードとかももっと見やすく詳しく見れますのでおさらいしたい人は待っててな!
Clean Swift メリット 32● コードベースのメンテナンスの工数を減らせる● データの方向性が一方向になりわかりやすい● ViewControllerから完全にロジックを分離できる● QAチームの工数を減らせる● 単体テストが実施しやすい
Clean Swift デメリット 33● 多数のファイルを作成するのめんどくさい● テンプレートで解消できる● 慣れるまで多少ラーニングカーブがある● ドキュメンテーションが豊富にある
#2C85DE#F79A40#EB75AA #EE5253 #10AC84#6833D4 #0AB0DE#F5CC00Text A Text Text Text Text TextText TextTextText A Text Text Text Text TextText TextText