Skip to content

Commit b55de13

Browse files
committed
Adapt screenshot tests to fetch screenshots from the device and save them to the host.
Archive screenshots at the end of tests.
1 parent 54e33d6 commit b55de13

File tree

6 files changed

+87
-46
lines changed

6 files changed

+87
-46
lines changed

Diff for: .github/workflows/tests.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,11 @@ jobs:
8383
path: |
8484
./app/build/outputs/apk/debug/app-debug.apk
8585
./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
86+
- name: Archive screenshots
87+
if: always()
88+
uses: actions/upload-artifact@v4
89+
with:
90+
name: screenshots
91+
path: |
92+
./screenshots-Light
93+
./screenshots-Dark

Diff for: app/src/androidTest/kotlin/ca/rmen/android/poetassistant/main/ScreenshotTest.kt

+35-13
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@
1818
*/
1919
package ca.rmen.android.poetassistant.main
2020

21-
import android.Manifest
21+
import android.app.Application
2222
import android.graphics.Bitmap
2323
import android.os.SystemClock
2424
import androidx.test.core.app.ApplicationProvider
2525
import androidx.test.espresso.Espresso
2626
import androidx.test.filters.LargeTest
2727
import androidx.test.platform.app.InstrumentationRegistry
28-
import androidx.test.rule.GrantPermissionRule
29-
import androidx.test.runner.screenshot.BasicScreenCaptureProcessor
28+
import androidx.test.runner.screenshot.ScreenCapture
3029
import androidx.test.runner.screenshot.ScreenCaptureProcessor
3130
import androidx.test.runner.screenshot.Screenshot
3231
import ca.rmen.android.poetassistant.R
@@ -41,6 +40,7 @@ import org.junit.Rule
4140
import org.junit.Test
4241
import org.junit.runner.RunWith
4342
import org.junit.runners.MethodSorters
43+
import java.io.File
4444
import java.io.IOException
4545

4646

@@ -56,24 +56,33 @@ class ScreenshotTest {
5656
@TestParameter
5757
lateinit var themePreference: ThemePreference
5858

59+
private lateinit var deviceScreenshotsFolder: File
60+
5961
@JvmField
6062
@Rule
61-
var activityTestRule: PoetAssistantActivityTestRule<MainActivity> = PoetAssistantActivityTestRule(
63+
val activityTestRule: PoetAssistantActivityTestRule<MainActivity> = PoetAssistantActivityTestRule(
6264
MainActivity::class.java, true
6365
)
6466

65-
@JvmField
66-
@Rule
67-
var writeScreenshotRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)
68-
6967
@Before
70-
fun setupTheme() {
68+
fun setup() {
69+
// Set the theme
7170
InstrumentationRegistry.getInstrumentation().runOnMainSync {
7271
val settingsPrefs =
7372
SettingsPrefs(ApplicationProvider.getApplicationContext())
7473
settingsPrefs.theme = themePreference.value
7574
setThemeFromSettings(settingsPrefs)
7675
}
76+
77+
// Create a fresh folder to store the screenshots
78+
deviceScreenshotsFolder = File(
79+
ApplicationProvider.getApplicationContext<Application>().getExternalFilesDir(null),
80+
"screenshots-${themePreference.value}"
81+
)
82+
if (deviceScreenshotsFolder.exists()) {
83+
deviceScreenshotsFolder.deleteRecursively()
84+
}
85+
deviceScreenshotsFolder.mkdirs()
7786
}
7887

7988
@Test
@@ -113,6 +122,22 @@ class ScreenshotTest {
113122
}
114123
}
115124

125+
private inner class Processor : ScreenCaptureProcessor {
126+
override fun process(capture: ScreenCapture): String {
127+
val deviceFile = File(deviceScreenshotsFolder, "${capture.name}.png")
128+
deviceFile.outputStream().use {
129+
capture.bitmap.compress(
130+
Bitmap.CompressFormat.PNG,
131+
0,
132+
it,
133+
)
134+
}
135+
return deviceFile.absolutePath
136+
}
137+
}
138+
139+
private val processor = Processor()
140+
116141
// https://stackoverflow.com/questions/38519568/how-to-take-screenshot-at-the-point-where-test-fail-in-espresso
117142
private fun takeScreenshot(filename: String) {
118143
SystemClock.sleep(500) // :(
@@ -121,11 +146,8 @@ class ScreenshotTest {
121146
capture.setName(filename)
122147
capture.setFormat(Bitmap.CompressFormat.PNG)
123148

124-
val processors = HashSet<ScreenCaptureProcessor>()
125-
processors.add(BasicScreenCaptureProcessor())
126-
127149
try {
128-
capture.process(processors)
150+
capture.process(setOf(processor))
129151
} catch (e: IOException) {
130152
e.printStackTrace()
131153
}

Diff for: etc/screenshots/rename.sh

-6
This file was deleted.

Diff for: etc/screenshots/run.sh

-27
This file was deleted.

Diff for: scripts/run_screenshots.sh

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env bash
2+
3+
./gradlew assembleDebug assembleDebugAndroidTest
4+
mapfile -t devices < <(adb devices | grep "device$" | sed -e 's/\t.*$//g')
5+
6+
# Install the app and test apk to the devices.
7+
for device in "${devices[@]}";
8+
do
9+
echo "Installing apks to ${device}"
10+
adb -s "${device}" install -r ./app/build/outputs/apk/debug/app-debug.apk
11+
adb -s "${device}" install -r ./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
12+
done
13+
14+
run_tests() {
15+
device="$1"
16+
output="/tmp/${device}.log"
17+
echo "Running tests on ${device}, output to ${output}"
18+
adb -s "${device}" shell settings put global animator_duration_scale 0
19+
adb -s "${device}" shell settings put global transition_animation_scale 0
20+
adb -s "${device}" shell settings put global window_animation_scale 0
21+
adb -s "${device}" shell am instrument -w -m -e debug false -e class ca.rmen.android.poetassistant.main.ScreenshotTest ca.rmen.android.poetassistant.test.test/androidx.test.runner.AndroidJUnitRunner > "${output}" 2>&1
22+
23+
echo "pulling screenshots to ${device}-light and ${device}-dark"
24+
if [ -e "${device}-light" ]
25+
then
26+
rm -rf "${device}-light"
27+
fi
28+
if [ -e "${device}-dark" ]
29+
then
30+
rm -rf "${device}-dark"
31+
fi
32+
base_folder=/storage/emulated/0/Android/data/ca.rmen.android.poetassistant.test/files
33+
adb -s "${device}" pull "${base_folder}/screenshots-Light" "${device}-light"
34+
adb -s "${device}" pull "${base_folder}/screenshots-Dark" "${device}-dark"
35+
}
36+
for device in "${devices[@]}";
37+
do
38+
run_tests "$device" &
39+
done
40+

Diff for: scripts/run_tests.bash

+4
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ adb shell settings put global transition_animation_scale 0
55
adb shell settings put global window_animation_scale 0
66

77
./gradlew --no-daemon testDebugUnitTest cAT jacocoTestReport
8+
9+
base_folder=/storage/emulated/0/Android/data/ca.rmen.android.poetassistant.test/files
10+
adb pull "${base_folder}/screenshots-Light"
11+
adb pull "${base_folder}/screenshots-Dark"

0 commit comments

Comments
 (0)