Intereting Posts
Как настроить внешний вид SeekBar в Android? Обновление сервисов Google Play с 8.4.0 до 9.2.1 вызывает ошибку синхронизации Gradle DrawerLayout Double Drawer (левый и правый ящики одновременно) Android Build fail – java.lang.IllegalArgumentException: уже добавлено: Lcom / google / api / client / escape / CharEscapers; Как создать listview onItemclicklistener Android использует V8 без WebView HTTP-соединение Apache с Android 6.0 (Marshmallow) Почему onDestroy inActivity Не вызывается после вызова функции finish () в ActivityB Как записывать видео с определенным звуком программно в Android? Принудительное следующее слово к новой строке, если слово слишком длинное для текстового поля Почему MediaPlayer не создает ошибку при создании экземпляра? Eclipse «Недопустимое описание проекта» при создании нового проекта из существующего источника Как читать штрих-коды с камерой на Android? TTS случайно пропускает первые буквы предложения Понимание списка <layer-list> для Android

Тестирование устройств Android: как сделать класс более подверженным тестированию?

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

Я обнаружил, что большую часть времени я получаю ошибки в вызовах API, но я все еще не могу понять, как писать для них единичные тесты (и как сделать исходный код тестируемым).

Позвольте мне объяснить следующую функцию:

Я запускаю вызов функции setOffenceList (). Внутри функции есть несколько действий.

I) Загрузите RestClient и передайте URL-адрес.

Ii) RestClient поговорить с JSON api и получить ответ

Ii) Я получаю ответ внутри функции onSuccess (String response)

Iii) Разбирайте данные JSON и храните их внутри массива

Iv) В случае успеха я покажу данные в виде списка (еще покажите сообщение об ошибке)

Это код:

public class OffenceFrag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.frag_offence, container, false); //run API call setOffenceList(); return view; } private void setOffenceList() { String url = Paths.SITE_URL ; RestClient.get(url, null, new AsyncHttpResponseHandler() { @Override public void onStart() { Toast.makeText(getActivity(), "Loading offences...", Toast.LENGTH_SHORT).show(); } @Override public void onSuccess(String response) { //Parse JSON JSONArray jsonArray; try { JSONObject jsonObj = new JSONObject(response); if(jsonObj.getString("status").equalsIgnoreCase("Success")){ jsonArray = new JSONArray(jsonObj.getString("data")); if(jsonArray.length() > 0){ for (int i = 0; i < jsonArray.length(); i++) { JSONObject row = jsonArray.getJSONObject(i); OffenceORM off = new OffenceORM(); off.setOffenceId(row.getString("offence_id")); off.setPhoto(row.getString("photo")); off.setSubmittedBy(row.getString("submitted_by")); offenceList.add(off); } } //Success: Show the list view setOffenceAdapter(); Toast.makeText(getActivity(), "Successfully Loaded", Toast.LENGTH_LONG).show(); } else { //Failed: show error message Toast.makeText(getActivity(), "There are no offences submitted under project", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Log.e("exception", e.getMessage()); } } @Override public void onFailure(Throwable error, String content) { Log.e("failed", error.getMessage()); } @Override public void onFinish() { } }); } }//end 

Я не могу понять, как написать тестовую функцию для чего-то вроде приведенного выше кода.

Можете ли вы показать мне, как разбить этот код на тестируемые части и написать им функции тестирования модулей?

Большое спасибо!

Solutions Collecting From Web of "Тестирование устройств Android: как сделать класс более подверженным тестированию?"

Только и только хороший дизайн может помочь вам упростить тестирование модулей. Вот почему Test Driven Development существует. Так что вы не можете пойти с неправильным дизайном.

Когда вы тестируете устройство, вы просто проверяете код, написанный вами, и используете макетные объекты, предоставленные Android, для тестирования вызовов Android Api.

Что касается других проблем Api, то проблема с разработчиком Api не ваша. Вы можете использовать макетную инфраструктуру, такую ​​как Mockito, для проверки функциональности вашего кода при вызове другого кода API. Проверьте API-код отдельно, если вы разрабатываете свой собственный API.

Принципы проектирования должны соблюдаться для хорошего дизайна, например

  • S – принцип единой ответственности
  • O – принцип открытого закрывания
  • Л-Лисковский принцип замещения
  • I – Принцип сегрегации интерфейса
  • D – Принцип инверсии зависимостей

Важные моменты:

  • Один вызов метода метода на единицу тестового примера
  • Не изменяйте классы только для тестирования.
  • Использование интерфейсов
  • Не ставьте слишком много утверждений или функций в один метод.
  • Не делайте слишком больших занятий.
  • Использовать TDD …….. Много больше

Единичное тестирование плохо разработанного кода – это полная потеря. Поскольку тест будет прерываться каждый раз, когда вы делаете некоторые изменения в классах. В Android это произойдет еще больше. Поскольку вы застряли в методах жизненного цикла Android.

Тщательно абстрагируйте функциональность, которую вы хотите протестировать в своих классах.

Это сделает ваш код приложения более надежным, простым и понятным.

Вы делаете слишком много вещей в Фрагменте, его трудно проверить и поддерживать.

Я использую шаблон MVP в своих проектах, который позволяет отделить уровень представления от логики, избегая размещения всего кода в фрагменте / активности.

Проверьте эту статью: http://antonioleiva.com/mvp-android/

И соответствующий пример кода в GitHub: https://github.com/antoniolg/androidmvp

Совет Rohit Khatkar для использования TDD, безусловно, стоит рассмотреть следующий код, который вы разрабатываете. Но теперь, когда этот код существует, и вы спрашиваете «как разбить этот код на тестируемые части»: вы могли бы сначала проигнорировать тестируемость и просто попытаться разбить этот код на более мелкие части: определения класса Exline и методы разделения, Так же как и для оптимизации читаемости в целом. Вы уже найдете некоторую избыточность (если вокруг цикла for).

В качестве эффекта каждый из полученных методов, вероятно, будет иметь меньшие зависимости от других классов. Затем вы можете сосредоточиться на сокращении этих зависимостей. Ознакомьтесь с книгой Майкла Пера о работе с устаревшим кодом для целого ряда подходов к разрыву зависимостей. EDIT: кто-то извлек список методов нарушения зависимости (только описания высокого уровня): http://rubyexperiences.blogspot.de/2005/12/dependency-breaking-techniques-from.html