Add iOS end to end tests#215
Merged
StuartFerguson merged 5 commits intomainfrom Jul 25, 2025
Merged
Conversation
Comment on lines
+10
to
+189
| runs-on: macos-15 | ||
| env: | ||
| PLATFORM_VERSION: "18.5" | ||
| DEVICE_NAME: "iPhone 16" | ||
| APP_PATH: "./MyTestApp.app" | ||
|
|
||
| steps: | ||
| - name: 🧾 Checkout repo | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: 🔧 Set up Node.js | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: '20' | ||
|
|
||
| - name: 🔧 Set up .NET | ||
| uses: actions/setup-dotnet@v4 | ||
| with: | ||
| dotnet-version: '9.0.x' | ||
|
|
||
| - name: 📦 Install Appium + XCUITest driver | ||
| run: | | ||
| npm install -g appium | ||
| appium driver install xcuitest | ||
|
|
||
| #- name: 🧹 Clean DerivedData and WDA cache | ||
| # run: | | ||
| # rm -rf ~/Library/Developer/Xcode/DerivedData | ||
| # rm -rf ~/.appium/node_modules/appium-webdriveragent/Build | ||
|
|
||
| - name: 📱 Create iOS Simulator (if needed) | ||
| run: | | ||
| SIMULATOR_NAME="ci-sim-$RANDOM" | ||
| xcrun simctl create "$SIMULATOR_NAME" "$DEVICE_NAME" "com.apple.CoreSimulator.SimRuntime.iOS-${PLATFORM_VERSION//./-}" | ||
| echo "SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV | ||
|
|
||
| - name: 🚀 Boot simulator | ||
| run: | | ||
| xcrun simctl boot "$SIMULATOR_NAME" | ||
| SIMULATOR_ID=$(xcrun simctl list | grep 'Booted' | awk -F '[()]' '{print $2}') | ||
| echo "SIMULATOR_ID=$SIMULATOR_ID" | ||
| echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV | ||
|
|
||
| # Open the simulator UI so Appium doesn’t force-restart it later | ||
| open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app | ||
|
|
||
| # Wait a bit to ensure the UI is up | ||
| sleep 5 | ||
|
|
||
|
|
||
| - name: List available simulators | ||
| run: | | ||
| xcrun simctl list | grep $SIMULATOR_ID | ||
|
|
||
| #- name: Build, verify, and deploy WebDriverAgent | ||
| # run: | | ||
| # set -euo pipefail | ||
|
|
||
| # # Set up vars | ||
| # WDA_DIR="/tmp/WebDriverAgent" | ||
| # DERIVED_DATA="/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" | ||
| # #SIMULATOR_UDID="${{ env.UDID }}" | ||
| # echo "Using simulator $SIMULATOR_ID" | ||
|
|
||
| # # Clone WDA | ||
| # echo "Cloning WebDriverAgent..." | ||
| # git clone https://github.com/appium/WebDriverAgent.git "$WDA_DIR" | ||
|
|
||
| # # Build WDA using xcodebuild without signing (safe for CI) | ||
| # echo "Building WebDriverAgentRunner..." | ||
| # xcodebuild -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ | ||
| # -scheme WebDriverAgentRunner \ | ||
| # -destination "id=$SIMULATOR_ID" \ | ||
| # -derivedDataPath "/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" \ | ||
| # CODE_SIGNING_ALLOWED=NO \ | ||
| # build-for-testing | ||
|
|
||
| # # Verify build output | ||
| # echo "Looking for WDA build output..." | ||
| # WDA_APP=$(find "$DERIVED_DATA" -type d -name "WebDriverAgentRunner-Runner.app" | head -n 1) | ||
| # if [ -z "$WDA_APP" ]; then | ||
| # echo "::error ::Failed to locate built WebDriverAgentRunner-Runner.app" | ||
| # exit 1 | ||
| # fi | ||
| # echo "Found built WDA app at: $WDA_APP" | ||
|
|
||
| # # Launch WDA via xcodebuild test-without-building (required for XCTest runners) | ||
| # echo "Launching WebDriverAgent test runner on simulator..." | ||
| # xcodebuild test-without-building \ | ||
| # -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ | ||
| # -scheme WebDriverAgentRunner \ | ||
| # -destination "id=$SIMULATOR_ID" \ | ||
| # -derivedDataPath "$DERIVED_DATA" \ | ||
| # IPHONEOS_DEPLOYMENT_TARGET=18.0 \ | ||
| # GCC_TREAT_WARNINGS_AS_ERRORS=0 \ | ||
| # COMPILER_INDEX_STORE_ENABLE=NO \ | ||
| # > /tmp/wda-launch.log 2>&1 & | ||
|
|
||
| # # Wait for WDA to be ready | ||
| # echo "Waiting for WDA to be available on http://127.0.0.1:8100/status..." | ||
|
|
||
| # for i in {1..30}; do | ||
| # if curl --silent --fail http://127.0.0.1:8100/status | grep -q "state"; then | ||
| # echo "✅ WDA is up and running." | ||
| # exit 0 | ||
| # fi | ||
| # echo "Waiting... ($i)" | ||
| # sleep 2 | ||
| # done | ||
|
|
||
| # echo "::error::WDA failed to start within timeout." | ||
| # exit 1 | ||
|
|
||
| # echo "✅ WDA built, verified, installed, and launched successfully." | ||
|
|
||
| - name: 🧪 Start Appium Server | ||
| run: | | ||
| nohup appium --log appium.log & | ||
|
|
||
| - name: Install MAUI Workloads | ||
| run: | | ||
| dotnet workload install ios --ignore-failed-sources | ||
| dotnet workload install maui --ignore-failed-sources | ||
|
|
||
| - name: Restore MAUI App for iOS | ||
| run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json | ||
|
|
||
| - name: Select Xcode 16.4 | ||
| run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer | ||
|
|
||
| - name: Confirm Xcode version | ||
| run: xcodebuild -version | ||
|
|
||
| - name: Accept Xcode license | ||
| run: sudo xcodebuild -license accept | ||
|
|
||
| - name: Build Code | ||
| #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-ios -c Release --no-restore | ||
| #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 /p:EnableAssemblyILStripping=false /p:EnableSymbolStrip=false /p:LinkMode=None | ||
| run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 #/p:LinkMode=SdkOnly /p:EnableAssemblyILStripping=true /p:EnableSymbolStrip=true /p:Codesign=false /p:DebugSymbols=false /p:UseInterpreter=true | ||
|
|
||
| # - name: List all files with full path | ||
| # run: | | ||
| # find /Users/runner/work/TransactionMobile/TransactionMobile/TransactionProcessor.Mobile/bin -type f | ||
|
|
||
| - name: Run iOS Navigation Tests | ||
| run: | | ||
| #dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Debug --no-restore | ||
| dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=PRTest" --no-restore | ||
| # dotnet tool install --global NUnit.ConsoleRunner.NetCore | ||
| # nunit3-console TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "(cat == PRNavTest && cat == iOS)" | ||
|
|
||
| # - name: Run iOS Navigation Tests | ||
| # run: | | ||
| # # Install NUnit Console Runner tool | ||
| # dotnet tool install --global NUnit.ConsoleRunner.NetCore | ||
|
|
||
| # # Ensure the tool path is available in this step | ||
| # export PATH="$PATH:$HOME/.dotnet/tools" | ||
|
|
||
| # # Optional: clean + build test project if not already built | ||
| # dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Release --no-restore | ||
|
|
||
| # # Run the tests filtered by categories | ||
| # nunit TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "cat == PRNavTest && cat == iOS" --labels=All --result=TestResult-iOS.xml | ||
|
|
||
| - name: Upload Appium Logs on Failure | ||
| if: failure() | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: ios-e2e_tests_appium | ||
| path: appium.log | ||
|
|
||
| # - name: Upload NUnit Test Results | ||
| # uses: actions/upload-artifact@v4 | ||
| # with: | ||
| # name: iOS-Test-Results | ||
| # path: TestResult-iOS.xml | ||
|
|
||
|
No newline at end of file |
Check warning
Code scanning / CodeQL
Workflow does not contain permissions Medium
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI 10 months ago
To fix the issue, we will add a permissions block at the root of the workflow file. This block will explicitly define the permissions required for the workflow. Based on the tasks performed in the workflow, the minimal permissions required are contents: read to allow the workflow to read the repository contents. If any steps require additional permissions (e.g., pull-requests: write), they can be added as needed.
Suggested changeset
1
.github/workflows/ios_e2e_tests.yml
| @@ -7,2 +7,5 @@ | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: |
Copilot is powered by AI and may make mistakes. Always verify output.
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
closes #210