branch10480’s blog

Topics that I've learned.

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

iOS

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

【Android】 テキストの部分装飾

iOSでは NSMutableAttributedString を使いますが、Androidの場合は SpannableStringBuilder を用いるようです。 この例では以下の装飾を加えています。 target 文字列と一致する部分に フォント色を赤色 フォントを太字 val textView = findViewById<TextView>(R.id.d</textview>…

TDD(テスト駆動開発)についての覚え書き

先日、こちらの本を概要をまとめながら読了しました。 booth.pm 前半はテスト駆動開発(TDD)についての概要説明になっていて、中盤は実際にiOSアプリ開発でTDDを実践していくという内容です。 後半は新しいアプリにへの導入や、既存プロジェクトへの導入に…

GitHubのREADME.mdに載せる用のgif画像を作る

目的のコマンドはこちら ffmpeg -i origin.mp4 -vf scale=640:-1 -r 24 output.gif 普段のアプリ開発やちょっとしたプロジェクトを作ったときに、動作紹介用のgif画像が欲しいときが今まで多々ありました。 そのgif作成にはffmpegを使っていますが、毎回その…

複数のQuickSpecのbeforeSuiteとitの実行順序

担当しているプロジェクトのUIテストコードに Quick/Nimble(テスト用フレームワーク) を導入しようとして若干ハマったのでメモします。 何に詰まったのか 最初、Spec1とSpec2のように複数のQuickSpecを用意して、それぞれ初期化処理をしてから実際のテスト…

Clean Architecture についてまとめてみた

皆さんこんにちは! 最近作ろうとしているアプリを Clean Architecture で実装しようと思い立ちました。 しかしどういうものかを忘れてしまっていたため、今回は備忘録がてらブログにまとめようと思います。 Clean Architecture はシステムアーキテクチャ ア…

アプリ アーキテクチャ ガイド を読んでみた

今回は業務で Android の設計について調査したので備忘録がてらつらつら書いていこうと思います。参照したドキュメントはこちらです。 アプリ アーキテクチャ ガイド モバイルアプリのユーザー体験 Android アプリでは アプリマニフェスト にアプリコンポー…

Andriod の ViewModel について 〜 1 〜

ViewModel の概要 ViewModelはライフサイクルを意識し、UI関連のデータの保存・管理用のクラスです。 UIコントローラ(アクティビティやフラグメント)の主な目的は、UIデータの表示、ユーザー操作への対処、OSとのやり取り(権限リクエストなど)を行うこと…

アクティビティ間の移動

画面遷移するときにはアクティビティ間の移動が発生する。今回はアクティビティの移動についてまとめる。 アクティビティを別のアクティビティから開始する 別のアクティビティを開始する方法は2通りあるが、両方とも Intent オブジェクトを渡す。 startActi…

Activityのライフサイクルについて 〜 2 〜

アクティビティの状態とメモリからの退避 アクティビティ、システムのプロセスと強制終了の可能性については以下になっている。 プロセスの状態 アクティビティの状態 強制終了の可能性 フォアグラウンド(フォーカスがあるか、すぐにフォーカスを取得する状…

Activityのライフサイクルについて 〜 1 〜

Activityのライフサイクル 全体的な概要図はこちら。 6つのコアセット

AndroidのActivity概要

アクティビティのコンセプト 1 つのアプリが別のアプリを呼び出すとき、呼び出し元のアプリは、別のアプリ全体をひとまとめとして呼び出すのではなく、その中のアクティビティを呼び出します。そうすることで、アクティビティが、アプリがユーザーとやり取り…

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…