Android: Написание тестовых примеров для фрагментов
В моих предыдущих проектах я проделал большую часть работы через "Деятельность" и использовал ActivityInstrumentationTestCase2 в соответствии с документом:
http://developer.android.com/tools/testing/activity_testing.html
У меня есть идея, как работать с действиями Test Test; но когда дело доходит до Фрагмента, у меня нет большой идеи и не найдено много документов, связанных с этим.
Итак, как писать тестовые примеры, когда у меня есть несколько фрагментов с одной или двумя действиями?
Любой пример кода или образца будет более полезным.
Ответы
Ответ 1
Здесь грубая направляющая с помощью ActivityInstrumentationTestCase2
:
Шаг 1. Создайте пустое действие для хранения фрагментов (-ов)
private static class FragmentUtilActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout view = new LinearLayout(this);
view.setId(1);
setContentView(view);
}
}
Шаг 2:
Внутри вашего теста создайте экземпляр фрагмента и добавьте его в пустую активность.
public class MyFragmentTest extends ActivityInstrumentationTestCase2<FragmentUtilActivity> {
private MyFragment fragment;
@Before
public void setup() {
fragment = new MyFragment();
getActivity().getFragmentManager().beginTransaction().add(1, fragment, null).commit();
}
}
Шаг 3 Проверьте свой экземпляр
@Test
public void aTest() {
fragment.getView().findViewById(...);
}
Если вы используете robolectric, это довольно просто, используя класс FragmentUtilTest:
@Test
public void aTest() {
// instantiate your fragment
MyFragment fragment = new MyFragment();
// Add it to a blank activity
FragmentTestUtil.startVisibleFragment(fragment);
// ... call getView().findViewById() on your fragment
}
Ответ 2
Вот мое рабочее решение:
-
Создайте для этого инструмент unit test для этого в каталоге androidTest, то есть:
public class FragmentTest extends
ActivityInstrumentationTestCase2<MainActivity> {
private MainActivity testingActivity;
private TestFragment testFragment;
//...
}
-
вызовите этот конструктор внутри этого нового класса:
public FragmentTest() {
super(MainActivity.class);
}
-
переопределить метод setUp() (обязательно укажите R.id.fragmentContainer в классе Activity), в котором вы в конце вызовете waitForIdleSync():
@Override
protected void setUp() throws Exception {
super.setUp();
// Starts the activity under test using
// the default Intent with:
// action = {@link Intent#ACTION_MAIN}
// flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
// All other fields are null or empty.
testingActivity = getActivity();
testFragment = new TestFragment();
testingActivity.getFragmentManager().beginTransaction().add(R.id.fragmentContainer,testFragment,null).commit();
/**
* Synchronously wait for the application to be idle. Can not be called
* from the main application thread -- use {@link #start} to execute
* instrumentation in its own thread.
*
* Without waitForIdleSync(); our test would have nulls in fragment references.
*/
getInstrumentation().waitForIdleSync();
}
-
Напишите тестовый метод, например, например:
public void testGameFragmentsTextViews() {
String empty = "";
TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
assertTrue("Empty stuff",(textView.getText().equals(empty)));
}
-
Запустите тест.
Ответ 3
Используйте свое основное действие как тестовую активность, которую вы отправляете в ActivityInstrumentationTestCase2. Затем вы можете работать с фрагментами через диспетчер фрагментов вашего основного действия, который запускает фрагменты. Это даже лучше, чем наличие тестовой активности, потому что она использует логику, которую вы пишете в своей основной деятельности, для тестирования сценариев, которая дает более полное и более полное тестирование.
Пример:
public class YourFragmentTest extends ActivityInstrumentationTestCase2<MainActivity> {
public YourFragmentTest(){
super(MainActivity.class);
}
}
Ответ 4
Сейчас ActivityInstrumentationTestCase2 устарел. Теперь вы можете использовать правила для использования действий в своих тестах: http://wiebe-elsinga.com/blog/whats-new-in-android-testing/
Для того, чтобы те работали, вам придется добавлять зависимости к вам build.gradle:
testCompile 'com.android.support.test:rules:0.5'
testCompile 'com.android.support.test:runner:0.5'
(см. Почему я не могу импортировать AndroidJUnit4 и ActivityTestRule в класс unit test?)