Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature/roborazzi]: Screenshot Test 작업 추가 #323

Merged
merged 38 commits into from
Jun 7, 2024
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
f92051f
필요 종속성 추가
kez-lab Jun 4, 2024
5915353
필요 종속성 추가
kez-lab Jun 4, 2024
7a56fb6
test rule 및 RobotTestRule 추가
kez-lab Jun 4, 2024
dfbf076
App Test 셋팅
kez-lab Jun 4, 2024
4b6dee5
CI yml파일 셋팅
kez-lab Jun 4, 2024
f94568d
사용하지 않는 함수 제거
kez-lab Jun 4, 2024
249229c
사용하지 않는 import 제거
kez-lab Jun 4, 2024
9c59eff
CI .yml 수정
kez-lab Jun 4, 2024
0411f70
CI .yml 수정
kez-lab Jun 4, 2024
dc381fe
CI .yml 수정
kez-lab Jun 4, 2024
37acc52
CI .yml 수정
kez-lab Jun 4, 2024
a275ee2
CI .yml 수정
kez-lab Jun 4, 2024
dbe4257
CI .yml 수정
kez-lab Jun 4, 2024
9a889d5
CI .yml 수정
kez-lab Jun 4, 2024
ad0853c
CI .yml 수정
kez-lab Jun 4, 2024
667839e
CI .yml 수정
kez-lab Jun 4, 2024
13479f0
CI .yml 수정
kez-lab Jun 4, 2024
c2b676c
CI .yml 수정
kez-lab Jun 4, 2024
3233adc
CI .yml 수정
kez-lab Jun 4, 2024
5e19f70
CI .yml 수정
kez-lab Jun 4, 2024
7174967
CI .yml 수정
kez-lab Jun 4, 2024
cb26759
CI .yml 수정
kez-lab Jun 4, 2024
9b94eb8
UI 변경 TEST
kez-lab Jun 4, 2024
1907469
TEST CI
kez-lab Jun 4, 2024
01615e1
TEST
kez-lab Jun 4, 2024
35db2c5
compare 속성 추가
kez-lab Jun 4, 2024
702ddb6
Merge pull request #2 from KwakEuiJin/feature/roborazzi-test
kez-lab Jun 4, 2024
fcab875
compare 속성 추가
kez-lab Jun 4, 2024
a3cf595
최종 수정
kez-lab Jun 4, 2024
3ec4fff
엔터 제거 수정
kez-lab Jun 5, 2024
b163440
Report Option 수정
kez-lab Jun 5, 2024
7a112a9
엔터 제거 수정
kez-lab Jun 5, 2024
f364d08
파일 마지막 줄 엔터 추가
kez-lab Jun 5, 2024
0c9d1af
gradle.properties roborazzi options 수정
kez-lab Jun 5, 2024
4b4a527
runTestWithLogging coroutineScope 제거 및 onFailure 활용
kez-lab Jun 5, 2024
26b884b
MainActivity Widget 기능 원복
kez-lab Jun 5, 2024
c1e9527
Merge remote-tracking branch 'upstream/main' into feature/roborazzi
kez-lab Jun 6, 2024
234d17a
HiltTestActivity.kt 삭제
kez-lab Jun 6, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/android-pull-request-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
jobs:
verify:
runs-on: ubuntu-latest

permissions:
checks: write

Expand Down Expand Up @@ -56,4 +56,4 @@ jobs:
uses: actions/upload-artifact@v3
with:
name: Test Results
path: "**/test-results/**/*.xml"
path: "**/test-results/**/*.xml"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엔터 제거 다시 조정해주세요.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 수정했습니다.

150 changes: 150 additions & 0 deletions .github/workflows/compare-screenshot-comment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
name: Screenshot compare comment

on:
workflow_run:
workflows:
- CompareScreenshot
types:
- completed

permissions: { }

jobs:
Comment-CompareScreenshot:
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'

timeout-minutes: 2

permissions:
actions: read # for downloading artifacts
contents: write # for pushing screenshot-diff to companion branch
pull-requests: write # for creating a comment on pull requests

runs-on: ubuntu-latest

