Почему Robotium медленнее выполняет простые задачи пользовательского интерфейса по сравнению с собственным кодом Android? - PullRequest
4 голосов
/ 15 августа 2011

Я использую Robotium для выполнения некоторых простых задач пользовательского интерфейса в моем проекте модульного тестирования. Я заметил, что Соло значительно медленнее, я не знаю почему. Я новичок в этом.

Этот код сделан с 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 ]

3 голосов
/ 17 августа 2011

Вам следует скачать исходный код robotium и отладить его.Вы увидите, что под капотом происходит намного больше.Например, вот небольшой фрагмент для кнопки clickon:

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);
    }
}
0 голосов
/ 21 ноября 2011

Попробуйте другим методом, так как мой опыт использования solo.clickOnButton("String") и solo.clickOnButton(index) также сильно отличается.как первый, кажется, делает много поиска.

0 голосов
/ 27 августа 2011

Привлекает мое внимание, вы так беспокоитесь о производительности тестирования.

Методы тестирования пользовательского интерфейса Android довольно сложны и оставляют вам тестовый пример, за которым трудно следовать.Robotium не нацелен на производительность, он нацелен на то, чтобы сделать API доступными для разработчиков, чтобы облегчить их тестирование при написании и чтении.

Я бы не пытался определить, какой самый эффективный способ сделать тест.Я бы сделал это в Robotium, так как при необходимости проще кодировать, а затем портировать на native.

В моем личном случае мне все равно, Robotium замедляет мои тесты.Если это цена, которую я должен заплатить, чтобы избежать использования встроенного инструмента тестирования пользовательского интерфейса, я в этом не сомневаюсь.

Если тестирование занимает слишком много времени, вы всегда можете запустить его в своем CI.

...