为什么Robotium在执行简单的UI任务时比Android本机代码慢?

为什么Robotium在执行简单的UI任务时比Android本机代码慢?,android,unit-testing,robotium,Android,Unit Testing,Robotium,我正在使用它在我的单元测试项目中执行一些简单的UI任务。我注意到索洛的速度明显慢了,我不知道为什么。我是新手 此代码由Robotium完成: solo.clearEditText(editTextLogin); solo.clearEditText(editTextSenha); solo.enterText(editTextLogin, "tecnico@mail.com"); solo.enterText(editTextSenha, "12345");

我正在使用它在我的单元测试项目中执行一些简单的UI任务。我注意到索洛的速度明显慢了,我不知道为什么。我是新手

此代码由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,它应该是什么样的,真正的性能增益是如何实现的


我为所有错误向您道歉。

您应该下载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);
    }
}
public void clickOn(类viewClass,字符串nameRegex){
最终模式=Pattern.compile(nameRegex);
waitForText(nameRegex,0,TIMEOUT,true,true);
ArrayList视图=viewFetcher.getCurrentViews(viewClass);
视图=机器人用户。移除可视视图(视图);
T viewToClick=null;
对于(T视图:视图){
if(pattern.matcher(view.getText().toString()).matches()){
viewToClick=视图;
if(viewToClick.isShown())
打破
}
}
if(viewToClick!=null){
单击屏幕上的(视图单击);
}else if(scroller.scroll(scroller.DOWN)){
单击(viewClass,nameRegex);
}否则{
对于(T视图:视图){
d(未找到Log_标记,nameRegex+)。已找到:“+view.getText()”;
}
Assert.assertTrue(viewClass.getSimpleName()+,文本为:“+nameRegex+”未找到!”,false);
}
}

这引起了我的注意,您非常担心测试性能

Android用户界面测试方法相当复杂,给你留下了一个难以理解的测试用例。Robotium的重点不是性能,而是让开发人员能够访问API,使他们的测试更易于编写和读取

我不会试图确定做测试最有效的方法是什么。我会在Robotium中完成这项工作,因为编写代码和在必要时移植到本机更容易

就我个人而言,我不在乎Robotium让我的测试变慢。如果这是我为了避免使用本机UI测试工具而必须付出的代价,我对此很满意


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

根据我的使用经验,尝试使用不同的方法
solo.clickOnButton(“字符串”)
solo.clickOnButton(索引)
也有很大不同。
因为第一个似乎做了很多搜索。

感谢pyoussef的评论!事实上,机器人在幕后做得更多。我曾经下载过源代码。到目前为止,我的测试不会花那么多时间,但这是我长期以来一直担心的问题。这是因为我仍然热衷于Android测试的babysteps,因此我正在研究最适合我们需求的可用框架,以方便性/性能评级。我的第一印象是Robotium的一个建议是让它更快,所以我想我错过了一些东西。事实上,在进行某些类型的测试时,Robotium非常适合我的需要,留下了UI测试API的一些模糊之处。谢谢您的输入,我会将您的答案标记为正确。@Marcase。仅在CI中运行它不是一个好建议。测试失败应尽可能早地在开发周期中检测到。它应该在合并代码之前运行。您的java代码不是本机代码!