[jam 1.2] testing in android (dzmitry ivashnev)

51
Введение Android testing framework Continuous Integration Summary Тестирование приложений на платформе Android Ивашнёв Дмитрий email: [email protected] skype: oxffdx 9 апреля 2011 г. xffox Android Testing

Upload: evgeny-kaziak

Post on 29-Nov-2014

1.441 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Тестирование приложенийна платформе Android

Ивашнёв Дмитрийemail: [email protected]

skype: oxffdx

9 апреля 2011 г.

xffox Android Testing

Page 2: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 3: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 4: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Подход к тестированиюАвтоматическоеТесты как часть кода

Юнит тестирование

xffox Android Testing

Page 5: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Подход к тестированиюАвтоматическоеТесты как часть кода

Юнит тестирование

xffox Android Testing

Page 6: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Unit testing

Проверка на корректность отдельных модулейИнструментарий:

Test caseAssertionsMock objectsTest case runner

xffox Android Testing

Page 7: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Unit testing

Проверка на корректность отдельных модулейИнструментарий:

Test caseAssertionsMock objectsTest case runner

xffox Android Testing

Page 8: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Unit testing

Проверка на корректность отдельных модулейИнструментарий:

Test caseAssertionsMock objectsTest case runner

xffox Android Testing

Page 9: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Unit testing

Проверка на корректность отдельных модулейИнструментарий:

Test caseAssertionsMock objectsTest case runner

xffox Android Testing

Page 10: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 11: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

What can I do

TestCase - базовый класс, от которого наследуются тестовыеклассы. В тестирующем фреймворке могут быть классы,расширяющие базовый функционал.В тестовый класс добавляются методы, содержащиетестирующий код.Методы, начинающиеся с "test"автоматически распознаютсякак тестовые методы, которые будут вызваны притестировании.

xffox Android Testing

Page 12: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

What can I do

В методы setUp() и tearDown() добавляется код, которыйбудет вызываться перед и после каждого теста соответственно(fixture).Для проверки корректности работы используются ассерты(assertEquals(), assertFalse(), assertNull(), ...).Тестирующий фреймворк может содержать дополнительныеассерты.

xffox Android Testing

Page 13: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 14: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Юнит тестированиеАрхитектура

Какими должны быть тесты

F.I.R.S.T. (из Clean Code)Быстрые (Fast) - если тесты будут медленными будетвозникать желание запускать их реже.Независимые (Independent) - один тест не должен влиятьна исход другого.Повторямые (Repeatable) - повторный запуск тестовдолжен быть возможен в любом окружении и долженвозвращать одинаковый результат.Самодостаточные (Self-Validating) - тесты либо проходятлибо нет, не нужны дополнительные действия дляустановления результата.Своевременные (Timely) - при несвоевременном написаниитестов могут возникнуть проблемы с их интеграцией таккак код мог не проектироваться с учетом еготестируемости.

xffox Android Testing

Page 15: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)
Page 16: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 17: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Состав

Основан на JUnit (версия 3)Специфические тесты для компонентов (*TestCaseклассы, asserts, mocks)Упаковывается в пакет как и приложениеДопонительные утилиты (monkeyrunner - API длятестирования на python; Monkey:))

xffox Android Testing

Page 18: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 19: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Eclipse

New->Project->Android->Android Test Project

xffox Android Testing

Page 20: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 21: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Eclipse

xffox Android Testing

Page 22: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Eclipse

xffox Android Testing

Page 23: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 24: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 25: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 26: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Activity testing

Базовый класс InstrumentationTestCase

Тестовые классы: ActivityInstrumentationTestCase2,ActivityUnitTestCase, SingleLaunchActivityTestCase

xffox Android Testing

Page 27: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 28: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 29: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 30: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Content provider testing

Базовый класс ProviderTestCase2

Объект тестируемого класса можно получить через вызовgetProvider(), но лучше использовать резолвер для работы собъектом, также как и обычное приложение будет егоиспользовать.

Следует тестировать URI, причем как корректные так инекорректные.

Следует тестировать стандартные методы: query(), insert(),delete(), update(), getType() и onCreate().

Бизнесс логика.

xffox Android Testing

Page 31: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 32: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

Service testing

Базовый класс ServiceTestCase

Следует тестировать функции onCreate() как реакцию наContext.startService() или Context.bindService().Функцию onDestroy() как реакцию наContext.stopService(), Context.unbindService(),stopSelf() или stopSelfResult().

Бизнесс логика.

xffox Android Testing

Page 33: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 34: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеПоследовательность действийСпецифические тесты для компонентов

В итоге...

xffox Android Testing

Page 35: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)
Page 36: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 37: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

Рекомендуемые требования

Юнит тестыСистема контроляверсий

xffox Android Testing

Page 38: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

How does it work

Один из узлов - Master - отвечает за мониторинг репозиторияна коммиты или другие события, по которым он вызываетсборку и запуск тестов на подключенных к нему узлах - slaves -и сохранение возвращенных результатов.Подключенные узлы должны отличаться по конфигурации (ОС,железо и т.д.)

xffox Android Testing

Page 39: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

How does it work

Чаще всего центральный узел предоставляет доступ крезультатам через web-интерфейс. Плюс к этому возможныразличные варианты нотификации (email, rss, jabber, ...).Существуют и другие архитектуры для Continuous Integration(CMake dashboard).

xffox Android Testing

Page 40: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

Outline

1 ВведениеЮнит тестированиеАрхитектура

2 Android testing frameworkВведениеПоследовательность действийСпецифические тесты для компонентов

3 Continuous IntegrationВведениеHudson

xffox Android Testing

Page 41: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Введение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

Page 42: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

xffox Android Testing

Page 43: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

xffox Android Testing

Page 44: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

xffox Android Testing

Page 45: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

xffox Android Testing

Page 46: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

xffox Android Testing

Page 47: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

ВведениеHudson

И теперь...

xffox Android Testing

Page 48: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)
Page 49: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)
Page 50: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

ВведениеAndroid testing framework

Continuous IntegrationSummary

Summary

Инструментарий есть, научитесь его использовать на пользусебе.

xffox Android Testing

Page 51: [JAM 1.2] Testing in Android (Dzmitry Ivashnev)

Приложение 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