steps:
- uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615
with:
name: pr
run_id: ${{ github.event.workflow_run.id }}
- id: get-pull-request-number
name: Get pull request number
shell: bash
run: |
echo "pull_request_number=$(cat NR)" >> "$GITHUB_OUTPUT"
- name: main checkout
id: checkout-main
uses: actions/checkout@v3
with:
ref: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.event.pull_request.base.ref || github.event.repository.default_branch }}
- id: switch-companion-branch
env:
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }}
run: |
# orphan means it will create no history branch
git branch -D "$BRANCH_NAME" || true
git checkout --orphan "$BRANCH_NAME"
git rm -rf .
- uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615
with:
run_id: ${{ github.event.workflow_run.id }}
name: screenshot-diff
path: screenshot-diff
- id: check-if-there-are-valid-files
name: Check if there are valid files
shell: bash
run: |
# Find all the files ending with _compare.png
mapfile -t files_to_add < <(find . -type f -name "*_compare.png")

# Check for invalid file names and add only valid ones
exist_valid_files="false"
for file in "${files_to_add[@]}"; do
if [[ $file =~ ^[a-zA-Z0-9_./-]+$ ]]; then
exist_valid_files="true"
break
fi
done
echo "exist_valid_files=$exist_valid_files" >> "$GITHUB_OUTPUT"
- id: push-screenshot-diff
shell: bash
if: steps.check-if-there-are-valid-files.outputs.exist_valid_files == 'true'
env:
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }}
run: |
# Find all the files ending with _compare.png
files_to_add=$(find . -type f -name "*_compare.png")

# Check for invalid file names and add only valid ones
for file in $files_to_add; do
if [[ "$file" =~ ^[a-zA-Z0-9_./-]+$ ]]; then
git add "$file"
fi
done
git config --global user.name ScreenshotBot
git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com
git commit -m "Add screenshot diff"
git push origin HEAD:"$BRANCH_NAME" -f
- id: generate-diff-reports
name: Generate diff reports
if: steps.check-if-there-are-valid-files.outputs.exist_valid_files == 'true'
env:
BRANCH_NAME: companion_${{ github.event.workflow_run.head_branch }}
shell: bash
run: |
# Find all the files ending with _compare.png in roborazzi folder
files=$(find . -type f -name "*_compare.png" | grep "roborazzi/" | grep -E "^[a-zA-Z0-9_./-]+$")
delimiter="$(openssl rand -hex 8)"
{
echo "reports<<${delimiter}"

# Create markdown table header
echo "Snapshot diff report vs base branch: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.event.pull_request.base.ref || github.event.repository.default_branch }}"
echo "| File name | Image |"
echo "|-------|-------|"
} >> "$GITHUB_OUTPUT"

# Iterate over the files and create table rows
for file in $files; do
# Get the file name and insert newlines every 20 characters
fileName=$(basename "$file" | sed -r 's/(.{20})/\1<br>/g')
echo "| [$fileName](https://github.com/${{ github.repository }}/blob/$BRANCH_NAME/$file) | ![](https://github.com/${{ github.repository }}/blob/$BRANCH_NAME/$file?raw=true) |" >> "$GITHUB_OUTPUT"
done
echo "${delimiter}" >> "$GITHUB_OUTPUT"
- name: Find Comment
uses: peter-evans/find-comment@v3
id: fc
if: steps.generate-diff-reports.outputs.reports != ''
with:
issue-number: ${{ steps.get-pull-request-number.outputs.pull_request_number }}
comment-author: 'github-actions[bot]'
body-includes: Snapshot diff report

- name: Add or update comment on PR
uses: peter-evans/create-or-update-comment@v4
if: steps.generate-diff-reports.outputs.reports != ''
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ steps.get-pull-request-number.outputs.pull_request_number }}
body: ${{ steps.generate-diff-reports.outputs.reports }}
edit-mode: replace

- name: Cleanup outdated companion branches
run: |
# Find outdated companion branches with last commit date
git branch -r --format="%(refname:lstrip=3)" | grep companion_ | while read -r branch; do
last_commit_date_timestamp=$(git log -1 --format=%ct "origin/$branch")
now_timestamp=$(date +%s)
# Delete branch if it's older than 1 month
# if [ $((now_timestamp - last_commit_date_timestamp)) -gt 2592000 ]; then
# For testing purpose, delete branch if it's older than 1 second
echo "branch: $branch now_timestamp: $now_timestamp last_commit_date_timestamp: $last_commit_date_timestamp"
if [ $((now_timestamp - last_commit_date_timestamp)) -gt 1 ]; then
# Comment out for demonstration purpose
echo "Deleting $branch"

