[JAM 1.2] Testing in Android (Dzmitry Ivashnev)
-
Upload
evgeny-kaziak -
Category
Technology
-
view
1.441 -
download
3
description
Transcript of [JAM 1.2] Testing in Android (Dzmitry Ivashnev)
ВведениеAndroid testing framework
Continuous IntegrationSummary
Тестирование приложенийна платформе Android
Ивашнёв Дмитрийemail: [email protected]
skype: oxffdx
9 апреля 2011 г.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Подход к тестированиюАвтоматическоеТесты как часть кода
Юнит тестирование
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Подход к тестированиюАвтоматическоеТесты как часть кода
Юнит тестирование
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Unit testing
Проверка на корректность отдельных модулейИнструментарий:
Test caseAssertionsMock objectsTest case runner
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Unit testing
Проверка на корректность отдельных модулейИнструментарий:
Test caseAssertionsMock objectsTest case runner
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Unit testing
Проверка на корректность отдельных модулейИнструментарий:
Test caseAssertionsMock objectsTest case runner
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Unit testing
Проверка на корректность отдельных модулейИнструментарий:
Test caseAssertionsMock objectsTest case runner
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
What can I do
TestCase - базовый класс, от которого наследуются тестовыеклассы. В тестирующем фреймворке могут быть классы,расширяющие базовый функционал.В тестовый класс добавляются методы, содержащиетестирующий код.Методы, начинающиеся с "test"автоматически распознаютсякак тестовые методы, которые будут вызваны притестировании.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
What can I do
В методы setUp() и tearDown() добавляется код, которыйбудет вызываться перед и после каждого теста соответственно(fixture).Для проверки корректности работы используются ассерты(assertEquals(), assertFalse(), assertNull(), ...).Тестирующий фреймворк может содержать дополнительныеассерты.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Пример чистого 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.getBoundingRectangle ();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
ВведениеAndroid testing framework
Continuous IntegrationSummary
Юнит тестированиеАрхитектура
Какими должны быть тесты
F.I.R.S.T. (из Clean Code)Быстрые (Fast) - если тесты будут медленными будетвозникать желание запускать их реже.Независимые (Independent) - один тест не должен влиятьна исход другого.Повторямые (Repeatable) - повторный запуск тестовдолжен быть возможен в любом окружении и долженвозвращать одинаковый результат.Самодостаточные (Self-Validating) - тесты либо проходятлибо нет, не нужны дополнительные действия дляустановления результата.Своевременные (Timely) - при несвоевременном написаниитестов могут возникнуть проблемы с их интеграцией таккак код мог не проектироваться с учетом еготестируемости.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Состав
Основан на JUnit (версия 3)Специфические тесты для компонентов (*TestCaseклассы, asserts, mocks)Упаковывается в пакет как и приложениеДопонительные утилиты (monkeyrunner - API длятестирования на python; Monkey:))
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Eclipse
New->Project->Android->Android Test Project
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Eclipse
Test Project Name.Test Target: An existingAndroid project, или нажатьBrowse и выбрать нужныйпроект.Build Target.Application name.Package name.Нажать Finish.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Eclipse
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Eclipse
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
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
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
AndroidTestCase
Базовый класс TestCase
Предоставляет доступ к Context и содержит ассерты длятестирования прав доступаContext getContext ()void setContext(Context context)void assertActivityRequiresPermission(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 aSecurityException is thrown that mentions the permission in its errormessage.
void assertReadingContentUriRequiresPermission(Uri uri , String permission)// Asserts that reading from the content uri requires a particular permission by
querying the uri and ensuring a SecurityException is thrown mentioning theparticular permission.
void assertWritingContentUriRequiresPermission(Uri uri , String permission)// Asserts that writing to the content uri requires a particular permission by
inserting into the uri and ensuring a SecurityException is thrownmentioning the particular permission.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Activity testing
Базовый класс InstrumentationTestCase
Тестовые классы: ActivityInstrumentationTestCase2,ActivityUnitTestCase, SingleLaunchActivityTestCase
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
ViewAsserts описывает ассерты для View, с их помощьюможно тестировать выравнивание и позицию объектов View:
static void assertBaselineAligned(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 assertGroupContains(ViewGroup parent , View child)// Assert that the specified group contains a specific child once and only once.static void assertGroupIntegrity(ViewGroup parent)// Assert the specified group’s integrity. The children count should be >= 0 and
each child should be non -null.static void assertOffScreenAbove(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 assertHasScreenCoordinates(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
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Activity testing
import com.example.helloandroid.HelloAndroid;
package com.example.helloandroid.test;
import android.test.ActivityInstrumentationTestCase2;
public class HelloAndroidTest extends ActivityInstrumentationTestCase2 <HelloAndroid > {
}
public HelloAndroidTest () {super("com.example.helloandroid", HelloAndroid.class);
}
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Activity testing
@Overrideprotected 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 testPreconditions () {assertNotNull(mView);
}
public void testText () {assertEquals(resourceString ,( String)mView.getText ());
}
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Content provider testing
Базовый класс ProviderTestCase2
Объект тестируемого класса можно получить через вызовgetProvider(), но лучше использовать резолвер для работы собъектом, также как и обычное приложение будет егоиспользовать.
Следует тестировать URI, причем как корректные так инекорректные.
Следует тестировать стандартные методы: query(), insert(),delete(), update(), getType() и onCreate().
Бизнесс логика.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Content provider testing
MockContentResolver getMockContentResolver ()//Gets the MockContentResolver created by this class during initialization.IsolatedContext 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
newResolverWithContentProviderFromSql(Context targetContext , StringfilenamePrefix , Class <T> providerClass , String authority , StringdatabaseName , int databaseVersion , String sql)
// Creates a new content provider of the same type as that passed to the testcase class , with an authority name set to the authority parameter , andusing an SQLite database as the underlying data source.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Service testing
Базовый класс ServiceTestCase
Следует тестировать функции onCreate() как реакцию наContext.startService() или Context.bindService().Функцию onDestroy() как реакцию наContext.stopService(), Context.unbindService(),stopSelf() или stopSelfResult().
Бизнесс логика.
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
Service testing
Application getApplication ()// Returns the Application object in use by the service under test.T getService ()Context getSystemContext ()// 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 thatidentifies 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 shutdownService ()//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
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеПоследовательность действийСпецифические тесты для компонентов
В итоге...
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
Рекомендуемые требования
Юнит тестыСистема контроляверсий
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
How does it work
Один из узлов - Master - отвечает за мониторинг репозиторияна коммиты или другие события, по которым он вызываетсборку и запуск тестов на подключенных к нему узлах - slaves -и сохранение возвращенных результатов.Подключенные узлы должны отличаться по конфигурации (ОС,железо и т.д.)
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
How does it work
Чаще всего центральный узел предоставляет доступ крезультатам через web-интерфейс. Плюс к этому возможныразличные варианты нотификации (email, rss, jabber, ...).Существуют и другие архитектуры для Continuous Integration(CMake dashboard).
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
Outline
1 ВведениеЮнит тестированиеАрхитектура
2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов
3 Continuous IntegrationВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
Continuous Integration на базе HudsonHudson написан на Java
Установка очень простая:Скачать war-архив с сайтаСкачать плагин android-emulator.hpi (также понадобитсяport-allocator.hpi) Помещаются в ˜/.hudson/pluginsjava -jar hudson-1.398.wargo http://localhost:8080
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
ВведениеHudson
И теперь...
xffox Android Testing
ВведениеAndroid testing framework
Continuous IntegrationSummary
Summary
Инструментарий есть, научитесь его использовать на пользусебе.
xffox Android Testing
Приложение 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