コンテンツにスキップ

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 にあります。本ページはそこへの入り口をまとめた ものです。

関連:シナリオ · 設定 · codegen · cli


なぜ 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 にあります。