与Android本机代码相比,为什么Robotium执行简单的UI任务时速度较慢?

时间:2011-08-15 18:54:18

标签: android unit-testing robotium

我正在使用Robotium在我的单元测试项目上执行一些简单的UI任务。我注意到Solo明显变慢了,我不知道为什么。我是新手。

此代码使用Robotium完成:

    solo.clearEditText(editTextLogin);
    solo.clearEditText(editTextSenha);
    solo.enterText(editTextLogin, "tecnico@mail.com");
    solo.enterText(editTextSenha, "12345");
    solo.clickOnButton(0);

使用本机代码完成:

m_Activity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            editTextLogin.setText("tecnico@mail.com");
            editTextSenha.setText("12345");
            loginButton.performClick();
        }
    });

与第二个相比,使用Robotium执行的代码要慢得多。我可以很容易地发现Robotium实际上是机械地完成所有的东西,而本机代码只是设置对象的值,这可以解释差异,但我最好的解释是,何时使用Robotium,它应该是什么样的,可以实现真正的性能提升的方式。

我为任何错误道歉。

3 个答案:

答案 0 :(得分:3)

您应该下载robotium的源代码并通过它进行调试。你会发现在幕后还有很多事情要发生。例如,这里有一个clickonbutton的小片段:

public <T extends TextView> void clickOn(Class<T> viewClass, String nameRegex) {
    final Pattern pattern = Pattern.compile(nameRegex);
    waiter.waitForText(nameRegex, 0, TIMEOUT, true, true);
    ArrayList<T> views = viewFetcher.getCurrentViews(viewClass);
    views = RobotiumUtils.removeInvisibleViews(views);
    T viewToClick = null;
    for(T view : views){
        if(pattern.matcher(view.getText().toString()).matches()){
            viewToClick = view;
            if(viewToClick.isShown())
                break;
        }
    }
    if (viewToClick != null) {
        clickOnScreen(viewToClick);
    } else if (scroller.scroll(Scroller.DOWN)){
        clickOn(viewClass, nameRegex);
    }else {
        for (T view : views) {
            Log.d(LOG_TAG, nameRegex + " not found. Have found: " + view.getText());
        }
        Assert.assertTrue(viewClass.getSimpleName() + " with the text: " + nameRegex + " is not found!", false);
    }
}

答案 1 :(得分:0)

它引起了我的注意,你非常担心测试性能。

Android UI测试方法非常复杂,并且为您提供了难以理解的测试用例。 Robotium并不专注于性能,它专注于使开发人员可以访问API,使他们的测试更容易编写和阅读。

我不会尝试确定哪种方法最适合进行测试。我会在Robotium中做到这一点,因为它更容易编码,然后在必要时移植到本机。

在我个人的情况下,我不关心Robotium使我的测试变慢。如果这是我为避免使用本机UI测试工具而必须付出的代价,我对此感到很满意。

如果测试花费的时间过长,您可以随时在CI中运行。

答案 2 :(得分:0)

尝试使用不同的方法作为我的使用经验 solo.clickOnButton("String")solo.clickOnButton(index)也有很大不同。 因为第一个似乎做了很多搜索。