English · 日本語
showcase 群(プラットフォームをまたぐ唯一のフィクスチャ)¶
Bajutsu のテストフィクスチャは
demos/showcase/にあります。同じ画面契約を 5 回実装しています。iOS の SwiftUI と UIKit、Android の Jetpack Compose と Views、そして両方の プラットフォームを対象とする 1 つの Flutter コードベースです。ほとんどのツールキットはアクセシビリティ 有/無の対で作られています(Flutter の iOS 版は今のところアクセシビリティ有のみです)。この 5 つの コードベースから、demos/showcase/showcase.config.yamlに 12 個のtargets.<name>を登録しています。実アプリが持つ操作面(push ナビゲーションを伴う 5 タブ、 全コードベース共通の 4 種のモーダルと iOS 限定のネイティブアラート(あわせて 5 種)、テキスト入力、 ジェスチャ、非同期ロード、実通信+モック可能な通信、OS アラートを出す画面)を、その全体を語れる最小の アプリに収めています。BE-0079 でこれを唯一の iOS フィクスチャとし、旧来の
demo/sample/sample2を退役させました。 その後 BE-0007 と BE-0008 が、この iOS フィクスチャを今日のプラットフォームをまたぐ姿へと広げ、Android と Flutter の双子アプリを加えました。画面ごとの正式な契約(各識別子と各シナリオの対応)はdemos/showcase/SPEC.mdにあります。本ページはそこへの入り口をまとめた ものです。
なぜ 2 ツールキット × アクセシビリティ 2 変種なのか¶
showcase は、Bajutsu の設計が依って立つ 2 つの軸を可視化します。
- ツールキット軸(UIKit と SwiftUI):アクセシビリティ ON の 2 プロダクト(
showcase-swiftui/showcase-uikit)は同一の識別子契約を露出するので、共有のdemos/showcase/scenarios/がどちらに対しても変更なしで動きます。 異なるのは backend が見る要素ツリーで、これこそクロスツールキットのドライバが吸収すべき差異です。 - アクセシビリティ軸(サフィックス無し ↔
-noax):-noaxビルドは識別子を一切持ちません (idNamespaces: [])。これはセレクタ安定性の対照実験です(DESIGN §5)。同じゴールを両方に対して記録すると、 アクセシビリティ作業の価値が具体的な差分として現れます。またrecord/doctorの「アクセシビリティ欠如」の 題材でもあります。
ビルドと実行¶
中核となる iOS の 4 ターゲットは、もとの bundle id(com.bajutsu.showcase.ios.{swiftui,uikit}[.noax])と
deeplink scheme(showcase{swiftui,uikit}[noax])をそのまま使います。XcodeGen + xcodebuild でビルドします
(project.yml が信頼できる唯一の情報源で、.xcodeproj / build/ は gitignore 対象です)。5 つめの iOS
ターゲット showcase-swiftui-bundled は同じ SwiftUI アプリを使いますが、xcuitest: の設定を持ちません。
そのため Simulator 上の実行はローカルビルドのランナーではなく、wheel に同梱されたランナー(BE-0292)に
解決されます。bajutsu doctor --target showcase-swiftui-bundled を実行すると、実際にどちらのランナーが
使われているかを確認できます。残る 7 ターゲットは、Android の双子アプリ(android/、
Jetpack Compose と Views、BE-0007)と、両プラットフォーム向けの Flutter の双子アプリ
(flutter/、BE-0008)です。それぞれ Gradle と Flutter SDK でビルドします。
make -C demos/showcase swiftui-build # SwiftUI a11y プロダクトを Simulator 向けにコンパイル
make -C demos/showcase run-swiftui # ビルド → インストール → 起動中 Simulator に対し bajutsu run(XCUITest)
make -C demos/showcase doctor # アクセシビリティ A/B:a11y は Ready、-noax は Blocked
make -C demos/showcase ui-test # codegen 経路:シナリオ → XCUITest → xcodebuild test
make -C demos/showcase run-flutter # Flutter の iOS 版:ビルド → インストール → bajutsu run(XCUITest)
make -C demos/showcase run-flutter-android # Flutter の Android 版:ビルド → インストール → bajutsu run(adb)
make -C demos/showcase/android e2e-codegen # Android 版:シナリオ → UI Automator → connectedAndroidTest(起動済みエミュレータが必要、BE-0294)
bajutsu run / serve は各ターゲットの build コマンドでアプリを必要時にビルドするので、先に手動で
ビルドする必要はほとんどありません。
起動環境フック¶
launchEnv で注入し、SIMCTL_CHILD_<NAME> として渡します(drivers)。
BE-0079 で、データ状態と push で開く画面への起動時ショートカットを取り除きました。カタログは固定で(シードする
手段はありません)、deeplink が詳細へ直接飛ぶこともありません(詳細は行のタップでのみ到達します)。
BE-0107 では、画面への最後の起動時ショートカットである SHOWCASE_TAB を廃止して、この作業を完了しました。
アプリはつねに Stable タブで起動し、ほかのタブへはネイティブのタブバーをタップして移動します。XCUITest
backend はネイティブのタブバーの個々のタブをタップできるので、
タブをまたぐシナリオは --backend ios で実行します。起動タブより先の画面はすべて UI を操作して辿り、
シナリオはデータを注入せずアプリ自身の状態を観測します。
| 変数 | 効果 |
|---|---|
SHOWCASE_UITEST=1 |
アニメーションを無効化(条件待機を締める) |
SHOWCASE_API_URL / SHOWCASE_HTTP_BASE |
カタログ GET とエコー POST/DELETE エンドポイントの base URL |
識別子カタログの全体、deeplink 文法、プリミティブとシナリオの対応は
demos/showcase/SPEC.md にあります。