# git push origin --delete "$branch"
fi
done
80 changes: 80 additions & 0 deletions .github/workflows/compare-screenshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: CompareScreenshot

on:
push:
branches:
- main
pull_request:

permissions: {}

jobs:
compare-screenshot-test:
runs-on: ubuntu-latest
timeout-minutes: 20

permissions:
contents: read # for clone
actions: write # for upload-artifact

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17

- name: Setup Gradle
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff # v3.3.2
with:
gradle-version: wrapper


- uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615
continue-on-error: true
with:
name: screenshot
workflow: store-screenshot.yml
branch: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref || github.event.repository.default_branch }}

- name: compare screenshot test
id: compare-screenshot-test
run: |
./gradlew compareRoborazziDebug --stacktrace

- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot-diff
path: |
**/build/outputs/roborazzi
retention-days: 30

- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot-diff-reports
path: |
**/build/reports
retention-days: 30

- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot-diff-test-results
path: |
**/build/test-results
retention-days: 30

- name: Save PR number
if: ${{ github.event_name == 'pull_request' }}
run: |
mkdir -p ./pr
echo ${{ github.event.number }} > ./pr/NR
- uses: actions/upload-artifact@v4
with:
name: pr
path: pr/
64 changes: 64 additions & 0 deletions .github/workflows/store-screenshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: StoreScreenshot

on:
push:
branches:
- main
pull_request:

permissions: {}

jobs:
store-screenshot-test:
runs-on: ubuntu-latest
timeout-minutes: 20

permissions:
contents: read # for clone
actions: write # for upload-artifact

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17

# Better than caching and/or extensions of actions/setup-java
- name: Setup Gradle
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff # v3.3.2
with:
gradle-version: wrapper

- name: record screenshot
id: record-test
run: |
# Use --rerun-tasks to disable cache for test task
./gradlew recordRoborazziDebug --stacktrace --rerun-tasks
- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot
path: |
**/build/outputs/roborazzi
retention-days: 30

- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot-reports
path: |
**/build/reports
retention-days: 30

- uses: actions/upload-artifact@v4
if: ${{ always() }}
with:
name: screenshot-test-results
path: |
**/build/test-results
retention-days: 30
5 changes: 4 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id("droidknights.android.application")
id("com.google.android.gms.oss-licenses-plugin")
alias(libs.plugins.baselineprofile)
alias(libs.plugins.roborazzi.plugin)
}

android {
Expand Down Expand Up @@ -43,4 +44,6 @@ dependencies {

baselineProfile(projects.baselineprofile)
implementation(libs.androidx.profileinstaller)
}

testImplementation(projects.core.testing)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

엔터 제거 다시 조정해주세요.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 수정했습니다.

48 changes: 48 additions & 0 deletions app/src/test/java/com/droidknights/app/KnightsAppTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.droidknights.app

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.droidknights.app.core.testing.category.ScreenshotTests
import com.droidknights.app.core.testing.robot.KnightsAppRobot
import com.droidknights.app.core.testing.rule.RobotTestRule
import com.droidknights.app.feature.main.MainActivity
import com.github.takahirom.roborazzi.RobolectricDeviceQualifiers
import dagger.hilt.android.testing.BindValue
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.HiltTestApplication
import org.junit.Rule
import org.junit.Test
import org.junit.experimental.categories.Category
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
import org.robolectric.annotation.GraphicsMode
import javax.inject.Inject

@RunWith(AndroidJUnit4::class)
@GraphicsMode(GraphicsMode.Mode.NATIVE)
@Config(application = HiltTestApplication::class)
@HiltAndroidTest
@Category(ScreenshotTests::class)
class KnightsAppTest {

@get:Rule
@BindValue
val robotTestRule: RobotTestRule = RobotTestRule<MainActivity>(this)

@Inject
lateinit var knightsAppRobot: KnightsAppRobot

@Test
fun checkStartupShot() {
knightsAppRobot {
capture()
}
}

@Test
@Config(qualifiers = RobolectricDeviceQualifiers.MediumTablet)
fun checkMediumTabletLaunchShot() {
knightsAppRobot {
capture()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ internal fun Project.configureKotlinAndroid() {
)
}
}
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}

configureKotlin()
Expand Down
Loading
Loading