Intereting Posts
Лучший способ периодически выполнять AsyncTasks в Android Android Studio устанавливает точный сигнал тревоги с помощью значка Поддержка NDK – экспериментальные функции, и все варианты использования еще не подтверждены ошибкой в ​​Android Studio? Создание проектов Android, которые ссылаются на проекты библиотеки с ANT API разработчика Google Play: «startTimeMillis» обновляется, когда он не должен Android 3 – Добавление фрагмента в LinearLayout: fill_parent не работает FindViewById возвращает null в LinearLayout внутри представления <include> d Разница в использовании метода MotionEvent.getAction () Ошибка руля Volley Что такое paddingStart и paddingEnd? Ограничения по темам для android? Android httprequest java.net.UnknownHostException Вставка точек останова в Eclipse для Android-программы Какой идентификатор используется для создания промокодов для приложения для Android Как правильно добавить предварительно созданную статическую библиотеку в Android.mk-файл Android NDK?

Тестирование устройств 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