TP-12345 | Macrobenchmarking for app startup and homepage scroll [CICD] (#11461)

Co-authored-by: Ujjwal Kumar <ujjwal.kumar@navi.com>
Co-authored-by: Anupam Kumar <anupam.kumar@navi.com>
Co-authored-by: Shivam Goyal <shivam.goyal@navi.com>
This commit is contained in:
nikhil kumar
2024-07-24 14:05:38 +05:30
committed by GitHub
parent f03d630a00
commit 40bdcee97a
8 changed files with 176 additions and 90 deletions

View File

@@ -10,13 +10,17 @@ package com.naviapp.benchmark.baselineprofile
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.naviapp.benchmark.utils.PACKAGE_NAME
import com.naviapp.benchmark.utils.performLogin
import com.naviapp.benchmark.utils.scrollHomePage
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
import com.naviapp.benchmark.utils.waitForHomePage
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class HomePageScrollBaselineProfile {
@RequiresApi(Build.VERSION_CODES.P) @get:Rule val baselineProfileRule = BaselineProfileRule()
@@ -24,7 +28,8 @@ class HomePageScrollBaselineProfile {
@Test
fun generate() =
baselineProfileRule.collect(PACKAGE_NAME) {
startActivityAndAllowNotifications()
startActivityAndAllowPermissions()
performLogin()
waitForHomePage()
scrollHomePage()
}

View File

@@ -15,7 +15,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.naviapp.benchmark.utils.PACKAGE_NAME
import com.naviapp.benchmark.utils.performLogin
import com.naviapp.benchmark.utils.scrollHomePage
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
import com.naviapp.benchmark.utils.waitForHomePage
import org.junit.Rule
import org.junit.Test
@@ -35,12 +35,12 @@ class HomePageScrollBenchmark {
benchmarkRule.measureRepeated(
packageName = PACKAGE_NAME,
metrics = listOf(FrameTimingMetric()),
iterations = 10,
iterations = 3,
startupMode = StartupMode.WARM,
compilationMode = compilationMode,
setupBlock = {
pressHome()
startActivityAndAllowNotifications()
startActivityAndAllowPermissions()
}
) {
performLogin()

View File

@@ -7,7 +7,6 @@
package com.naviapp.benchmark.startup
import androidx.benchmark.macro.BaselineProfileMode.Disable
import androidx.benchmark.macro.BaselineProfileMode.Require
import androidx.benchmark.macro.CompilationMode
import androidx.benchmark.macro.StartupMode
@@ -16,7 +15,7 @@ import androidx.benchmark.macro.junit4.MacrobenchmarkRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.naviapp.benchmark.utils.PACKAGE_NAME
import com.naviapp.benchmark.utils.performLogin
import com.naviapp.benchmark.utils.startActivityAndAllowNotifications
import com.naviapp.benchmark.utils.startActivityAndAllowPermissions
import com.naviapp.benchmark.utils.waitForHomePageLoad
import org.junit.Rule
import org.junit.Test
@@ -28,28 +27,20 @@ class StartupBenchmark {
@Test fun startupWithoutPreCompilation() = startup(CompilationMode.None())
@Test
fun startupWithPartialCompilationAndDisabledBaselineProfile() =
startup(
CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1),
)
@Test
fun startupPrecompiledWithBaselineProfile() =
startup(CompilationMode.Partial(baselineProfileMode = Require))
@Test fun startupFullyPrecompiled() = startup(CompilationMode.Full())
private fun startup(compilationMode: CompilationMode) =
benchmarkRule.measureRepeated(
packageName = PACKAGE_NAME,
metrics = listOf(StartupTimingMetric()),
compilationMode = compilationMode,
iterations = 5,
iterations = 3,
startupMode = StartupMode.COLD,
setupBlock = { pressHome() },
) {
startActivityAndAllowNotifications()
startActivityAndAllowPermissions()
performLogin()
waitForHomePageLoad()
}

View File

@@ -7,19 +7,19 @@
package com.naviapp.benchmark.utils
import android.Manifest.permission
import android.Manifest
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES.TIRAMISU
import androidx.benchmark.macro.MacrobenchmarkScope
fun MacrobenchmarkScope.allowNotifications() {
if (SDK_INT >= TIRAMISU) {
val command = "pm grant $packageName ${permission.POST_NOTIFICATIONS}"
device.executeShellCommand(command)
}
fun MacrobenchmarkScope.allowPermission(permission: String) {
val command = "pm grant $packageName $permission"
device.executeShellCommand(command)
}
fun MacrobenchmarkScope.startActivityAndAllowNotifications() {
fun MacrobenchmarkScope.startActivityAndAllowPermissions() {
startActivityAndWait()
allowNotifications()
if (SDK_INT >= TIRAMISU) {
allowPermission(Manifest.permission.POST_NOTIFICATIONS)
}
}

View File

@@ -15,7 +15,19 @@ import androidx.test.uiautomator.Until
import java.util.concurrent.TimeUnit
fun MacrobenchmarkScope.waitForHomePage() {
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(5))
val okButton = By.text("OK")
val dialog = device.wait(Until.findObject(okButton), TimeUnit.SECONDS.toMillis(20))
dialog?.let {
it.click()
device.wait(Until.gone(okButton), TimeUnit.SECONDS.toMillis(5))
}
// Sometime location popup coming two times so adding one more check
val dialog2 = device.wait(Until.findObject(okButton), TimeUnit.SECONDS.toMillis(20))
dialog2?.let {
it.click()
device.wait(Until.gone(okButton), TimeUnit.SECONDS.toMillis(5))
}
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(10))
}
fun MacrobenchmarkScope.performLogin() {
@@ -53,7 +65,7 @@ fun MacrobenchmarkScope.scrollHomePage() {
}
fun MacrobenchmarkScope.waitForHomePageLoad() {
device.wait(Until.hasObject(By.clazz(HOME_PAGE_CLASS_NAME)), TimeUnit.SECONDS.toMillis(10))
waitForHomePage()
val list =
device.waitAndFindObject(By.res("homeScreenWidgetsList"), TimeUnit.SECONDS.toMillis(10))
list.wait(untilHasChildren(), 5000)