Я новичок в тестировании и пытаюсь изучить тесты jUnit и Robotium
. Мое приложение имеет 4 экрана.
Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen.
[init()] [ check values generated by init() method]
Экран автозаполнения — это место, где пользователь что-то вводит, а приложение выполняет автозаполнение из большой базы данных продуктов. На заставке я инициализирую многие переменные приложения, используя метод init()
в другом классе. Этот метод init()
загрузит настройки пользователя, проверит создание базы данных и т. д. (база данных продукта предварительно упакована в apk, и я копирую базу данных при первом запуске и помечаю ее в SharedPreferences
как скопировано = верно).
Проблема: как изолировать тестирование экрана автозаполнения? OnCreate для AutocompleteActivity зависит от init(), вызванного в SplashScreen. Я не уверен, когда jUnit создает экземпляр Activity
(вероятно, в конструкторе?). Вот мой TestCaseCode:
import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
import com.supervalu.mobile.android.AutoCompleteActivity;
import com.supervalu.mobile.android.db.LocalDb;
public class AutocompleteTest extends
ActivityInstrumentationTestCase2<AutoCompleteActivity> {
private Solo solo;
public AutocompleteTest() {
super("com.****.*****.*****", AutoCompleteActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
LocalDb.init(getActivity().getApplicationContext());
solo = new Solo(getInstrumentation(), getActivity());
}
public void test1Character() {
solo.sleep(2000);
solo.enterText(0, "c");
solo.sleep(10000);
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
public void test3Character() {
LocalDb.init(getActivity().getApplicationContext());
solo.enterText(0, "che");
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
Тестовый пример продолжает давать сбои, потому что onCreate требует некоторых значений из LocalDb
, которые должны были быть инициализированы методом init()
.
Я не могу добавить функцию init() перед супервызовом в конструкторе. Есть ли обходной путь для этого, или мне нужно запустить тестовый пример с экрана-заставки?
Проблема 2. Если я начну тестирование с заставки, мне придется сначала перейти к экрану автозаполнения, прежде чем я смогу выполнить на нем какие-либо тесты. Предположим, я тоже это сделал, тогда для каждого теста: test1character() класс выполняет setUp(), затем тест, а затем tearDown(), затем он перезапускает всю последовательность для функции test3characters(). Становится очень больно постоянно повторять переход к экрану автозаполнения каждый раз, прежде чем на самом деле проверять входные данные. Любые предложения по этому поводу?
Я не уверен, какой подход выбрать. Может кто-нибудь, пожалуйста, направьте меня?
4 ответа
У меня была аналогичная проблема, и я смог ее исправить. В вашем методе setUp() бесполезно вызывать getActivity(). Это не влияет на ваши методы тестирования. Вы должны использовать:
getInstrumentation().getTargetContext()
Например использовать
getInstrumentation().getTargetContext().getContentResolver()
Вместо того
getActivity().getContentResolver()
Надеюсь, что это работает для вас!
Ура Антонино
Я обнаружил, что насмешливые фреймворки являются лучшей альтернативой для выполнения изолированных тестов методов действий Android. На данный момент jMockit — это единственный фреймворк, способный эффективно моделировать базовые классы Android.
Вы сможете отказаться от большого количества кода установки и демонтажа. См. тестовый пример:
Если вы выполняете модульное тестирование, вам следует расширить свой тестовый класс до ActivityUnitTestCase, чтобы протестировать одно действие и использовать метод startActivity, который вызовет ваш onCreate. ActivityInstrumentationTestCase2 предназначен для функционального тестирования активности.
См. больше в справочном документе по Android...
Запустите тестируемую активность так же, как если бы она была запущена с помощью Context.startActivity(), предоставив аргументы, которые она предоставила. Когда вы используете этот метод для запуска действия, оно будет автоматически остановлено tearDown().
Этот метод вызовет onCreate(), но если вы хотите в дальнейшем использовать методы жизненного цикла Activity, вы должны сами вызвать их из своего тестового примера.
Не вызывайте из своего метода setUp (). Вы должны вызвать этот метод из каждого из ваших тестовых методов.
Я не очень понимаю вашу проблему, но я постараюсь помочь.
Чтобы выполнить запуск Activity (и вызовы его обратного вызова onCreate), выполните следующие действия:
getActivity();
Обычное место для него — метод setUp()
(для вызова перед каждым тестом).
Как вы говорите, для каждого теста вызываются методы setUp()
и tearDown()
.
Я думаю, что лучший способ протестировать навигацию в вашем приложении — это простой тест и создать все намерения по мере необходимости, чтобы запустить все действия, необходимые для тестирования.
Я надеюсь, что это помогает.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.