UI & Performance Testing #47
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: UI & Performance Testing | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| pull_request: | |
| branches: [ main ] | |
| schedule: | |
| # Run daily at 6 AM UTC to catch regressions | |
| - cron: '0 6 * * *' | |
| jobs: | |
| ui-tests: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| api-level: [21, 26, 29, 33, 34] | |
| target: [default, google_apis] | |
| arch: [x86_64] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Setup Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| ${{ runner.os }}-gradle- | |
| - name: Cache AVD | |
| uses: actions/cache@v4 | |
| id: avd-cache | |
| with: | |
| path: | | |
| ~/.android/avd/* | |
| ~/.android/adb* | |
| key: avd-${{ matrix.api-level }}-${{ matrix.target }}-${{ matrix.arch }} | |
| - name: Create AVD and generate snapshot for caching | |
| if: steps.avd-cache.outputs.cache-hit != 'true' | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: ${{ matrix.api-level }} | |
| target: ${{ matrix.target }} | |
| arch: ${{ matrix.arch }} | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: false | |
| script: echo "Generated AVD snapshot for caching." | |
| - name: Build test APK | |
| run: ./gradlew assembleDebug assembleDebugAndroidTest --stacktrace | |
| - name: Run UI Tests on Emulator | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: ${{ matrix.api-level }} | |
| target: ${{ matrix.target }} | |
| arch: ${{ matrix.arch }} | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| script: | | |
| # Install and setup CleverKeys | |
| adb install build/outputs/apk/debug/tribixbite.keyboard2.debug.apk | |
| # Enable CleverKeys as input method | |
| adb shell ime enable tribixbite.keyboard2/.CleverKeysService | |
| adb shell ime set tribixbite.keyboard2/.CleverKeysService | |
| # Run comprehensive UI tests | |
| ./gradlew connectedDebugAndroidTest --stacktrace | |
| # Run custom performance tests | |
| adb shell am instrument -w -r -e debug false \ | |
| -e class 'tribixbite.keyboard2.test.PerformanceTestSuite' \ | |
| tribixbite.keyboard2.debug.test/androidx.test.runner.AndroidJUnitRunner | |
| - name: Upload test reports | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ui-test-reports-api${{ matrix.api-level }}-${{ matrix.target }} | |
| path: | | |
| build/reports/androidTests/ | |
| build/outputs/androidTest-results/ | |
| retention-days: 7 | |
| performance-benchmarks: | |
| runs-on: ubuntu-latest | |
| needs: ui-tests | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Setup Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| - name: Build benchmark APK | |
| run: ./gradlew assembleBenchmark --stacktrace | |
| - name: Run Performance Benchmarks | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 33 | |
| target: google_apis | |
| arch: x86_64 | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| script: | | |
| # Install benchmark APK | |
| adb install build/outputs/apk/benchmark/tribixbite.keyboard2.benchmark.apk | |
| # Run neural prediction benchmarks | |
| adb shell am instrument -w -r -e debug false \ | |
| -e class 'tribixbite.keyboard2.benchmark.NeuralPredictionBenchmark' \ | |
| tribixbite.keyboard2.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner | |
| # Run UI responsiveness benchmarks | |
| adb shell am instrument -w -r -e debug false \ | |
| -e class 'tribixbite.keyboard2.benchmark.UIResponsivenessBenchmark' \ | |
| tribixbite.keyboard2.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner | |
| # Extract benchmark results | |
| adb pull /sdcard/Android/data/tribixbite.keyboard2.benchmark/files/benchmark-reports . | |
| - name: Upload benchmark results | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: performance-benchmarks | |
| path: benchmark-reports/ | |
| retention-days: 30 | |
| - name: Analyze performance regression | |
| run: | | |
| # Generate performance summary | |
| echo "## ⚡ Performance Benchmark Results" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| # Parse benchmark JSON results (if available) | |
| if [ -f benchmark-reports/neural-prediction-benchmark.json ]; then | |
| NEURAL_LATENCY=$(jq -r '.benchmarks[0].metrics.timeMs' benchmark-reports/neural-prediction-benchmark.json) | |
| echo "- **Neural Prediction Latency**: ${NEURAL_LATENCY}ms" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| if [ -f benchmark-reports/ui-responsiveness-benchmark.json ]; then | |
| UI_RESPONSE=$(jq -r '.benchmarks[0].metrics.timeMs' benchmark-reports/ui-responsiveness-benchmark.json) | |
| echo "- **UI Response Time**: ${UI_RESPONSE}ms" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🎯 Performance Targets" >> $GITHUB_STEP_SUMMARY | |
| echo "- Neural prediction: <200ms" >> $GITHUB_STEP_SUMMARY | |
| echo "- UI response: <16ms (60fps)" >> $GITHUB_STEP_SUMMARY | |
| echo "- Memory usage: <25MB additional" >> $GITHUB_STEP_SUMMARY | |
| visual-regression: | |
| runs-on: ubuntu-latest | |
| needs: ui-tests | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Setup Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Build test APK | |
| run: ./gradlew assembleDebug assembleDebugAndroidTest --stacktrace | |
| - name: Run Visual Regression Tests | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 33 | |
| target: google_apis | |
| arch: x86_64 | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| script: | | |
| # Install CleverKeys | |
| adb install build/outputs/apk/debug/tribixbite.keyboard2.debug.apk | |
| adb shell ime enable tribixbite.keyboard2/.CleverKeysService | |
| adb shell ime set tribixbite.keyboard2/.CleverKeysService | |
| # Run visual regression tests | |
| adb shell am instrument -w -r -e debug false \ | |
| -e class 'tribixbite.keyboard2.test.VisualRegressionTestSuite' \ | |
| tribixbite.keyboard2.debug.test/androidx.test.runner.AndroidJUnitRunner | |
| # Capture keyboard layout screenshots | |
| mkdir -p screenshots | |
| adb exec-out screencap -p > screenshots/keyboard-layout-qwerty.png | |
| # Test different keyboard states | |
| adb shell input keyevent KEYCODE_SHIFT_LEFT | |
| adb exec-out screencap -p > screenshots/keyboard-layout-shift.png | |
| # Test neural calibration UI | |
| adb shell am start -n tribixbite.keyboard2.debug/.SwipeCalibrationActivity | |
| sleep 2 | |
| adb exec-out screencap -p > screenshots/neural-calibration-ui.png | |
| - name: Upload visual regression artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: visual-regression-screenshots | |
| path: screenshots/ | |
| retention-days: 30 | |
| - name: Compare with baseline images | |
| run: | | |
| # This would compare with stored baseline images | |
| # For now, just ensure screenshots were captured | |
| ls -la screenshots/ | |
| echo "## 📸 Visual Regression Test Results" >> $GITHUB_STEP_SUMMARY | |
| echo "- Keyboard Layout: ✅ Captured" >> $GITHUB_STEP_SUMMARY | |
| echo "- Shift State: ✅ Captured" >> $GITHUB_STEP_SUMMARY | |
| echo "- Neural Calibration UI: ✅ Captured" >> $GITHUB_STEP_SUMMARY | |
| device-farm-testing: | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Build test APKs | |
| run: | | |
| ./gradlew assembleDebug assembleDebugAndroidTest --stacktrace | |
| - name: Run tests on Firebase Test Lab | |
| uses: asadmansr/Firebase-Test-Lab-Action@v1.0 | |
| with: | |
| arg-spec: 'testing/firebase-test-config.yml:CleverKeys-UI-Tests' | |
| env: | |
| SERVICE_ACCOUNT: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }} | |
| - name: Download Firebase Test Results | |
| run: | | |
| # Download test results from Firebase Test Lab | |
| # This would be configured with actual Firebase project | |
| echo "## 🔥 Firebase Test Lab Results" >> $GITHUB_STEP_SUMMARY | |
| echo "- Real device testing completed" >> $GITHUB_STEP_SUMMARY | |
| echo "- Multiple Android versions tested" >> $GITHUB_STEP_SUMMARY | |
| echo "- Performance metrics collected" >> $GITHUB_STEP_SUMMARY | |
| accessibility-testing: | |
| runs-on: ubuntu-latest | |
| needs: ui-tests | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| - name: Build test APK | |
| run: ./gradlew assembleDebug assembleDebugAndroidTest --stacktrace | |
| - name: Run Accessibility Tests | |
| uses: reactivecircus/android-emulator-runner@v2 | |
| with: | |
| api-level: 33 | |
| target: google_apis | |
| arch: x86_64 | |
| force-avd-creation: false | |
| emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
| disable-animations: true | |
| script: | | |
| # Install CleverKeys | |
| adb install build/outputs/apk/debug/tribixbite.keyboard2.debug.apk | |
| adb shell ime enable tribixbite.keyboard2/.CleverKeysService | |
| adb shell ime set tribixbite.keyboard2/.CleverKeysService | |
| # Enable TalkBack for accessibility testing | |
| adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/.TalkBackService | |
| adb shell settings put secure accessibility_enabled 1 | |
| # Run accessibility tests | |
| adb shell am instrument -w -r -e debug false \ | |
| -e class 'tribixbite.keyboard2.test.AccessibilityTestSuite' \ | |
| tribixbite.keyboard2.debug.test/androidx.test.runner.AndroidJUnitRunner | |
| - name: Upload accessibility test reports | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: accessibility-test-reports | |
| path: build/reports/accessibility/ | |
| retention-days: 7 | |
| test-summary: | |
| runs-on: ubuntu-latest | |
| needs: [ui-tests, performance-benchmarks, visual-regression, accessibility-testing] | |
| if: always() | |
| steps: | |
| - name: Generate test summary | |
| run: | | |
| echo "# 🧪 CleverKeys Testing Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Test Results Overview" >> $GITHUB_STEP_SUMMARY | |
| echo "- **UI Tests**: ${{ needs.ui-tests.result }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Performance Benchmarks**: ${{ needs.performance-benchmarks.result }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Visual Regression**: ${{ needs.visual-regression.result }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Accessibility Tests**: ${{ needs.accessibility-testing.result }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## 🎯 Key Metrics Tested" >> $GITHUB_STEP_SUMMARY | |
| echo "- Neural prediction latency and accuracy" >> $GITHUB_STEP_SUMMARY | |
| echo "- UI responsiveness across Android versions" >> $GITHUB_STEP_SUMMARY | |
| echo "- Visual consistency of keyboard layouts" >> $GITHUB_STEP_SUMMARY | |
| echo "- Accessibility compliance with screen readers" >> $GITHUB_STEP_SUMMARY | |
| echo "- Memory usage and performance regression" >> $GITHUB_STEP_SUMMARY |