Как да тествате две дейности с Robotium

Тествам приложението си за Android с Robotium и се сблъсквам с един периодичен проблем. Моето приложение започва с SigninActivity, което позволява на потребителя да влезе и след това той се насочва към втората дейност, която има списък, който се попълва след заявка към уеб сървър.

Първият въпрос е: тъй като всички мои дейности могат да бъдат достъпни само след като потребителят е влязъл, трябва да стартирам всеки тест за всяка дейност от екрана за вход. Така че това, което правя, е за всеки клас за тестове за активност, от който го наследявам

ActivityInstrumentationTestCase2<SigninActivity>

и в метода за настройка влизам като потребител. Това ли е правилният подход?

Втори въпрос: Искам да тествам данните от списъка във втората дейност, която се попълва след заявка към уеб сървъра. Както бе споменато по-горе, в моя метод за настройка влизам като потребител и използвам

solo.waitForActivity(SecondActivity.class, BIG_TIMEOUT)
solo.waitForView(ListView.class)

за да се гарантира, че втората дейност и списъкът са налице. Проблемът е, че дори и с тази проверка често получавам

junit.framework.AssertionFailedError: Can not click on line number 2 as there are only 0 lines available

person Raphael Oliveira    schedule 15.04.2013    source източник


Отговори (2)


Успях да тествам множество дейности в моето приложение, като използвах следния подход:

  1. започнете първата дейност
  2. направете нещо в дейността (напр. щракнете върху бутон, който стартира нова дейност)
  3. изчакайте втората дейност.
  4. направете нещо във втората дейност (напр. въведете въведен текст и след това щракнете върху друг бутон)
  5. и т.н.

примерен код: public void testDisplayBlackBox() {

    //Click on add ident button
    solo.clickOnButton("Tap to get another number");
    if (solo.waitForActivity(IdentityTemplateActivity.class)) {
        // select ident type
        solo.clickOnImageButton(0);

        // add name/label and create ident
        if (solo.waitForActivity(NumberDetailActivity.class)) {
            solo.enterText(0, "Robotium");
            solo.enterText(1, "test 1");    
            solo.clickOnImageButton(6);
        }
    }
person droideckar    schedule 18.07.2013

Първо, писането на логически код в метода setUp не е добра идея. Бих ви препоръчал да използвате факта, че тестовите случаи се изпълняват по азбучен ред - създайте един тестов метод с влизане и след това влизате в приложението си в останалите от тях (ако този случай се изпълнява първи), така че да не трябва да влезете преди всеки тестов метод.

Относно втория ви въпрос, solo.waitForView(ListView.class) чака определено време (не помня какво е по подразбиране), но вие не го твърдите. По-скоро трябва да използвате:

assertTrue(solo.waitForView(ListView.class));

Въпреки това изглежда е проблем с ListView. Уверете се, че имате само един списък на екрана, в противен случай трябва да използвате индекс на това:

solo.clickInList(int line, int index)
person maszter    schedule 15.04.2013
comment
Е, що се отнася до мен, тестовете трябва да са независими един от друг, така че използването на факта, че се изпълняват в някакъв ред, е лоша миризма за мен. - person Raphael Oliveira; 16.04.2013
comment
В противен случай трябва да влезете преди всеки тест и да излезете след него. Друг вариант е да проверявате преди всеки тест и да го правите, ако не сте. - person maszter; 16.04.2013