4. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Подход к тестированию
Автоматическое
Тесты как часть кода
Юнит тестирование
xffox Android Testing
5. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Подход к тестированию
Автоматическое
Тесты как часть кода
Юнит тестирование
xffox Android Testing
6. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Unit testing
Проверка на корректность отдельных модулей
Инструментарий:
Test case
Assertions
Mock objects
Test case runner
xffox Android Testing
7. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Unit testing
Проверка на корректность отдельных модулей
Инструментарий:
Test case
Assertions
Mock objects
Test case runner
xffox Android Testing
8. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Unit testing
Проверка на корректность отдельных модулей
Инструментарий:
Test case
Assertions
Mock objects
Test case runner
xffox Android Testing
9. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Unit testing
Проверка на корректность отдельных модулей
Инструментарий:
Test case
Assertions
Mock objects
Test case runner
xffox Android Testing
11. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
What can I do
TestCase - базовый класс, от которого наследуются тестовые
классы. В тестирующем фреймворке могут быть классы,
расширяющие базовый функционал.
В тестовый класс добавляются методы, содержащие
тестирующий код.
Методы, начинающиеся с "test"автоматически распознаются
как тестовые методы, которые будут вызваны при
тестировании.
xffox Android Testing
12. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
What can I do
В методы setUp() и tearDown() добавляется код, который
будет вызываться перед и после каждого теста соответственно
(fixture).
Для проверки корректности работы используются ассерты
(assertEquals(), assertFalse(), assertNull(), ...).
Тестирующий фреймворк может содержать дополнительные
ассерты.
xffox Android Testing
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. Введение
Android testing framework Юнит тестирование
Continuous Integration Архитектура
Summary
Какими должны быть тесты
F.I.R.S.T. (из Clean Code)
Быстрые (Fast) - если тесты будут медленными будет
возникать желание запускать их реже.
Независимые (Independent) - один тест не должен влиять
на исход другого.
Повторямые (Repeatable) - повторный запуск тестов
должен быть возможен в любом окружении и должен
возвращать одинаковый результат.
Самодостаточные (Self-Validating) - тесты либо проходят
либо нет, не нужны дополнительные действия для
установления результата.
Своевременные (Timely) - при несвоевременном написании
тестов могут возникнуть проблемы с их интеграцией так
как код мог не проектироваться с учетом его
тестируемости.
xffox Android Testing
15.
16. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Outline
1 Введение
Юнит тестирование
Архитектура
2 Android testing framework
Введение
Последовательность действий
Специфические тесты для компонентов
3 Continuous Integration
Введение
Hudson
xffox Android Testing
17. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Состав
Основан на JUnit (версия 3)
Специфические тесты для компонентов (*TestCase
классы, asserts, mocks)
Упаковывается в пакет как и приложение
Допонительные утилиты (monkeyrunner - API для
тестирования на python; Monkey:))
xffox Android Testing
18. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Outline
1 Введение
Юнит тестирование
Архитектура
2 Android testing framework
Введение
Последовательность действий
Специфические тесты для компонентов
3 Continuous Integration
Введение
Hudson
xffox Android Testing
19. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Eclipse
New->Project->Android->Android Test Project
xffox Android Testing
20. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Eclipse
Test Project Name.
Test Target: An existing
Android project, или нажать
Browse и выбрать нужный
проект.
Build Target.
Application name.
Package name.
Нажать Finish.
xffox Android Testing
21. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Eclipse
xffox Android Testing
22. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Eclipse
xffox Android Testing
23. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Other 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
24. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Outline
1 Введение
Юнит тестирование
Архитектура
2 Android testing framework
Введение
Последовательность действий
Специфические тесты для компонентов
3 Continuous Integration
Введение
Hudson
xffox Android Testing
25. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
AndroidTestCase
Базовый класс 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
26. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Activity testing
Базовый класс InstrumentationTestCase
Тестовые классы: ActivityInstrumentationTestCase2,
ActivityUnitTestCase, SingleLaunchActivityTestCase
xffox Android Testing
27. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
ViewAsserts описывает ассерты для 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
28. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Activity 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
29. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Activity 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
30. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Content provider testing
Базовый класс ProviderTestCase2
Объект тестируемого класса можно получить через вызов
getProvider(), но лучше использовать резолвер для работы с
объектом, также как и обычное приложение будет его
использовать.
Следует тестировать URI, причем как корректные так и
некорректные.
Следует тестировать стандартные методы: query(), insert(),
delete(), update(), getType() и onCreate().
Бизнесс логика.
xffox Android Testing
31. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Content 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
32. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Service testing
Базовый класс ServiceTestCase
Следует тестировать функции onCreate() как реакцию на
Context.startService() или Context.bindService().
Функцию onDestroy() как реакцию на
Context.stopService(), Context.unbindService(),
stopSelf() или stopSelfResult().
Бизнесс логика.
xffox Android Testing
33. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
Service 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
34. Введение
Введение
Android testing framework
Последовательность действий
Continuous Integration
Специфические тесты для компонентов
Summary
В итоге...
xffox Android Testing
37. Введение
Android testing framework Введение
Continuous Integration Hudson
Summary
Рекомендуемые требования
Юнит тесты
Система контроля
версий
xffox Android Testing
38. Введение
Android testing framework Введение
Continuous Integration Hudson
Summary
How does it work
Один из узлов - Master - отвечает за мониторинг репозитория
на коммиты или другие события, по которым он вызывает
сборку и запуск тестов на подключенных к нему узлах - slaves -
и сохранение возвращенных результатов.
Подключенные узлы должны отличаться по конфигурации (ОС,
железо и т.д.)
xffox Android Testing
39. Введение
Android testing framework Введение
Continuous Integration Hudson
Summary
How does it work
Чаще всего центральный узел предоставляет доступ к
результатам через web-интерфейс. Плюс к этому возможны
различные варианты нотификации (email, rss, jabber, ...).
Существуют и другие архитектуры для Continuous Integration
(CMake dashboard).
xffox Android Testing
41. Введение
Android testing framework Введение
Continuous Integration Hudson
Summary
Continuous Integration на базе Hudson
Hudson написан на Java
Установка очень простая:
Скачать war-архив с сайта
Скачать плагин android-emulator.hpi (также понадобится
port-allocator.hpi) Помещаются в ˜/.hudson/plugins
java -jar hudson-1.398.war
go http://localhost:8080
xffox Android Testing
50. Введение
Android testing framework
Continuous Integration
Summary
Summary
Инструментарий есть, научитесь его использовать на пользу
себе.
xffox Android Testing
51. Приложение For Further Reading
For Further Reading I
Robert C. Martin.
Clean Code.
Prentice Hall.
David J. Agans.
Debugging
http://developer.android.com/index.html
xffox Android Testing