branch10480’s blog

Topics that I've learned.

iOS

【iOS】window.rootViewController入れ替え時のアニメーション

iOS

重要な点は、UIView.transitionのanimationsでViewControllerの入れ替えをするのではなく、先に入れ替え処理を書いてからUIView.transitionを呼び出すこと。(animations引数は空のクロージャ。) class AppDelegate: UIResponder, UIApplicationDelegate { …

iOSアプリ開発自動テストの教科書 を読んでいく 〜 27 〜

iOS

UIテスト実行時間の短縮 UIテストの実行時間短縮には次の2つの方法がある。 方法 ビルドとテストの実行を分離する テストの実行を並列化する ビルドとテストの実行を分離する 通常、Xcodeからテストを実行するときには次の2つのステップで実行される テスト…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 26 〜

iOS

Page Object Pattern - アプリのUI変更に対応する Page Object Patternというデザインパターンを使うとUI改修が起こることを含めた運用について改善することができる。 import XCTest import UIKit class LoginPage { // UI要素 private let emailTxtF: XCUI…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 25 〜

iOS

XCTAttachment で保存できるコンテンツ 以下の形式をサポートしており、イニシャライザとして指定できるようになっている。 クラス String UIImage XCUIScreenshot URL Data Any UIImage や XCUIScreenshot は XCTAttachment.ImageQuality で保存する品質を…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 24 〜

iOS

テスト実行時の成果物を保存する XCTAttachment によって、文字列、画像、XCUITestでのスクリーンショットなどを成果物として保存できる。 テスト実行時の追加情報(APIレスポンスなど)を保存するとテスト失敗時の調査が捗る。 ■ 使用例 import XCTest impo…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 23 〜

iOS

アプリの状態を確認する stateメソッドを利用して、アプリの状態(フォアグラウンド、バックグラウンドなど)を取得することができる。 値 状態 unknown notRunning 実行されていない runningBackgroundSuspended バックグラウンドでサスペンド状態 runningB…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 22 〜

iOS

XCUIApplicationについて XCUIApplicationはテスト対象となるアプリのプロキシ。 これにより以下について確認可能になる。 複数アプリの操作 アプリの起動 / 終了 アプリの状態を確認 複数アプリの操作 引数なしで XCUIApplication をインスタンス化した場合…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 21 〜

iOS

UI要素の状態を確認する UI要素が存在しているかどうかなど、UI要素の状態を確認できる。 宣言 用途 var exists: Bool {get} var isHittable: Bool {get} 対象UI要素をタップできるかどうか func waitForExistence(timeout: TimeInterval) -> Bool タイムア…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 20 〜

iOS

UI要素を操作する タップ、長押し XCUITestには操作するためのメソッドが複数用意されている。 宣言 補足 func doubleTap() func twoFingerTap() func tap(withNumberOfTaps numberOfTaps: Int, numberOfTouches: Int タップ回数とタッチ回数を指定する func…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 19 〜

iOS

要素の特定を詳しく 子要素の特定をする 宣言 用途 XCUIElementQuery.children(matching:) 子要素(直下の要素)を探す XCUIElementQuery.descendants(matching:) 子孫(孫以降も)を探す XCUITestでは一度に複数のUI要素に対して操作を行えない。そのため、…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 18 〜

iOS

UIテスト実装に向けて以下の手順について知る。 項目 UI要素の特定方法 UI要素の操作方法 UI要素の属性や状態の確認方法 UI要素の特定方法 XCUIElementQuery というクラスのクエリで対象となるUI要素(XCUIElement)を検索する。

iOSアプリ開発自動テストの教科書 を読んでいく 〜 17 〜

iOS

UIテスト概要 XCUITest は XCTest の一部として存在している。UITest実装をサポートしてくれる機能としていかがある。 テストケースのレコーディング機能 テスト失敗時のスクリーンショット撮影 他にもUIテストとして使えるツールには以下が存在する。 名称 …

iOSアプリ開発自動テストの教科書 を読んでいく 〜 16 〜

iOS

HTTP通信のモック HTTPモックは外部のサーバの代わりにレスポンスを返すもの。APIクライアントの単体テストやUIテストで実際にサーバを利用するのが困難な場合に利用する。 Mockingjay ライブラリとしてソースコードの中に組み込むのに使用できるライブラリ…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 15 〜

iOS

フレームワーク Quick/Nimble Quick/Nimbleは XCTest 上で動く OSSのBDD(Behavior Driven Deployment)、Assertionフレームワーク。 BDDフレームワークとしての Quick、MatcherによるAssertionを実行する Nimble から成り立つ。 Quick とは BDDスタイルでテス…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 14 〜

iOS

モックの種類 名称 説明 モック 呼び出し結果などを記録する スタブ 任意の値を返すようにする スパイ 本物の処理を利用しつつ呼び出しなどの記録のみを行う 常に全てをモック化すべき?

iOSアプリ開発自動テストの教科書 を読んでいく 〜 13 〜

iOS

非同期なAPIのテスト - XCTestExpectation 非同期なAPIをテストする場合は、XCTestExpectationを用い、処理が完了するまで待機するのが一般的。 テスト対象のサンプルコード。 func echo(message: String, _ handler: @escaping (String) -> Void) { Dispatc…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 12 〜

iOS

テストを階層化する - XCTContext テストを階層化して表現したいと思った時に使えるのが、XCTContext.runActivity。 func safeDivision(_ x: Int, _ y: Int) -> Int? { if y == 0 { return nil } else { return x/y } } 上に対するテストが以下。 func testS…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 11 〜

iOS

独自のアサーションの作成 まずは不十分な実装を示す。 func asertEmpty(_ string: String) { // [A] XCTAssertTrue(string.isEmpty, "\"\(string)\" is not empty.") } 呼び出し部はこう。 func testAssertEmpty() { // [B] assertEmpty("test") } これを実…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 10 〜

iOS

アサーションについて 期待値 と 実際の値 を比較する専用のメソッドのことを アサーションメソッド もしくは単に アサーション と呼ぶ。 e.g. XCTAssertTrue(expr) expr は『式』を意味する expression の省略形。 等値性判定(Swift) XCTAssertEqual(Equa…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 9 〜

iOS

XCTest framework について学ぶ XCTest framework は Apple 公式のテスティングフレームワーク。以下のテストについて実行可能。 単体テスト パフォーマンステスト UIテスト XCTest は単体テストを指す場合が多い。 サードパーティのOSSフレームワークとの比…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 8 〜

iOS

テスト実行時間について テスト時間については常に意識しておかないと増加してしまう傾向にある。 増える要因としては以下が考えられる。 要因 漠然として不安を解消するために多めに実装してしまう 自動テストの基盤が整うとテストが簡単に作れるため、何も…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 7 〜

iOS

不安定なテスト結果への対処法 テストのうち、結果が不安定になるものがある。 以下の状態だとテスト結果が不安定になる場合がある。 UIテストのテスト実行環境に影響を受ける状態 テストが利用している外部サービスに影響を受ける状態 安定しないテストをそ…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 6 〜

iOS

自動テストをどこから追加するか 単体テストの場合 No 新機能の開発時 まっさらな状態からスタートできるのでテストを組みやすい リファクタリング コードの構成を見直す機会だから 単体テストを実装しやすいのは 副作用 を持たないメソッド。この部分から実…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 5 〜

iOS

テストコードの中身をわかりやすくする テストコードの中身もわかりやすくなっていることが重要。 テストコードは主に以下のフェーズを行っていく。 No フェーズ 1 前処理(準備)- Setup 2 実行 3 検証 4 後処理(後始末)- TearDown この4フェーズに分け…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 4 〜

iOS

テストケース名をわかりやすくする 自動テストのテストケース名はテストが失敗したときに最初に見られるものなので重要。 add() メソッドについてのテストを考えてみる 以下の add() メソッドについてのテストを考えるとする。 func add(x: Int, y: Int) { r…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 3 〜

iOS

テストの失敗原因をわかりやすくする 自動テストが失敗した場合に原因を特定しやすくすることは大切である。 仮に特定しづらい状況が続いた場合... No 1 テストコード修正に時間がかかる 2 修正する工数が確保できずそのままに 3 自動テストが失敗しているこ…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 2 〜

iOS

単体テストのメリット メリット 細かい粒度でテストしておくことで結合した時の品質が担保できる 内部のロジックに着目し、網羅的なテスト(ホワイトボックステスト)が可能になる 高速で実行可能 UIテストと異なり、デザインが変更されてもテストを修正しな…

iOSアプリ開発自動テストの教科書 を読んでいく 〜 1 〜

iOS

テストピラミッドについて テストには3種類ある。 種類 内容 単体テスト 単体に行うテスト 統合テスト モジュールどうしを組み合わせるテスト UIテスト 実際のアプリUIを操作して行うテスト 上に行けばいくほどテスト時間がかかることを示す。 また、横軸は…

iOSDC2020 に参加しました!

iOS

皆さん、こんにちは! 最近は涼しくなって過ごしやすい日々が続いていますね〜。 どうでもいいですが、今日仕事が終わってプライベートマシンに手をおいた瞬間「あ、冷たい!!」と驚き、季節の変わり目を実感しました @branch10480です 笑 すみません、本題…

iOSにおけるFrameworkとLibraryについて知ったこと (前半)

iOS

iOSDCのFraneworkやLibraryについての動画があったので視聴しつつまとめてみました!(今回は前半です) Framework と Library の違い バンドルを持つか、持たないかで来まる。