- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Kotlin 开发 Android 应用。我正在我的项目中添加仪器测试。现在,我正在努力测试在启动另一个 Activity 后是否未打开一个 Activity 。这是我的场景。
我有启动 LoginActivity 的 MainActivity。
这是MainActivity的代码
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()
finish() //please, pay attention here
}, LAUNCH_DELAY)
}
protected fun startLoginActivity()
{
startActivity(Intent(this, LoginActivity::class.java))
}
}
正如您在上面的代码中看到的,我在启动 LoginActivity 后调用 finish() 方法来终止 Activity 。我想测试是否在主 Activity 启动的登录 Activity 中按下后退按钮,应用程序关闭并且不会返回到主 Activity 。
这是我的测试课
@RunWith(AndroidJUnit4::class)
class MainActivityTest {
@Rule @JvmField
val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)
@Rule @JvmField
val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)
@Before
fun setUp() {
}
@Test
fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
{
Intents.init()
Thread.sleep(MainActivity.LAUNCH_DELAY);
Intents.release()
pressBack()
//here how can I assert if the main activity is not open.
}
}
请注意代码中的注释。我想断言主 Activity 是否未打开,或者当在登录 Activity 中按下后退按钮时它不会返回主 Activity 。我该如何测试它?
最佳答案
由于您想要测试与您的应用程序的高级交互,您应该使用 UI Automator test framework .
首先将库添加到build.gradle
:
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}
然后像这样写一个测试:
@RunWith(AndroidJUnit4::class)
class MainActivityTest {
@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)
@Test
fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
{
// mainActivityRule makes sure MainActivity is launched, so we just need to wait
// for MainActivity to launch LoginActivity
Thread.sleep(MainActivity.LAUNCH_DELAY)
// Wait some more since the system is not instantaneous
Thread.sleep(1000)
// Now LoginActivity should be showing. Press the back button
val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
uiDevice.pressBack()
// Wait some more still since the system is not instantaneous
Thread.sleep(1000)
// Make sure that we have left our app, i.e. pressing back have closed our app
// BuildConfig.APPLICATION_ID is the package name of our app
// So if the currently active package (app) is NOT our own app, it means
// our own app was closed, which is what we want to test.
assertNotEquals(uiDevice.currentPackageName, BuildConfig.APPLICATION_ID)
}
}
注意你不应该有这个:
@Rule @JvmField
val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)
因为这将在测试开始时启动 LoginActivity
。你不想要那个。您希望 MainActivity
启动 LoginActivity
。另请注意,您可以简化
@Rule @JvmField
val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)
到
@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)
你不需要任何东西
@Before
fun setUp() {
}
因为它是空的,什么也不做。
关于Android Kotlin 检测测试是否在调用 finish() 开始另一个 Activity 后结束/完成一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58148750/
这两者有区别吗? startActivity(intent); finish(); startActivity(intent); ThisActivityName.this.finish(); 注意:
我有一个包含大量 url 链接的 arrayOfLinks。我需要从这些链接中获取图像。我正在使用以下代码来执行此操作。 - (void)getImages { NSArray *links
我想创建一条执行以下步骤的路线 读取文件 将文件分割成行 使用 BeanIO 解码行 调用(昂贵且耗时的)处理器 我想在处理完所有线路后完成这条路线。 所以我的路线的基本布局如下所示: from("d
我正在使用 Nodejs。我有一个异步的 forEach,因为我必须在 forEach 中等待结果。结果,我需要等待 forEach 完成,然后继续处理循环的结果。我找到了几种等待 forEach 的
我正在编写需要背靠背内核调用的 android renderscript 代码(有时一个内核的输出成为另一个内核的输入)。我还有一些全局指针,绑定(bind)到 Java 层的内存。每个内核更新那些全
伪代码: void draw() { Vertex* vertices = scene.GetVertexArray(); glEnableClientState(...);
当我创建一个 Android 应用程序时,我首先在其中创建了主 Activity ,然后添加了启动 Activity 以及一个正常 Activity 。 所以我的问题是每当我在应用程序中单击退出时,它
我正在尝试将一些 API 数据获取到我的应用程序,并且我有两个 Activity 。第一个是启动屏幕(就像加载应用程序时谷歌使用的那样),我想知道在哪里调用 finish() 来结束 Activity
我使用 创建了“新文件” Activity startActivityForResult(new Intent(MainActivity.this, NewFile.class),1); NewFil
我有一个以 SingleTask 模式 (Android 2.2) 运行的 Activity ,该 Activity 从其他 Activity 或服务接收 Intent 。我的 Activity 将每
我编写了以下代码来使用 TextView 和按钮显示消息框。单击按钮时, Activity 应该完成。但这有时会起作用,但并不一致。有时它会挂起。如何让它始终如一地工作?请帮忙 public clas
我正在搜索,当 onDestroy 在 android 应用程序上执行时,我发现它是在设备资源不足(RAM、CPU) 时执行的,并且当用户调用 finish() 时。 例如,当我按下后退按钮从一个 A
我正在编写一个 Android 应用程序,它显示一个带有一些元素和一些 CRUD 操作的 RecyclerView。我想做的一件事是从我的 RecyclerView 更新现有元素,为此我打开一个新 A
被测试的 Activity 是一个简单的棋盘游戏。当满足游戏结束的必要条件时,在执行几项操作以显示谁赢了等之后,将运行以下代码: // Return to main menu after 5 seco
我有一个 Activity ,它创建了我创建的名为classA的类的新实例。在classA中,我有一个方法将对象添加到位于classA中的STATICarrayList。 所以我的 Activity
我正在使用 Facebook Android SDK,并希望在用户登录并获取用户对象后关闭我的 Activity。实际上,我存储了它的一部分,但无论如何我都想关闭该 Activity 。
我以前从事c# dotnet开发,有一个Application.exit()类型的方法,可以立即关闭应用程序并释放内存。 我发现 android 的“finish()”方法应该这样做 但它没有这样做,
我有一个 Activity ,我调用了 finish() 方法,但 Activity 没有从内存中清除。 调用 finish() 后,我看到方法 onDestroy() 已成功执行(并且我清除了其中的
我想在我的MKMapView上设置一个区域,然后找到与 map 的东北角和西南角对应的坐标。 This code works just fine to do that: //Recenter and
我正在尝试使用从顶部滑动动画将一个 View 替换为另一个 View 。我有点遵循 http://gentlebytes.com/2011/09/auto-layout-in-lion/ 中发布的指南
我是一名优秀的程序员,十分优秀!