Apple WWDC 2020:iOSテストの新機能

こんにちは、私の名前はサーゲイです。ExnessでiOSアプリをテストしています。2020年6月の終わりに、別のWWDCが終了しました。それがiOSアプリケーションのテストの世界に新しくもたらしたものを見てみましょう。



画像



しかし、最初に、簡単な歴史的な遠足:Apple WWDC(WorldWide Developers Conference)、または単にダブダブは、Appleが80年代後半からカリフォルニアで開催してきた会議です。今年は初めてオンラインで開催されました。以前のチケットが宝くじで抽選され、希望のメールを受け取っていない人がサイトhttps://developer.apple.com/videos/からのビデオのコンテンツでなければならなかった場合、今年は、明らかな理由により、他の選択肢はなく、誰もがビデオを視聴しました。 ...  



そこで、そこでのテストから何を見ることができますか?



私はすぐに予約します。WWDC2020では、以前のように、Appleエコシステムでのテスト専用の大きな一般セッションはありませんでした(Xcode 2019でのテストと2018年のテストの新機能2017)。2020年のテストの新しさは6つのミニセッションに塗りつぶされました。行こう!



テスト用のXCTSkip



Xcode 11.4は、条件に基づいてテストの起動を制御する新しいAPI-XCTSkipを追加しました。 



多くの場合、テスト、特に統合テストでは、難読化が難しい条件または要件があります。たとえば、アプリケーションには、iPhoneでは動作しないiPad向けの特定の機能があります。または、オペレーティングシステムの特定のバージョンの一部の機能。



その前に、テストがそのような場合に来たとき(iPhoneでiPadのみの機能をチェックする)、選択肢がありました:



  • テストケースを終了します。
  • テストに合格のマークを付けて次に進みます。
  • テストに失敗します。


現在、エラーが発生し、現在のテストの実行が停止し、スキップ済みとマークされます。 



:このように、今XCTestではなく、2のテスト合格のための3つの状態がある



画像



。詳細こちらこちらを



UIテストでの割り込みとアラートの処理



割り込みとアラートの処理は以前はXCTestにありましたが、セッションではその動作のメカニズムがより詳細に明らかにされました。 Xcode 11.4、iOS / tvOS 13.4、およびmacOS 10.15.4に追加された興味深い新機能、つまり、権限のリセット(別名、保護されたリソース)を見つけました。



つまり、たとえば、テスト#1でアプリケーションにカメラまたは連絡先へのアクセス権を付与した場合、後でテスト#2で#nこのアクセス権を奪うことは簡単ではありません。これを行うには、アプリケーションを再インストールする必要があります。



これで、保護されたリソースの承認をリセットするためのAPIを使用して、以前に許可されたアクセスを選択できます。 



Class XCUIApplication {

	open func resetAuthorizationStatus(for: XCUIProtectedResource)

}


権限をリセットすると、アプリケーションは、保護されたリソースへのアクセスをユーザーに要求したことがないかのように動作します。



これにより、連絡先、カレンダー、写真、マイク、カメラ、地理位置情報の発行とアクセス許可のコレクションをすべて利用できます。iOSでは、Bluetoothおよびキーボードネットワークアクセスへのアクセスを追加でリセットでき、Xcode 12 / iOS 14以降、ヘルスデータにリセットできます。Mac OSでは、デスクトップおよびダウンロードディレクトリへのアクセスをリセットできます。



以下は、写真へのアプリのアクセスをリセットする方法の例です。




// Example
func testAddingPhotosFirstTime() throws {
	let app = XCUIApplication()
	app.resetAuthorizationStatus(for: .photos)

	app.launch()

	// Test code...
}


多くの場合(常にではありませんが)権限をリセットすると、アプリケーションが強制終了することを覚えておくことが重要です。



詳細はこちらこちらこちら



XCTestによるアニメーションラグの排除



アニメーションラグ、またはヒッチは、フレームが予想よりも遅く表示される動作です。

講義では、Performance XCTestsを使用して測定およびテストすることにより、アプリケーションのアニメーションでラグの発生を防ぐ方法について説明します。



また、ベストプラクティスを提供し、許容できる



画像



ラグと注意する必要のあるラグを特定します。クリティカルラグが慎重な調査と修正に値する理由を説明します。アニメーションのテスト自体のトピックは非常に広範で、別の記事に値するので、紹介部分とソースへのリンクに限定します



転倒試験のトリアージと診断



多くの場合、失敗したテストを修正することは、多くの時間とリソースを費やす苦痛です。

Xcode 12には、失敗したテストの修正を容易にする新しいAPIが含まれます。 APIは、何を、どのように、なぜ、そして最も重要なことに、どこに落ちたのかという質問にすばやく答えるのに役立つはずです。



以前の場合、テストが落ちた後、

課題ナビゲーターまたはレポートナビゲーターでクラッシュサイトを探す必要があり、Xcode 12では検索プロセスが簡単になりました。これで、クラッシュサイトがテスト自体で強調表示されます。 



行が将来他の行を参照している場合、灰色の強調表示



