書評:"Test-Driven iOS Development with Swift 3"

どうにか読み終えたので書評記事。

Test-Driven IOS Development with Swift 3

Test-Driven IOS Development with Swift 3

1月の一冊5ドルのキャンペーンで入手。読み始めたのが4月だか5月だか忘れた。

内容は悪くは無いけど、ページ数的に定価で買うのはちょっと物足りない感じだろうと思う。

概要と特徴

iOSアプリ開発を題材に、テスト駆動開発について解説した本。

www.packtpub.com

発売は半年以上前。対象としている環境はSwift /Xcode 8 。

内容を確認したいのであればGoogle Booksでも一部閲覧可能。

books.google.co.jp

200ページ弱で読みやすい。英文もそれほど難しくない。

というか、テストを書いて、テストが成功するようにコードを書く、の繰り返しなので必然的に同じ言い回しが何度も出てくる。


いわゆるRed, Green, Refactoringの繰り返しなので退屈。なんだかんだで写経するとそれなりに時間を食う。

TDDのお作法をXcode+Swift 3 に落とし込んだだけの本と言ってもいい。

Swift固有らしい部分はあまりなく、テストを書く(途中でコンパイルエラーに対処する)、テストがエラーになることを確かめる、コードを書く、テストが成功することを確認する、という流れの通り。

Chapter 1 とChapter 5の後半以外の残りの章はToDoアプリをTDDで作るチュートリアル。

あくまでもstep-by-step方式でTDDの作法に従いつつアプリを開発していくので、特定のトピックごとに方法やノウハウを解説するというスタイルではない。

そのため逆引き系のノウハウ本のような使い方はできない。

本のコンセプトとしては Introduction とか Overview という単語がマッチすると思う。

