Подтвердить что ты не робот

Android: Написание тестовых примеров для фрагментов

В моих предыдущих проектах я проделал большую часть работы через "Деятельность" и использовал ActivityInstrumentationTestCase2 в соответствии с документом:
http://developer.android.com/tools/testing/activity_testing.html
У меня есть идея, как работать с действиями Test Test; но когда дело доходит до Фрагмента, у меня нет большой идеи и не найдено много документов, связанных с этим. Итак, как писать тестовые примеры, когда у меня есть несколько фрагментов с одной или двумя действиями? Любой пример кода или образца будет более полезным.

4b9b3361

Ответ 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?)