iOS Test Night 第9回目 参加レポート #ios_test_night

## イベント情報

iOS Test Night #9 - 2周年 -

会場: DeNAさんのサクラカフェ
URL: https://testnight.connpass.com/event/102778/

## トーク

### XCTest（再）入門

[@tobi462](https://twitter.com/tobi462)さん

- TDD
    - テスト駆動開発
    - 良い設計とはテストしやすいこと
- BDD
    - TDDから派生
    - 振る舞い駆動開発
- XCTest
    - XCTAssertEqual
        - 他にもアサーションは沢山ある
    - XCTestCaseを継承
        - test_から始まる関数名である必要がある
    - エラーメッセージ
        - 任意で付与可能
        - 全部書かず、バランスが必要
            - BDDの場合は自動生成されるのでそちらに任せるとよい
    - @testable import でinternalな関数にもアクセスできる
    - 独自アサーション
        - XCTest
            - file, lineを引数を渡し、エラーメッセージを設定する
        - Quick/Nimble
    - 前後処理の共通化
        - XCTest
            - setUp/tearDown
        - Quick/Nimble
            - beforeEach/afterEach
    - テストの階層化・カテゴライズ
        - XCTest
            - Xcode9から追加された
            - runActivity(name:)


### BetterSpecsに学ぶ Swiftにおける本当にRSpecライクなテストの書き方

[@rockname](https://twitter.com/_rockname)さん
[資料](https://speakerdeck.com/rockname/rspec-like-test-in-swift)

- [みてね](https://mitene.us/)ではテストを書く文化がある
    - Dangerを利用し、テスト書いてないとbotに怒られる
    - Quick/Nimbleを採用
        - サーバサイドがRSpecなので、RSpecにインスパイアされているものを採用
        - Mock用ライブラリは特に使っていない
- 読みやすいテストを書きたい
    - [Better Specs](http://www.betterspecs.org/jp)というガイドラインを参考にしている
- Better Specs
    - [単一条件テスト](http://www.betterspecs.org/jp/#single)
        - itで テストに対する説明をしっかり書いてあげる
            - どういう仕様に対して、どういう値を返すのか明確になる
    - [Contextsを使う](http://www.betterspecs.org/jp/#contexts)
        - 例えば、ログインしている、ログインしていないという文脈をContextsに外側に切り出す
    - [Subjectを使う](http://www.betterspecs.org/jp/#subject)
        - テスト対象の主体をSubjectとする
        - Quickだと用意されていない
        - 引数を変数として定義
        - subjectを計算型プロパティとして定義する
            - Subjectは毎回代入する必要がなくなる
- What/When/Howを意識する
- 【Spec = 仕様書】になるように


### Azure PipelinesでiOSアプリのCI/CDを実現

[@nakasho](https://twitter.com/nakasho_dev)さん
[資料](https://www.slideshare.net/shinyanakajima37/azurepipelinesioscicd)

- Azure DevOps
    - 2018/9/11に発表
- Azure Pipelinesの話
    - ソース選択
    - ビルドテンプレートの選択
    - 様々な拡張機能のあるMarketplaceもある


### よく使うテストヘルパーの紹介

[@ktanaka117](https://twitter.com/ktanaka117)さん
[資料](https://www.slideshare.net/kenjitanaka58/iostestnight)

- やりたいことは事前準備ではなくテスト
- よく使うテストヘルパー
    - JSONファイルからテストデータを取得する
        - テストデータに不備がない前提でforce tryしている
    - 連続した通信で順番を担保しつつResponseを返すHTTP Stub
- 指針
    - 重複の削除
    - テストの本質でないものは目立たせない
    - 理想の形（テストコード）を先にイメージして、インターフェース化する
    - ヘルパーに対してもテストを書く


### 開発者として学ぶソフトウェアテスト

[@kariad](https://twitter.com/kariad_uu)さん
[資料](https://speakerdeck.com/kariad/kai-fa-zhe-tositexue-busohutoueatesuto)

- どこまでテスト書けばいけばいいのかわからなくなった
    - ソフトウェアテストの７原則
      - [参考記事](https://webrage.jp/techblog/7_principles_of_software_testing/)
- テスト設計
    - 何を優先するか？
    - どうやって実施するのか？
    - どの条件でテストするのか？
- テスト技法
    - 条件をより少ないケースでより効率的になるべく網羅的にテストする
- テスタビリティ
    - テスト前提の設計をしよう
- テストを何で学ぶか
    - [JSTQB](http://jstqb.jp/)
    - [はじめて学ぶソフトウェアのテスト技法](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E6%8A%80%E6%B3%95-%E3%83%AA%E3%83%BC%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%B3%E3%83%89/dp/4822282511)
    - [TDD Boot Camp](http://devtesting.jp/tddbc/)
    - [ソフトウェアテストの重要性とテストでの考え方](https://seminar-materials.iijlab.net/iijlab-seminar/iijlab-seminar-20180829.pdf)


### まずはできるところから始めるUnitTestとテストができる実装について

[@fumiyasac](https://twitter.com/fumiyasac)さん
[資料](https://www.slideshare.net/fumiyasakai37/unittest-125506754)

- 目視チェックはしんどい
- 仕様の概略とテスト戦略を考える
- 紛らわしい検索条件の組み合わせのテストパターンを入れる
- 些細なtエストコードが実装や理解の助けになる
  - 最初からうまくはいかない。できる所から試していこう


## まとめ

自分自身テストコードをどんどん書いていきたいと思いながらもなかなか実現できていない状況なので、まずはどういう所から書いていけばいいか・書く時はどのような所を意識して考えていけばいいかなどすぐに実践に移せそうな内容で参考になりました。
勉強会全体を通して初心者にもとっつきやすい内容が多い印象でした。

Better Specsというガイドラインは今回初めて知ったので、是非読んでテストコードを書くための理解を深めたいと思います。

素晴らしい発表ありがとうございました。