書いてあること

  • TDDの思想にもとづくの開発の進め方(ワークフローが中心)
  • XCTest を使ったテスト駆動開発(XCUITest も最後にちょっとだけ登場する)
  • 非同期処理に対するユニットテスト(expectationwaitForExpectations
  • Function Test
  • サーバーを使用しないネットワークAPI呼び出しのテスト*1
  • Code Coverage *2
  • Xcode Server を使用したContinuous integration 環境のセットアップ

fastlaneというデプロイツールの初歩的な解説が2ページほどある。

書いてないこと

プログラミング言語の解説本ではないのでSwiftおよびXcodeの説明はなし。

  • UI部品の色や位置のテスト方法
  • カメラ関連のテスト方法
  • CoreData 関連のテスト方法
  • AutoLayout関連
  • 初歩的な内容以外のTDD関連トピック

なお、アプリが完成するところまで完全に解説しているかというと、そんなことはない

Chapter 2. でスクリーンショットが表示されているが、残りは同じ要領でやってみよう、という感じ。

気になる点など

安心の大英帝国クオリティ、ですね。本文がおかしくてもサンプルコードがまともなら問題ない……のか?

メソッド名にアンダーバーが抜けている箇所が後半に何箇所かあったりします。この出版社、他の本も含めて校正が雑すぎではないでしょうか。

Chapter 1

単語の先頭を大文字にするサンプルを提示しているが、なぜかcapitalizedメソッドを使わずにめんどくさい方法を使っている。

実害はないけど。

Chapter 3 (Equatable)

Chapter 3の、"Equatable"の解説箇所で、構造体のメンバ要素のtitleが異なるケースのテストの解説が欠落している(そして==メソッドの実装も言及してない)。

Chapter 4

文中でメソッド名のtest_TableViewIsNotNilAfterViewDidLoad()test_TableView_AfterViewDidLoad_IsNotNil()を混同している…。

ItemListViewControllerTest.swiftに関する解説で、以下の変数宣言に言及がない。サンプルコードを確認すれば済む話だけど。

 var sut: ItemListViewController!

本文に記載のコードの、timestampの秒数が微妙におかしい箇所があるので注意。UNIXエポックからの経過秒数の数字が一致しないのでテストが失敗する。

1456095600.0ではなく1456066800.0*3

Chapter 5

後半ToDoアプリではなく別のサンプルでネットワーク通信とエラー処理。面倒なので写経せず。

Chapter 6

ToDoアプリの続き。途中まで作成したアプリを動かしてみろ、という指示があるが、この時点では必要な記述が抜けているので注意。

addではなくてsaveメソッドの方。


最後のセクションでXCTUITestのサンプルになっているが、ボタンの配置によってはiOSシミュレーター上でボタンがキーボードに隠れてタップできずにテスト失敗ということがあるので注意されたし。

Chapter 7

コード・カバレッジの話と継続的インテグレーション。

自動生成されるメソッドを削除してカバレッジ100%にするノウハウが記載されている。

そんなんでいいのか。

継続的インテグレーションについてはXcode Server (Xcode サービス) の設定方法が解説されてる。

以下の過去記事を参照。

a244.hateblo.jp

Xcode Serverを利用するにはmacOS Server のインストールが必要(この記事参照

その他、疑問点

StoryBoardの要素とコードを関連づけるための@IBOutletで始まる変数宣言に循環参照対策のweak修飾子がついていないが問題いないのだろうか?

この本の特徴として先に変数を宣言しておいてからStoryBoardからドラッグしてアウトレットを関連づけるスタイルなので自動生成される場合と異なり、@IBOutlet ...のようにweak修飾子がついてない。

テスト実行のタイミングでは問題なくても実際のアプリとしてはどうかと思う。


なお、Amazonのレビューで低評価のコメントに著者は日常的にiOSアプリを開発していない云々という批判がある。

コメントとしてはViewControllerUTTableViewDelegateUITableViewDataSourceを疎結合にする際のアプローチについての批判。

Amazon.co.jp: Test-Driven iOS Development with Swift 3 電子書籍: Dr. Dominik Hauser: Kindleストア

iOSアプリ開発のお作法としてどうかという観点と、TDDとしてどうなのか、判断できない。

TDDについて

統合開発環境の世話になりつつ静的型付け言語でTDDやろうとすると、編集中のソースに対するコンパイラの警告とかビルドエラーがうっとおしい。

変数名のタイプミスとかテストで検出できるのはいいけど、もうちょっとどうにかならないものか。

テスト実行結果でRedの表示が出るのはいいけど、統合実行環境のエディタ部分が赤く染まるのはなんかすごく気分が悪い。

TDDをやるには使うフレームワークやライブラリに対するある程度の理解がないとできないという感想。SwiftはPlaygroundがあるからいいけど、試行錯誤用に別枠で検証コードを書かないと辛い。

型情報から入力補完が効くだけまだマシなのか。

TDD関連トピック

Chapter 8で言及されているURL。

まとめ

過去にもテスト駆動開発の本(RSpecとかCucumber)の本を購入したことはあるけど(いわゆる写経込みで)最後まで読みきったのは初。

テスト駆動開発のチュートリアルとしては結構いいと思う。

逆に他の言語でテスト駆動開発をの経験があると物足りないのでは。

テスト自動化のノウハウの面倒な、カメラとセンサとかスマートフォンアプリならではの機能についても解説して欲しかった。

価格から考えて、せめてUIテストの自動化とかもう少し踏み込んだ内容だといいのだけど。


せっかく読み終えたので既存の自作アプリに関してはバグ修正と機能追加からテストを書くようにしたい。

ちょうどWeb+DB PRESS Vol. 99もスマートフォンアプリのテスト(ただしUIテスト)に関する特集なのでそっちも読む予定。

WEB+DB PRESS Vol.99

WEB+DB PRESS Vol.99

  • 作者: ?橋健一,谷口禎英,井本大登,山崎勝平,大和田純,内村元樹,坂東昌哉,平田敏之,牧大輔,板敷康洋,大?浩崇,穴井宏幸,原口宗悟,久田真寛,ふしはらかん,のざきひろふみ,うらがみ,ひげぽん,池田拓司,はまちや2,竹原,片田雄樹,渋江一晃,WEB+DB PRESS編集部編
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/06/24
  • メディア: 大型本
  • この商品を含むブログを見る

それではまた。

*1:あまり詳しくないけど

*2:Xcodeで"Edit Scheme"からTestターゲットのチェックボックスをONにする話

*3:小数点の左の、右から3番目の数字