t.me/atinfo_chat Telegram группа по автоматизации тестирования

Robotium и Black Box


(Vitalii) #1

Коллеги, возникла проблема при запуске тестов с помощью Роботиума и apk файла. При вызове каждого тест-метода приложение запускается заново. Например, мне надо залогиниться и вторым тест-методом выполнить действия. При вызове второго метода приложение перезапустится и предыдущий логин конечно же уйдет в небытие.

Код:

package com.example.android.test;

import com.jayway.android.robotium.solo.Solo;

import android.test.ActivityInstrumentationTestCase2;
import android.test.SingleLaunchActivityTestCase;

@SuppressWarnings(“unchecked”)
public class start extends ActivityInstrumentationTestCase2 {

    private static final String TARGET_PACKAGE_ID = "com.main.activities";
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.main.activities.InitActivity";

    private static Class<?> launcherActivityClass;
    static{
            try {
                    launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
            } catch (ClassNotFoundException e) {
                    throw new RuntimeException(e);
            }
    }
    
    @SuppressWarnings("unchecked")
    public start() throws ClassNotFoundException {
            super(TARGET_PACKAGE_ID, launcherActivityClass);
    }
    
    private Solo solo;
    
    @Override
    protected void setUp() throws Exception {
            solo = new Solo(getInstrumentation(), getActivity());
    }
    

   private String logpass="user1";

/////////////////////////////////////////////////////////////////////////////////

  // Open Start and try with right pass 
  	public void testA() {
 		solo.waitForText("START");
	solo.clickOnText("START");
	solo.waitForText("Enter user name and password");
	solo.clearEditText(0);
	solo.enterText(0, logpass);
	solo.clickOnEditText(1);
	solo.enterText(1, logpass);
	solo.clickOnText("Show password");
	solo.clickOnButton("OK");
 	}
    
  	public void testB() {
  		solo.waitForText("HOME");
  		assertTrue(solo.searchText("CHAT"));
  		solo.clickOnText("CHAT");
  	}

@Override
public void tearDown() {
solo.finishOpenedActivities();

}

}


(d3unka) #2

Никогда над этим не задумывался. Обычно каждый тест должен быть максимально независимым от работы предыдущего. Поколдовал немного, но решения так и не нашел. Добился того, чтобы приложение не закрывалось после выполнения первого теста, но второй тест не может запуститься так как обьект solo становится null. А определяя его мы получаем ошибку, так как находимся уже не на Init экране. Я пообщаюсь с разработчиками на эту тему, и сам еще покопаюсь. А вы пока сделайте тесты максимально независимыми друг от друга. Рефакторинг, DSL и ScreenObject вам в помощь. Скоро будет статья на портале об этом.


(Vitalii) #3

Спасибо. Я начинающий в автоматическом тестировании, поэтому возможно и не правильно начал строить логику.

Но если каждый тест будет начинаться с ввода логина, это ведь существенно увеличит время прохождения тестов.

Буду пробовать


(d3unka) #4

Да, на скорость влияет. Я как найду решение вопроса - сообщу. Посмотрите видео и примеры кода с конференций, которыми я делился. Поможет построить объектную модель, чтобы проще было писать тесты


(Taras) #5

У меня есть apk файл. Я его поставил на планшет (не рутнутый). Еклипс , сдк и все другие детали под автомейшн на роботиуме я настроил. 

Как создать правильно проэкт что б я смог тестировать этот мой апк файл на своем планшете а не на емуляторе ? 

Сначала как то нужно указать етот апк файл, потом делать тест проект или как ?

Я нашел Ваш пример с тестированием Нотпада на емуляторе, но у меня после run as Android JUnit запускаеться емулятор и в logcat выдает ошибку, типа class com.jayway тра тра solo couldn't be found

Кароче удалил все проекти в еклипси, хочу с нуля разобраться как свои апликухи тестировать. А еще доступа к сорсам апк-а файла нету, он просто установлен на планшете, и я знаю имя пакета его.

 

Помогите))


(d3unka) #6

Решением запуска тестов может быть наследование от SingelaunchActivityTestCase, я сегодня провестирую это и скажу. 

 

Я нашел Ваш пример с тестированием Нотпада на емуляторе, но у меня после run as Android JUnit запускаеться емулятор и в logcat выдает ошибку, типа class com.jayway тра тра solo couldn't be found

Конечно, потому что девайс у Вас не подключен или не включен дебаг режим. А путь к библиотеке Robotium зашит мой, вам нужно свой подставить в Build Settings.

(Taras) #7

Смотрите, у вас написано "Указываем имя и выбираем Create project from existing sample"... "Выбираем API, например 7. На следующем окне выбираем приложение NotePad и нажимаем Finish.", а мне нужно вытащить с планшета саму программу, и когда я выбираю этот пункт который Вы написали, у меня появляеться список версий Андроид емуляторов я так понял, я выбираю тот же который и мой планште АРІ 12 и там список прог самого емулятора по ходу, а как подтянуть с Планшета подключенного через кабель (деббагинг мод включен) ???? Как быть в етом случае, не подскажете ?


(Taras) #8

С запуском приложений на планшете все разобрался, все ок работает. Но как именно писать тесты под apk приложение которое установленное уже в планшете ...


(d3unka) #9

Если приложение уже установленно то нету доступов к ресурсам. Потому придется нажимать на кнопки по номеру в массиве или по тексту на них.


(Taras) #10

разобрался, в помощь пришла тулза testdroid которая рекорд - плейбек мной не любимий, но она мне показала как тестировать нативние апк-шки )


(Vitalii) #11

В тестируемом приложении есть вызов стандартной камеры. К сожалению роботиум не позволит сделать снимок камерой. Как быть в этом случае? Или какой другой инструмент использовать?


(d3unka) #12

Да, сам роботиум этого не позволит сделать, разве что не будет кастомной кнопки Take Picture. Нужно пробовать через Android API . Тема обсуждалась здесь http://stackoverflow.com/questions/3840034/how-do-i-write-a-solo-robotium-testcase-that-uses-the-builtin-camera-to-take-a-p  . На моей практике мы работали только с QR Code, со снятием фото, пока не доводилось. Но интересный вопрос, нужно будет посмотреть


(d3unka) #13

Реально ли добавить кнопку "сделать фото" на скрин? Роботим сможет нажать на нее. Если кнопка какая-то кастомная, то нужно делать вызов API по снятию фото. Готовых примеров у меня нет, но в теории это возможно