From 44bb0e0bf80f23c8280efa28d2dae848b462eb55 Mon Sep 17 00:00:00 2001 From: Denis Verentsov Date: Fri, 31 Jan 2020 15:58:06 +0300 Subject: [PATCH 1/2] Added Shot and Test Rules dependencies. --- app/build.gradle | 13 ++++++++++++- build.gradle | 2 ++ dependencies.gradle | 5 ++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 927ab3c..ba195fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,9 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' + +apply plugin: 'shot' + apply from: rootProject.file('dependencies.gradle') apply from: rootProject.file('versions.gradle') apply from: rootProject.file('jacoco.gradle') @@ -21,7 +24,8 @@ android { buildTypes { debug { minifyEnabled false - applicationIdSuffix '.debug' + // This line may produce Shot error when he tries download screenshots + //applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } @@ -53,4 +57,11 @@ dependencies { kapt(librariesAnnotaionProcessors) implementation(appDependencies) + + // Fix for: Generated not found *javax.annotation.processing.Generated* + compileOnly 'javax.annotation:jsr250-api:1.0' +} + +shot { + appId = 'com.dvinc.notepad' } diff --git a/build.gradle b/build.gradle index 19355ce..5520ca9 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ buildscript { ext.kotlin_version = '1.3.60' ext.detekt_version = '1.0.0-RC14' ext.spotless_version = '3.27.1' + ext.shot_version = '3.1.0' repositories { google() @@ -16,6 +17,7 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detekt_version" classpath "com.diffplug.spotless:spotless-plugin-gradle:$spotless_version" + classpath "com.karumi:shot:$shot_version" } } diff --git a/dependencies.gradle b/dependencies.gradle index 3c34ba6..c61f747 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -13,6 +13,7 @@ def junit_version = '4.12' def mockito_core_version = '2.18.0' def kotlin_mockito_version = '2.1.0' def android_arch_core_testing_version = '2.0.1' +def test_rules_version = '1.2.0' def stetho_version = '1.5.0' def timber_version = '4.7.1' @@ -73,6 +74,8 @@ ext{ androidTestDependencies = [ test_runner = "com.android.support.test:runner:$test_runner_version", - espresso_core = "com.android.support.test.espresso:espresso-core:$espresso_core_version" + espresso_core = "com.android.support.test.espresso:espresso-core:$espresso_core_version", + + test_rules = "androidx.test:rules:$test_rules_version" ] } From 7efb41ddda3ad165b15ce8704aeb01ca9d25d90d Mon Sep 17 00:00:00 2001 From: Denis Verentsov Date: Fri, 31 Jan 2020 19:01:12 +0300 Subject: [PATCH 2/2] Added screenshot tests for Notepad and Note screens (empty screens, for now). --- app/build.gradle | 4 +- ...d.MainScreenTest_testEmptyNoteFragment.png | Bin 0 -> 25415 bytes ...ad.MainScreenTest_testEmptyNotepadList.png | Bin 0 -> 33537 bytes app/src/androidTest/AndroidManifest.xml | 8 +++ .../dvinc/notepad/ExampleInstrumentedTest.kt | 22 ------- .../java/com/dvinc/notepad/MainScreenTest.kt | 62 ++++++++++++++++++ .../com/dvinc/notepad/ScreenshotTestRunner.kt | 18 +++++ app/src/main/AndroidManifest.xml | 4 +- app/src/main/res/layout/fragment_note.xml | 1 + dependencies.gradle | 4 +- 10 files changed, 98 insertions(+), 25 deletions(-) create mode 100644 app/screenshots/com.dvinc.notepad.MainScreenTest_testEmptyNoteFragment.png create mode 100644 app/screenshots/com.dvinc.notepad.MainScreenTest_testEmptyNotepadList.png create mode 100644 app/src/androidTest/AndroidManifest.xml delete mode 100644 app/src/androidTest/java/com/dvinc/notepad/ExampleInstrumentedTest.kt create mode 100644 app/src/androidTest/java/com/dvinc/notepad/MainScreenTest.kt create mode 100644 app/src/androidTest/java/com/dvinc/notepad/ScreenshotTestRunner.kt diff --git a/app/build.gradle b/app/build.gradle index ba195fa..f71ac82 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,7 +18,9 @@ android { targetSdkVersion versions.targetSdk versionCode versions.code versionName versions.name - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + testInstrumentationRunner "com.dvinc.notepad.ScreenshotTestRunner" + vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/app/screenshots/com.dvinc.notepad.MainScreenTest_testEmptyNoteFragment.png b/app/screenshots/com.dvinc.notepad.MainScreenTest_testEmptyNoteFragment.png new file mode 100644 index 0000000000000000000000000000000000000000..b8362bc3a6bdc42ed525ab885dfcf099aad876cc GIT binary patch literal 25415 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 + + + + + diff --git a/app/src/androidTest/java/com/dvinc/notepad/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/dvinc/notepad/ExampleInstrumentedTest.kt deleted file mode 100644 index 291cb15..0000000 --- a/app/src/androidTest/java/com/dvinc/notepad/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.dvinc.notepad - -import androidx.test.InstrumentationRegistry -import androidx.test.runner.AndroidJUnit4 -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getTargetContext() - assertEquals("com.dvinc.notepad", appContext.packageName) - } -} diff --git a/app/src/androidTest/java/com/dvinc/notepad/MainScreenTest.kt b/app/src/androidTest/java/com/dvinc/notepad/MainScreenTest.kt new file mode 100644 index 0000000..083fc19 --- /dev/null +++ b/app/src/androidTest/java/com/dvinc/notepad/MainScreenTest.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 by Denis Verentsov (decsent@yandex.ru) + * All rights reserved. + */ + +package com.dvinc.notepad + +import android.content.Context +import android.util.DisplayMetrics +import android.view.ContextThemeWrapper +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import androidx.test.rule.ActivityTestRule +import com.dvinc.notepad.presentation.ui.main.MainActivity +import com.facebook.testing.screenshot.Screenshot +import com.facebook.testing.screenshot.ViewHelpers +import org.junit.Rule +import org.junit.Test + +class MainScreenTest { + + @get:Rule + var activityTestRule = ActivityTestRule(MainActivity::class.java, false, false) + + private val context = getInstrumentation().targetContext + + private val contextWrapper = ContextThemeWrapper(context, R.style.AppTheme) + + private val inflater = LayoutInflater.from(contextWrapper) + + @Test + fun testEmptyNotepadList() { + val activity = activityTestRule.launchActivity(null) + + Screenshot + .snapActivity(activity) + .record() + } + + @Test + fun testEmptyNoteFragment() { + val noteFragment = inflater.inflate(R.layout.fragment_note, null, false) + + compareScreenshot(noteFragment) + } + + private fun compareScreenshot(view: View) { + val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager + val metrics = DisplayMetrics() + windowManager.defaultDisplay.getMetrics(metrics) + ViewHelpers.setupView(view) + .setExactHeightPx(metrics.heightPixels) + .setExactWidthPx(metrics.widthPixels) + .layout() + + Screenshot + .snap(view) + .record() + } +} diff --git a/app/src/androidTest/java/com/dvinc/notepad/ScreenshotTestRunner.kt b/app/src/androidTest/java/com/dvinc/notepad/ScreenshotTestRunner.kt new file mode 100644 index 0000000..8eaa5d3 --- /dev/null +++ b/app/src/androidTest/java/com/dvinc/notepad/ScreenshotTestRunner.kt @@ -0,0 +1,18 @@ +package com.dvinc.notepad + +import android.os.Bundle +import androidx.test.runner.AndroidJUnitRunner +import com.facebook.testing.screenshot.ScreenshotRunner + +class ScreenshotTestRunner : AndroidJUnitRunner() { + + override fun onCreate(arguments: Bundle) { + ScreenshotRunner.onCreate(this, arguments) + super.onCreate(arguments) + } + + override fun finish(resultCode: Int, results: Bundle) { + ScreenshotRunner.onDestroy() + super.finish(resultCode, results) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8df7282..089cfe7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ + package="com.dvinc.notepad" + android:sharedUserId="com.dvinc.notepad.uid"> +