Test Canvas Android Apps
Run unit tests, instrumentation tests, and Espresso tests for Canvas Android apps.
Test Location
All test commands must be run from the repository root (canvas-android/), not the apps/ directory.
Unit Tests
Unit tests verify business logic in isolation using Mockk for mocking.
Prerequisites
- •Set Build Variant to
qaDebugin Android Studio, or - •Use command line with
testQaDebugUnitTestas shown below
Run Unit Tests for Apps
bash
# Student app - all unit tests ./gradle/gradlew -p apps :student:testQaDebugUnitTest # Teacher app - all unit tests ./gradle/gradlew -p apps :teacher:testQaDebugUnitTest # Parent app - all unit tests ./gradle/gradlew -p apps :parent:testQaDebugUnitTest
Run Unit Tests for Shared Libraries
bash
# Test a specific module (e.g., pandautils) ./gradle/gradlew -p apps :pandautils:testDebugUnitTest # Test specific class or package ./gradle/gradlew -p apps :pandautils:testDebugUnitTest --tests "com.instructure.pandautils.features.discussion.router.*" # Force re-run tests (ignore cache) ./gradle/gradlew -p apps :pandautils:testDebugUnitTest --rerun-tasks
Run Specific Unit Tests
Use the --tests flag to run specific test classes or methods:
bash
# Run single test class ./gradle/gradlew -p apps :student:testQaDebugUnitTest --tests "com.instructure.student.features.dashboard.DashboardViewModelTest" # Run tests matching a pattern ./gradle/gradlew -p apps :student:testQaDebugUnitTest --tests "com.instructure.student.features.dashboard.widget.*"
Test Structure
- •Unit tests:
src/test/java/com/instructure/{app}/features/{feature}/ - •Instrumentation tests:
src/androidTest/java/com/instructure/{app}/ui/{feature}/
Instrumentation/Espresso Tests
Instrumentation tests run on a device or emulator to test UI interactions.
Prerequisites
Before running UI tests, check for connected devices:
bash
adb devices -l
If multiple devices are connected:
- •Prefer running on an emulator if available
- •Use
ANDROID_SERIALenvironment variable or-sflag to specify a device
Run All Instrumentation Tests
bash
# Student app ./gradle/gradlew -p apps :student:connectedQaDebugAndroidTest # Teacher app ./gradle/gradlew -p apps :teacher:connectedQaDebugAndroidTest
Run Specific Instrumentation Test
bash
# Run single test class ./gradle/gradlew -p apps :student:connectedQaDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.instructure.student.ui.dashboard.DashboardPageTest
Target Specific Device
If multiple devices are connected:
bash
# Use environment variable ANDROID_SERIAL=emulator-5554 ./gradle/gradlew -p apps :student:connectedQaDebugAndroidTest # Or use adb flag adb -s emulator-5554 shell ...
Testing Patterns
- •Write unit tests in the same style as existing tests (check
student/src/test/) - •Write instrumentation tests following existing patterns (check
student/src/androidTest/) - •Mock dependencies with Mockk
- •Use test doubles for repositories in ViewModel tests
- •Espresso tests should use page object pattern from
:espressomodule - •Ensure tests are isolated and repeatable
Examples
Run all widget tests:
bash
./gradle/gradlew -p apps :student:testQaDebugUnitTest --tests "com.instructure.student.features.dashboard.widget.*"
Run tests and view report:
bash
./gradle/gradlew -p apps :student:testQaDebugUnitTest open apps/student/build/reports/tests/testQaDebugUnitTest/index.html