画像

 

のエラーが表示されます。エラーがこの行で直接発生した場合は赤で表示されます:



画像



便利な新機能-別のウィンドウではなく、レポートナビゲーターでコードエディターを開きます。



画像



さらに、新しいXCTIssueオブジェクトがXcode 12に追加されました。これは、XCTestが以前にそれ自体で収集したエラーデータ(メッセージ、パス、行番号、および「期待」フラグ)をカプセル化することに加えて、以下を追加します。

 

  • 明確なタイプ。

  • 詳細な説明;

  • 関連するエラー。

  • 添付ファイル。



詳細はこちらこちら



テストを作成して失敗させる 



テスターの目標は、テストを作成してテストが成功することを確認することです。つまり、製品をエンドユーザーに出荷できます。それにもかかわらず、失敗したテストは発見されたバグである可能性が高いため、それらが失敗するかどうかを確認するテストを作成することも必要です。したがって、テストが失敗した場合、調査するのに十分な情報が得られるという事実を念頭に置いてテストを作成する必要があります。

つまり、推奨



事項:アサートで人間が読めるメッセージ



画像



を使用する:状況に適したアサートのタイプを使用してください。



画像



オプションをアンラップして、テストをクラッシュさせるのではなく、エラーをスローさせるようにします。Swiftはこれを行ういくつかの方法を提供しますが、テストはXCTUnwrapを使用する傾向があります。これは、guard let構成の単純化です。



画像



非同期待機には、sleep()の代わりにwaitForExistence()を使用します。



XCTContext.runActivity()を使用して、テスト実行ログの可読性を高めます。



画像



さらにログを追加したい場合は、添付ファイルを追加したり、スクリーンショットやデバッガー出力をここに添付したりできます。この機能は、テストがCI / CDで実行される場合に特に役立ちます。



画像



詳細はこちら



テスト実行結果をより速く取得



月曜日の朝に金曜日の夜に開始された長いジョブが最後まで機能せず、真ん中または非常に最初にさえぶら下がっていることに気付くのは残念です。そして、1週間の作業を報告会から始める必要があります。なぜこれが起こったのですか。どうすれば将来このような状況を回避できますか?どうすれば一晩でカクテルを9千個落とせますか?



Xcode 12では、不凍ツールが導入されています。これは、実行時間許容量計画テストの新しいオプションです。



Xcodeを有効にすると、各テストの実行方法に時間制限が設定されます。

制限を超えた場合、Xcodeは次のことを行います。



  1. レポート(スピンダンプ)を収集します。
  2. ハングしたテストを強制終了します。
  3. スイートの残りの部分を実行できるように、テストランナーを再起動します。


レポート(スピンダンプ)は、どのスレッド、どの関数が最も時間を費やしたかを表示します。これにより、朝のコーヒー/お茶が冷める前でも、テストのボトルネックを目で確認できます。



デフォルトでは、各テストに10分が割り当てられています。テストがより速く完了すると、タイマーは次のテストのためにゼロにリセットされます。テストスイート内の各テストの所要時間が長くなる/短くなる場合は、テスト計画の設定でデフォルト値を変更できます。 



画像



xcodebuildコマンドオプションを使用してこれを行うこともできます。



xcodebuild option
-default-test-execution-time-allowance <seconds>


同様に、最大テスト実行時間を設定できます。



画像



xcodebuild option
-maximun-test-execution-time-allowance <seconds>


特定のテストまたはテストクラスの実行時間を設定する必要がある場合でも、executionTimeAllowance APIを使用してこれを行うことができます。



Class XCTestCase: XCTest {
	var executionTimeAllowance: TimeInterval //    
}


特定のテストの実行を微調整することで時間を節約できますが、長いテストスイートの通過を高速化するためにできることはこれだけではありません。



Xcode 12では、複数のデバイスで同時にテストを実行できます。この機能は、並列分散テストと呼ばれます。複数のデバイスでテストを実行することの利点は明らかです-かなりの時間の節約です。



画像



画像



ただし、残念ながら、落とし穴もあります。テストを並行して起動する順序は確定的ではなく、テスト番号6がテスト番号5の後にデバイス#1で実行される保証はありません。この事実は、Parallelを使用して起動するテストを計画するときに考慮する必要があります。分散テスト。



一般に、テストを並行して実行するという考えは新しいものではありません。Xcode 12の前にそのような機会がありましたが、実際のデバイスでテストを実行することが可能になったのはXcode 12でした(これまでのところ、xcodebuildのみを使用して)。



並列分散テストを実行するコマンドは次のとおりです。 



xcodebuild test
    -project MyProject.xcodeproj
    -scheme MyProject
    -parallel-testing-enabled YES
    -parallelize-test-among-desinations
    -destination 'platform=iOS,name=iPhone 11'
    -destination 'platform=iOS,name=iPad pro' 


詳細はこちら



これで、WWDC 2020の新しいテスト機能のレビューは終わりです。最後までお読みいただきありがとうございます。

この記事がお役に立てば幸いです。ハッピーテスト!



All Articles