2024/8/18
laprasdrum.icon 台風一過🌞
/icons/hr.icon
@testableってどういう仕組だっけ
Access Levels for Unit Test Targets
When you write an app with a unit test target, the code in your app needs to be made available to that module in order to be tested. By default, only entities marked as open or public are accessible to other modules. However, a unit test target can access any internal entity, if you mark the import declaration for a product module with the @testable attribute and compile that product module with testing enabled.
ユニットテストターゲットのアクセスレベル
単体テスト ターゲットを使用してアプリを作成する場合、テストするには、アプリ内のコードをそのモジュールで使用できるようにする必要があります。デフォルトでは、オープンまたはパブリックとしてマークされたエンティティのみが他のモジュールからアクセスできます。ただし、製品モジュールのインポート宣言に@testable属性をマークし、テストを有効にしてその製品モジュールをコンパイルすると、単体テスト ターゲットは任意の内部エンティティにアクセスできます。
build-for-testingでコンパイルしたmoduleのみ@testableを付けてimport可能になる。
@testable importによってmodule内に定義したpublic修飾子以外のクラスもアクセス可能になる。(= アクセスレベルがpublicに引き上げられる)
リリースビルドのテスト
上記のテスト調査の流れで読み直したドキュメント。
読み返して改めて抑えておくべき情報をここで引用する。
TestFlightにアップロードすると App Store signed のリリースビルドのテストができる。
https://scrapbox.io/files/66c2033623ce56001ccdc010.png
Background sessionをテストする場合はXcode debuggerが有効だと不可能。
Disconnect the debugger
When Xcode launches an app, it enables a debugger that creates some differences from what users experience:
The Xcode debugger disables watchdog terminations, which can prevent testers from observing a hang issue while running the app in Xcode. The easiest way to check for watchdog terminations is to disconnect the device from the development machine and launch the app from the home screen.
Xcode’s debugger prevents apps from being suspended, so launch your app from the home screen to test background processes. For example, NSURLSession implements a background session, but when the app runs in the Xcode debugger, the background session never runs.
デバッガーを切断する
Xcode がアプリを起動すると、デバッガーが有効になり、ユーザーが体験するものとは若干の違いが生じます。
Xcode デバッガーはウォッチドッグ終了を無効にします。これにより、テスターが Xcode でアプリを実行しているときにハングの問題を観察することを防ぐことができます。ウォッチドッグ終了を確認する最も簡単な方法は、開発マシンからデバイスを切断し、ホーム画面からアプリを起動することです。
Xcode のデバッガーはアプリの一時停止を防ぐため、バックグラウンド プロセスをテストするにはホーム画面からアプリを起動します。たとえば、NSURLSession はバックグラウンド セッションを実装しますが、アプリが Xcode デバッガーで実行されると、バックグラウンド セッションは実行されません。
アプリを再インストールしてもクリーンインストールにならない例外2つ。
App GroupsもKeychainもテスト時に考慮漏れが発生しやすいので気に留めておきたい。
The system preserves App Group data on the device as long as the app in the group is installed. To remove potentially obsolete test data from an App Group container, remove all apps that share the group.
The system preserves an app’s keychain data on the device even after you delete the app. To clear the keychain, use SecItemDelete(_:). If you create a separate utility that removes keychain data, the utility and the app need to share the same application identifier.
グループ内のアプリがインストールされている限り、システムはデバイス上にアプリ グループ データを保持します。アプリ グループ コンテナーから古くなった可能性のあるテスト データを削除するには、グループを共有するすべてのアプリを削除します。
アプリを削除した後も、アプリのキーチェーン データはデバイス上に保持されます。キーチェーンをクリアするには、SecItemDelete(_:)を使用します。キーチェーン データを削除する別のユーティリティを作成する場合、ユーティリティとアプリは同じアプリケーション ID を共有する必要があります。
iOS単体でリリースビルドのパケットトレースは不可能だが、MacをRVI(Remote Virtual Interface)として仲介することでトレース可能になる。
Set Up iOS Packet Tracing
iOS doesn’t let you record a packet trace directly. However, you can use your Mac to record a packet trace on an attached iOS device using the Remote Virtual Interface (RVI) mechanism. To get started, first connect your iOS device to your Mac via USB. Next run the rvictl command in Terminal.
rvictl -s b0e8fe73db17d4993bd549418bfbdba70a4af2b1
In this example:
rvictl is the name of the command that manipulates RVIs.
-s tells rvictl to set up a new RVI.
b0e8fe73db17d4993bd549418bfbdba70a4af2b1 is the UDID of the iOS device to target. This UDID is just an example; you can find your device’s UDID in the Devices and Simulators window in Xcode.
This command prints the following output.
code:output.sh
$ rvictl -s b0e8fe73db17d4993bd549418bfbdba70a4af2b1
Starting device b0e8fe73db17d4993bd549418bfbdba70a4af2b1 SUCCEEDED with interface rvi0 This output includes the interface name of the newly-created RVI, rvi0 in this example. Supply this interface name to your favorite packet trace tool to record a trace of the traffic on your iOS device. For example, use the following command to record a packet trace on rvi0 and write it to trace.pcap.
sudo tcpdump -i rvi0 -w trace.pcap
iOSパケットトレースを設定する
iOS では、パケット トレースを直接記録することはできません。ただし、Mac でリモート仮想インターフェイス (RVI) メカニズムを使用して、接続された iOS デバイス上のパケット トレースを記録することができます。開始するには、まず iOS デバイスを USB 経由で Mac に接続します。次に、rvictlターミナルでコマンドを実行します。
rvictl -s b0e8fe73db17d4993bd549418bfbdba70a4af2b1
この例では、
rvictlはRVI を操作するコマンドの名前です。
-sはrvictlに新しい RVI を設定するように指示します。
b0e8fe73db17d4993bd549418bfbdba70a4af2b1はターゲットとする iOS デバイスの UDID です。この UDID は単なる例です。デバイスの UDID は、Xcode のデバイスとシミュレータウィンドウで確認できます。
このコマンドは次の出力を印刷します。
code:output.sh
$ rvictl -s b0e8fe73db17d4993bd549418bfbdba70a4af2b1
Starting device b0e8fe73db17d4993bd549418bfbdba70a4af2b1 SUCCEEDED with interface rvi0 この例では、この出力には新しく作成された RVI のインターフェース名rvi0が含まれます。このインターフェース名をお気に入りのパケット トレース ツールに指定して、iOS デバイス上のトラフィックのトレースを記録します。たとえば、次のコマンドを使用して、 rvi0にパケット トレースを記録し、 trace.pcapに書き込みます。
sudo tcpdump -i rvi0 -w trace.pcap
RVI の操作で問題が発生した場合は、「パケット トレースのトラブルシューティング」でトラブルシューティングのヒントを参照してください。
バッテリー残量の低下に伴ってCore Locationの精度が落ちるのは知らなかった。そのデバッグのためにバッテリー節約モードが使えるのか。
しかも高精度の位置情報をリクエストした場合、リクエストした精度以上に高い精度を出そうとしてバッテリー消費速度が速くなる可能性もある。
Enable battery-saving modes
Devices can behave differently based on battery level, the amount of time passed since fully charged, or whether the device battery is charging. For example, Core Location enables an app to request a desired accuracy (desiredAccuracy) but it may perform less accurately than your app requests depending on the device battery level. Alternatively, if a concurrent app or system process requests a high accuracy, Core Location might provide a higher accuracy than requested, which may consume the device battery faster.
バッテリー節約モードを有効にする
デバイスは、バッテリー レベル、完全に充電されてからの経過時間、またはデバイスのバッテリーが充電中かどうかに基づいて、異なる動作をする場合があります。たとえば、Core Location を使用すると、アプリは必要な精度 (desiredAccuracy) を要求できますが、デバイスのバッテリー レベルによっては、アプリが要求した精度よりもパフォーマンスが低下する可能性があります。また、同時実行中のアプリまたはシステム プロセスが高い精度を要求した場合、Core Location は要求された精度よりも高い精度を提供することがあり、デバイスのバッテリーの消費が速くなる可能性があります。
OSの地域設定(Region)を変更すると日付書式に影響が出る。
Test regions and languages
The Region user preference setting determines the format of the dates that the OS provides to your app. When a user changes their Region, the system changes the format of every NSDate it supplies your app.
テスト地域と言語
地域のユーザー設定により、OS がアプリに提供する日付の形式が決まります。ユーザーが地域を変更すると、システムはアプリに提供するすべてのNSDateの書式を変更します。