[JAM 1.2] Testing in Android (Dzmitry Ivashnev)

1,443 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,443
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
21
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

[JAM 1.2] Testing in Android (Dzmitry Ivashnev)

  1. 1. ВведениеAndroid testing framework Continuous Integration Summary Тестирование приложений на платформе Android Ивашнёв Дмитрий email: 0xff0x666@gmail.com skype: oxffdx 9 апреля 2011 г. xffox Android Testing
  2. 2. Введение Android testing framework Continuous Integration SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  3. 3. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  4. 4. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryПодход к тестированию Автоматическое Тесты как часть кодаЮнит тестирование xffox Android Testing
  5. 5. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryПодход к тестированию Автоматическое Тесты как часть кодаЮнит тестирование xffox Android Testing
  6. 6. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryUnit testing Проверка на корректность отдельных модулей Инструментарий: Test case Assertions Mock objects Test case runner xffox Android Testing
  7. 7. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryUnit testing Проверка на корректность отдельных модулей Инструментарий: Test case Assertions Mock objects Test case runner xffox Android Testing
  8. 8. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryUnit testing Проверка на корректность отдельных модулей Инструментарий: Test case Assertions Mock objects Test case runner xffox Android Testing
  9. 9. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryUnit testing Проверка на корректность отдельных модулей Инструментарий: Test case Assertions Mock objects Test case runner xffox Android Testing
  10. 10. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  11. 11. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryWhat can I do TestCase - базовый класс, от которого наследуются тестовые классы. В тестирующем фреймворке могут быть классы, расширяющие базовый функционал. В тестовый класс добавляются методы, содержащие тестирующий код. Методы, начинающиеся с "test"автоматически распознаются как тестовые методы, которые будут вызваны при тестировании. xffox Android Testing
  12. 12. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryWhat can I do В методы setUp() и tearDown() добавляется код, который будет вызываться перед и после каждого теста соответственно (fixture). Для проверки корректности работы используются ассерты (assertEquals(), assertFalse(), assertNull(), ...). Тестирующий фреймворк может содержать дополнительные ассерты. xffox Android Testing
  13. 13. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryПример чистого Junit public class CoverageTest extends TestCase { public void testBounding () { ArrayList < Circle > circles = new ArrayList < Circle >() ; circles . add ( new Circle ( new Point (.0 , .0) , 2.0) ) ; Coverage coverage = new Coverage ( circles ) ; Rectangle boundingRect = coverage . g e t B o u n d i n g R e c t a n g l e () ; assertEquals ( boundingRect .x , -2.0) ; assertEquals ( boundingRect .y , 2.0) ; assertEquals ( boundingRect . x + boundingRect . width , 2.0) ; assertEquals ( boundingRect . y - boundingRect . height , -2.0) ; } public void testIntersection () { ArrayList < Circle > circles = new ArrayList < Circle >() ; circles . add ( new Circle ( new Point (.0 , .0) , 2.0) ) ; Coverage coverage = new Coverage ( circles ) ; assertTrue ( coverage . isInIntersection ( new Point (.0 , .0) ) ) ; } } xffox Android Testing
  14. 14. Введение Android testing framework Юнит тестирование Continuous Integration Архитектура SummaryКакими должны быть тесты F.I.R.S.T. (из Clean Code) Быстрые (Fast) - если тесты будут медленными будет возникать желание запускать их реже. Независимые (Independent) - один тест не должен влиять на исход другого. Повторямые (Repeatable) - повторный запуск тестов должен быть возможен в любом окружении и должен возвращать одинаковый результат. Самодостаточные (Self-Validating) - тесты либо проходят либо нет, не нужны дополнительные действия для установления результата. Своевременные (Timely) - при несвоевременном написании тестов могут возникнуть проблемы с их интеграцией так как код мог не проектироваться с учетом его тестируемости. xffox Android Testing
  15. 15. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  16. 16. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryСостав Основан на JUnit (версия 3) Специфические тесты для компонентов (*TestCase классы, asserts, mocks) Упаковывается в пакет как и приложение Допонительные утилиты (monkeyrunner - API для тестирования на python; Monkey:)) xffox Android Testing
  17. 17. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  18. 18. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryEclipse New->Project->Android->Android Test Project xffox Android Testing
  19. 19. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryEclipse Test Project Name. Test Target: An existing Android project, или нажать Browse и выбрать нужный проект. Build Target. Application name. Package name. Нажать Finish. xffox Android Testing
  20. 20. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryEclipse xffox Android Testing
  21. 21. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryEclipse xffox Android Testing
  22. 22. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryOther IDEs $ android create test-project -m <main_path> -n <project_name> -p <test_path> $ ant install $ adb shell am instrument -w <test_package_name>/<runner_class> runner_class обычно InstrumentationTestRunner xffox Android Testing
  23. 23. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  24. 24. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryAndroidTestCase Базовый класс TestCase Предоставляет доступ к Context и содержит ассерты для тестирования прав доступа Context getContext () void setContext ( Context context ) void a s s e r t A c t i v i t y R e q u i r e s P e r m i s s i o n ( String packageName , String className , String permission ) // Asserts that launching a given activity is protected by a particular permission by attempting to start the activity and validating that a S e c u r ity Ex cep tio n is thrown that mentions the permission in its error message . void a s s e r t R e a d i n g C o n t e n t U r i R e q u i r e s P e r m i s s i o n ( Uri uri , String permission ) // Asserts that reading from the content uri requires a particular permission by querying the uri and ensuring a S ecu rit yE xce pti on is thrown mentioning the particular permission . void a s s e r t W r i t i n g C o n t e n t U r i R e q u i r e s P e r m i s s i o n ( Uri uri , String permission ) // Asserts that writing to the content uri requires a particular permission by inserting into the uri and ensuring a Se cur ity Exc ept ion is thrown mentioning the particular permission . xffox Android Testing
  25. 25. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryActivity testing Базовый класс InstrumentationTestCase Тестовые классы: ActivityInstrumentationTestCase2, ActivityUnitTestCase, SingleLaunchActivityTestCase xffox Android Testing
  26. 26. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryViewAsserts описывает ассерты для View, с их помощьюможно тестировать выравнивание и позицию объектов View:static void a s s e r t B a s e l i n e A l i g n e d ( View first , View second )// Assert that two views are aligned on their baseline , that is that their baselines are on the same y location .static void a s s e r t G ro u p C o n t a i n s ( ViewGroup parent , View child )// Assert that the specified group contains a specific child once and only once .static void a s s e r t G r o u p I n t e g r i t y ( ViewGroup parent )// Assert the specified group ’s integrity . The children count should be >= 0 and each child should be non - null .static void a s s e r t O f f S c r e e n A b o v e ( View origin , View view )// Assert that view is above the visible screen .static void assertOnScreen ( View origin , View view )// Assert that view is on the screen .static void a s s e r t H a s S c r e e n C o o r d i n a t e s ( View origin , View view , int x , int y )// Assert that a view has a particular x and y position on the visible screen .// ... xffox Android Testing
  27. 27. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryActivity testing import com . example . helloandroid . HelloAndroid ; package com . example . helloandroid . test ; import android . test . A c t i v i t y I n s t r u m e n t a t i o n T e s t C a s e 2 ; public class HelloAndroidTest extends ActivityInstrumentationTestCase2 < HelloAndroid > { } public HelloAndroidTest () { super ( " com . example . helloandroid " , HelloAndroid . class ) ; } xffox Android Testing
  28. 28. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryActivity testing @Override protected void setUp () throws Exception { super . setUp () ; mActivity = this . getActivity () ; mView = ( TextView ) mActivity . findViewById ( com . example . helloandroid . R . id . textview ) ; resourceString = mActivity . getString ( com . example . helloandroid . R . string . hello ) ; } Этот тест будет вызван первым, используется для проверки иницализации. public void t est Pr eco ndi tio ns () { assertNotNull ( mView ) ; } public void testText () { assertEquals ( resourceString ,( String ) mView . getText () ) ; } xffox Android Testing
  29. 29. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryContent provider testing Базовый класс ProviderTestCase2 Объект тестируемого класса можно получить через вызов getProvider(), но лучше использовать резолвер для работы с объектом, также как и обычное приложение будет его использовать. Следует тестировать URI, причем как корректные так и некорректные. Следует тестировать стандартные методы: query(), insert(), delete(), update(), getType() и onCreate(). Бизнесс логика. xffox Android Testing
  30. 30. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryContent provider testing M o c k C o n t e n t R e s o l v e r g e t M o c k C o n t e n t R e s o l v e r () // Gets the M o c k C o n te n t R e s o l v e r created by this class during initialization . I so la t ed Context getMockContext () // Gets the IsolatedContext created by this class during initialization . T getProvider () // Returns the content provider created by this class in the setUp () method . static <T extends ContentProvider > ContentResolver n e w R e s o l v e r W i t h C o n t e n t P r o v i d e r F r o m S q l ( Context targetContext , String filenamePrefix , Class <T > providerClass , String authority , String databaseName , int databaseVersion , String sql ) // Creates a new content provider of the same type as that passed to the test case class , with an authority name set to the authority parameter , and using an SQLite database as the underlying data source . xffox Android Testing
  31. 31. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryService testing Базовый класс ServiceTestCase Следует тестировать функции onCreate() как реакцию на Context.startService() или Context.bindService(). Функцию onDestroy() как реакцию на Context.stopService(), Context.unbindService(), stopSelf() или stopSelfResult(). Бизнесс логика. xffox Android Testing
  32. 32. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryService testing Application getApplication () // Returns the Application object in use by the service under test . T getService () Context g etSystemContext () // Returns the real system context that is saved by setUp () . void setApplication ( Application application ) // Sets the application that is used during the test . IBinder bindService ( Intent intent ) // Starts the service under test , in the same way as if it were started by Context . bindService ( Intent , ServiceConnection , flags ) with an Intent that identifies a service . void setUp () // Gets the current system context and stores it . voi setupService () // Creates the service under test and attaches all injected dependencies ( Context , Application ) to it . voi s hu td ownService () // Makes the necessary calls to stop ( or unbind ) the service under test , and calls onDestroy () . void startService ( Intent intent ) // Starts the service under test , in the same way as if it were started by Context . startService ( Intent ) with an Intent that identifies a service . void tearDown () // Shuts down the service under test . xffox Android Testing
  33. 33. Введение Введение Android testing framework Последовательность действий Continuous Integration Специфические тесты для компонентов SummaryВ итоге... xffox Android Testing
  34. 34. Введение Android testing framework Введение Continuous Integration Hudson SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  35. 35. Введение Android testing framework Введение Continuous Integration Hudson SummaryРекомендуемые требования Юнит тесты Система контроля версий xffox Android Testing
  36. 36. Введение Android testing framework Введение Continuous Integration Hudson SummaryHow does it work Один из узлов - Master - отвечает за мониторинг репозитория на коммиты или другие события, по которым он вызывает сборку и запуск тестов на подключенных к нему узлах - slaves - и сохранение возвращенных результатов. Подключенные узлы должны отличаться по конфигурации (ОС, железо и т.д.) xffox Android Testing
  37. 37. Введение Android testing framework Введение Continuous Integration Hudson SummaryHow does it work Чаще всего центральный узел предоставляет доступ к результатам через web-интерфейс. Плюс к этому возможны различные варианты нотификации (email, rss, jabber, ...). Существуют и другие архитектуры для Continuous Integration (CMake dashboard). xffox Android Testing
  38. 38. Введение Android testing framework Введение Continuous Integration Hudson SummaryOutline 1 Введение Юнит тестирование Архитектура 2 Android testing framework Введение Последовательность действий Специфические тесты для компонентов 3 Continuous Integration Введение Hudson xffox Android Testing
  39. 39. Введение Android testing framework Введение Continuous Integration Hudson SummaryContinuous Integration на базе HudsonHudson написан на JavaУстановка очень простая: Скачать war-архив с сайта Скачать плагин android-emulator.hpi (также понадобится port-allocator.hpi) Помещаются в ˜/.hudson/plugins java -jar hudson-1.398.war go http://localhost:8080 xffox Android Testing
  40. 40. ВведениеAndroid testing framework Введение Continuous Integration Hudson Summary xffox Android Testing
  41. 41. ВведениеAndroid testing framework Введение Continuous Integration Hudson Summary xffox Android Testing
  42. 42. ВведениеAndroid testing framework Введение Continuous Integration Hudson Summary xffox Android Testing
  43. 43. ВведениеAndroid testing framework Введение Continuous Integration Hudson Summary xffox Android Testing
  44. 44. ВведениеAndroid testing framework Введение Continuous Integration Hudson Summary xffox Android Testing
  45. 45. Введение Android testing framework Введение Continuous Integration Hudson SummaryИ теперь... xffox Android Testing
  46. 46. Введение Android testing framework Continuous Integration SummarySummary Инструментарий есть, научитесь его использовать на пользу себе. xffox Android Testing
  47. 47. Приложение For Further ReadingFor Further Reading I Robert C. Martin. Clean Code. Prentice Hall. David J. Agans. Debugging http://developer.android.com/index.html xffox Android Testing

×