Android 仪器测试断言 activity 是否启动
Android Instrumented testing asserting if an activity is started
我正在使用 Kotlin 编程语言开发 Android 应用程序。我正在将仪器测试添加到我的应用程序中。现在我正在尝试测试 activity 是否在延迟一段时间后启动。
这是我的 activity 代码。
class MainActivity : AppCompatActivity() {
companion object {
val LAUNCH_DELAY: Long = 2000
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Handler().postDelayed({
this.startLoginActivity()
}, LAUNCH_DELAY)
}
protected fun startLoginActivity()
{
startActivity(Intent(this, LoginActivity::class.java))
}
}
我知道如何编写这样一个简单的测试
@Test
fun itRendersCompanyName() {
onView(withId(R.id.main_tv_company_name)).check(matches(withText("App Name")))
}
但我在这里要测试的是 LoginActivity 是否在延迟一段时间后启动。我如何使用 Espresso 框架来实现?
您可以使用 Intents.intended()。
将以下内容添加到您的 build.gradle 文件中:
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
在你的测试函数中,你可以试试下面的代码:
Intents.init()
Intents.intended(hasComponent(LoginActivity::class.java!!.getName()))
您可以阅读有关 Espresso-Intents 的更多信息here。
最好用单元测试来测试这种状态。使用架构模式(例如 MVP/MVVM),模拟 presenter/view 模型并检查负责 activity 启动的方法被触发
您可以使用 ActivityManager
:
获得可见的 Activity
inline fun <reified T : Activity> isVisible(): Boolean {
val am = ApplicationProvider.getApplicationContext<Context>().getSystemService(ACTIVITY_SERVICE)
as ActivityManager
val visibleActivityName = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
am.appTasks[0].taskInfo.topActivity.className
} else {
am.getRunningTasks(1)[0].topActivity.className
}
return visibleActivityName == T::class.java.name
}
调用isVisible<LoginActivity>()
会告诉你LoginActivity
是否可见。
此外,要等到 LoginActivity
可见,您可以等待此方法获取 true
。例如:
inline fun <reified T : Activity> waitUntilActivityVisible() {
val startTime = System.currentTimeMillis()
while (!isVisible<T>()) {
Thread.sleep(200)
if (System.currentTimeMillis() - startTime >= TIMEOUT) {
throw AssertionError("Condition unsatisfied after $TIMEOUT milliseconds")
}
}
}
我正在使用 Kotlin 编程语言开发 Android 应用程序。我正在将仪器测试添加到我的应用程序中。现在我正在尝试测试 activity 是否在延迟一段时间后启动。
这是我的 activity 代码。
class MainActivity : AppCompatActivity() {
companion object {
val LAUNCH_DELAY: Long = 2000
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Handler().postDelayed({
this.startLoginActivity()
}, LAUNCH_DELAY)
}
protected fun startLoginActivity()
{
startActivity(Intent(this, LoginActivity::class.java))
}
}
我知道如何编写这样一个简单的测试
@Test
fun itRendersCompanyName() {
onView(withId(R.id.main_tv_company_name)).check(matches(withText("App Name")))
}
但我在这里要测试的是 LoginActivity 是否在延迟一段时间后启动。我如何使用 Espresso 框架来实现?
您可以使用 Intents.intended()。
将以下内容添加到您的 build.gradle 文件中:
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.0'
在你的测试函数中,你可以试试下面的代码:
Intents.init()
Intents.intended(hasComponent(LoginActivity::class.java!!.getName()))
您可以阅读有关 Espresso-Intents 的更多信息here。
最好用单元测试来测试这种状态。使用架构模式(例如 MVP/MVVM),模拟 presenter/view 模型并检查负责 activity 启动的方法被触发
您可以使用 ActivityManager
:
inline fun <reified T : Activity> isVisible(): Boolean {
val am = ApplicationProvider.getApplicationContext<Context>().getSystemService(ACTIVITY_SERVICE)
as ActivityManager
val visibleActivityName = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
am.appTasks[0].taskInfo.topActivity.className
} else {
am.getRunningTasks(1)[0].topActivity.className
}
return visibleActivityName == T::class.java.name
}
调用isVisible<LoginActivity>()
会告诉你LoginActivity
是否可见。
此外,要等到 LoginActivity
可见,您可以等待此方法获取 true
。例如:
inline fun <reified T : Activity> waitUntilActivityVisible() {
val startTime = System.currentTimeMillis()
while (!isVisible<T>()) {
Thread.sleep(200)
if (System.currentTimeMillis() - startTime >= TIMEOUT) {
throw AssertionError("Condition unsatisfied after $TIMEOUT milliseconds")
}
}
}