【问题标题】:Activity doesn't restart in different tests with Robotium活动不会在使用 Robotium 的不同测试中重新启动
【发布时间】:2013-01-30 16:03:37
【问题描述】:

我正在使用 Robotium 测试我的应用登录,但遇到了一些问题。我有两种不同的用户类型,所以我做了 3 次测试。每种类型一个,另一个登录失败。如果我单独执行它们,它们都会成功,但是如果我运行所有测试用例,它会运行一个,执行 tearDown(solo.finishOpenedActivities) 并且它不会重新启动活动以执行其他测试。所以在第二个测试中,当我要求 EditText 时,它说它不可用。

这是我的代码:

public class TestLogin extends ActivityInstrumentationTestCase2<MainActivity> {

private Solo solo;

public TestLogin() {
    super("com.truekke4.test", MainActivity.class);
}

@Override
protected void setUp() throws Exception {
    solo = new Solo(getInstrumentation(), getActivity());
    super.setUp();
}

@Override
public void tearDown() throws Exception {
    getActivity().logout();
    solo.finishOpenedActivities();
    super.tearDown();
}

public void testUsuarioDesconocido() {
    solo.clearEditText(0);
    solo.enterText(0, "usuario desconocido");
    solo.assertCurrentActivity("Error", MainActivity.class);
    solo.clickOnButton("OK");
    solo.clickOnButton("OK");
    solo.assertCurrentActivity("Error", MainActivity.class);
}

public void testUsuario() {
    solo.clearEditText(0);
    solo.enterText(0, "usuario");
    solo.clickOnButton("OK");
    solo.assertCurrentActivity("Error", InicioUsuarioActivity.class);
}

public void testEmpresa() {
    solo.clearEditText(0);
    solo.enterText(0, "empresa");
    solo.clickOnButton("OK");
    solo.assertCurrentActivity("Error", InicioPymeActivity.class);
}

}

我必须手动重新启动活动? Create and Intent 和 startActivity(intent)?

我不必完成已打开的活动?或者我必须完成活动,但在 setUp() 中重新启动它们/它。如何重新启动或创建活动以使 Robotium 可识别?

救命!

【问题讨论】:

  • 我认为你应该在你测试的方法中注销,否则它可以在每个下一个方法中登录。 (如果您登录某个应用程序并关闭它,它不会退出 - 这是相同的情况)

标签: android robotium


【解决方案1】:

我相信您的问题是由于您从 ActivityInstrumentationTestCase2 覆盖 setUp() 方法而不是使用 Robotium 方法引起的。在您的测试类中,Robotium 会查找带有签名 public void setUp() 的方法来配置其测试,这可能会让人感到困惑,因为它与可以被覆盖的方法具有相同的名称。我不确定何时或多久调用一次受保护的 setUp,但我知道公共的 setUp 是初始化独奏的最佳场所,因为 Robotium 保证在每次单独测试之前都会调用它。尝试改变:

@Override
protected void setUp() throws Exception

到:

public void setUp() throws Exception

使用相同的方法主体(但没有 @Override 注释),看看是否允许您运行所有测试。

【讨论】:

  • 谢谢马特,这就是问题所在!
  • 我假设是从受保护到公开的更改解决了这个问题。该方法可能需要公开才能由测试运行程序调用。更改注释不可能是原因(...对吗?)
【解决方案2】:

你有代码的地方:

@Override
protected void setUp() throws Exception {
    solo = new Solo(getInstrumentation(), getActivity());
    super.setUp();
}

制作:

@Override
protected void setUp() throws Exception {
    super.setUp();
    solo = new Solo(getInstrumentation(), getActivity());
}

如果由于某种原因这不起作用,您的类在拆解中没有被正确清理,您可以调用 setActivity(null) 以使 getActicity() 再次启动 Activity,或者自己手动调用 launchActivity。

【讨论】:

  • 谢谢你,保罗,但你的任何建议都没有奏效。我试过改变超级调用的顺序,但效果更糟,tearDown 失败了。我试过 setActivity(null), setActivity()... 什么都没有。我想如果我做 solo.finishOpenedActivities() 我正在完成测试活动,它会给我一个错误。但是,我该怎么做才能回到最初的活动?重新启动 Activity 的状态以模拟第一次进入。
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2012-05-26
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多