iOS-Testing-Automation-Framework
XCUITest 向けの robot、自己修復する locator、スクリーンショットの差分比較、アクセシビリティ audit、CI レポート。
ライセンス: MIT
iOS・macOS アプリの UI テストとユニットテストのための依存関係のない Swift パッケージです。XCUITest では robot、accessibility identifier の変更に耐えるルックアップ、accessibility audit、差分イメージ付きのスクリーンショット比較、CI 用の JUnit および Markdown レポートを追加します。Swift Testing でも XCTest でも、任意の test target に SwiftUI のスナップショット、ポーリングによる wait、retry、spy、シード済みのテストデータを追加します。これらのヘルパーの裏側のルールは普通の Swift で書かれ、ユニットテストでカバーされています。XCUITest 層は、iPhone シミュレータ上のサンプルアプリの UI テストで検証されています。
機能
- Robot: 画面ごとに1つの class で、その action は要素が hittable になるまで待ち、Xcode のテストレポートに名前付きのステップとして表示され、失敗はテストの行として報告されます
- 自己修復するルックアップ: Locator と LocatorHealer は label、placeholder、または最も近い identifier にフォールバックし、修正を HealingLog に記録し、同程度に良いマッチが複数ある場合は推測を拒否します
- 5つのルール(label の欠落、label のない画像、44×44pt未満のタップ領域、要素の種類を繰り返す label、重複した identifier)による accessibility audit で、Apple の performAccessibilityAudit() と併用することもできます
- baseline の PNG とのスクリーンショットおよび SwiftUI スナップショット比較で、tolerance、無視する領域、差分イメージに対応します。baseline が存在しない場合は記録され、テストは失敗します
- テストごとに書き直される junit.xml と Markdown の job summary で、登録済みの secrets や credential のパターンはマスクされます。さらに複数回の CI 実行結果向けの FlakinessAnalyzer があります
- typeSecret はパスワードを入力ではなく貼り付けで扱うため、XCTest 自身の activity title にパスワードが含まれません。CI は result bundle 内にテスト用パスワードが含まれていないか検索します
- ユニットテスト向けのヘルパー: Wait.until、RetryPolicy、Spy と ThrowingSpy、シード済みの Fixtures、Benchmark
- 依存関係も Swift Testing の import もないため、UI テストバンドルにもリンクできます。118件の Swift Testing テスト、サンプルアプリ AutomationShowcase 内の9件の UI テスト、4本の記事からなる DocC カタログがあります
クイックスタート
1import XCTest2import iOSTestingAutomationFramework3 4final class CounterRobot: Robot {5 var label: XCUIElement { app.staticTexts["counter.label"] }6 var button: XCUIElement { app.buttons["counter.button"] }7}8 9final class CounterUITests: XCTestCase {10 @MainActor11 func testTappingCounts() {12 let app = XCUIApplication()13 app.launch()14 15 let counter = app.on(CounterRobot.self)16 counter17 .tap(counter.button)18 .tap(counter.button)19 .assertLabel(of: counter.label, equals: "Tapped 2 times")20 }21}インストール
Xcode (File › Add Package Dependencies…)
1https://github.com/muhittincamdali/iOS-Testing-Automation-Framework.gitSwift Package Manager
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/iOS-Testing-Automation-Framework.git", from: "2.0.0")3],4targets: [5 .testTarget(name: "YourAppTests", dependencies: [6 .product(name: "iOSTestingAutomationFramework", package: "iOS-Testing-Automation-Framework")7 ])8]スクリーンショット


タイムライン
テスト自動化フレームワークとしてリポジトリが公開されました。翌週の大半はドキュメント作成に費やされました
1月28日に始まった README、issue テンプレート、CI/CD の作業の後、README 主導の機能一覧を伴う v1.0.0 がリリースされました。README とドキュメントの変更は2月5日まで続きました
ソースが placeholder のコードに置き換えられました: 何も比較しない visual regression engine、print するだけの accessibility auditor、もうコンパイルできない test target
v2.0.0: Swift 6 上で作り直され、すべての UI ヘルパーの裏側にテスト済みのルールを備え、CI 上で UI テストを行うサンプルアプリ、DocC を加え、iOSTestingTools の有用な部分を統合しました