19
Модульное тестирование iOS-приложений TDD: All code is guilty until it's proven innocent @implementation RpnCalculatorTestCase -(void)setUp { rpnCalculator = [[RpnCalculator alloc]init]; } - (void)testShouldDisplayTwoNumbersWhenNumbersAreSeparated ByEnter{ [rpnCalculator put:@"1"]; [rpnCalculator put:@"enter"]; [rpnCalculator put:@"2"];! STAssertEqualObjects(@"1\ n2",rpnCalculator.display,nil); } -(void)tearDown{ [rpnCalculator release]; } Антон Сахаров mlsdev.com

Модульное тестирование iOS-приложений

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Модульное тестирование iOS-приложений

Модульное тестирование

iOS-приложений

TDD: All code is guilty until it's proven innocent

@implementation RpnCalculatorTestCase-(void)setUp { rpnCalculator = [[RpnCalculator alloc]init]; }-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{ [rpnCalculator put:@"1"]; [rpnCalculator put:@"enter"]; [rpnCalculator put:@"2"];!

STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil); }

-(void)tearDown{ [rpnCalculator release];} Антон Сахаров

mlsdev.com

Page 2: Модульное тестирование iOS-приложений

Тестирование ПО

Модульное (unit testing) Интеграционное (integration testing) Регрессионное (regression testing) Системное (system testing) ...

Page 3: Модульное тестирование iOS-приложений

Test-driven development (TDD)

test code refactor

Page 4: Модульное тестирование iOS-приложений

Test first!

Сначала создается набор тестов... ... и только потом пишется код!

Page 5: Модульное тестирование iOS-приложений

Модульное тестирование(unit testing)

тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция.

-(void) setUp { Calculator* calculator = [[Calculator alloc] init];}

-(void) testSum { int a = 2; int b = 3; int result = [calculator sum: a and: b]; STAssertEquals(5, result);}

Page 6: Модульное тестирование iOS-приложений

Зачем?

Отдельные части системы протестированы еще до реализации

Требуется меньше времени на отладку Код, который хорошо структурирован и прост

в поддержке Минимизация риска возникновения новых

ошибок при добавлении новой функциональности

Тесты как документация

Page 7: Модульное тестирование iOS-приложений

Еще варианты

Тесты на bug report/feedback Тесты на унаследованнный код Тесты как документация Когда непонятно с чего начать

Page 8: Модульное тестирование iOS-приложений

Процесс

Подготовка тестовых (входных и выходных) данных

Запуск тестов Проверка результатов Удаление тестовых данных, освобождение

ресурсов

Page 9: Модульное тестирование iOS-приложений

iOS

Что тестировать? Какими инструментами?

Page 10: Модульное тестирование iOS-приложений

Что тестировать?

Бизнес-логика, работа алгоритмов Протоколы взаимодействия с сервером Парсинг User Interface, User eXperience

Page 11: Модульное тестирование iOS-приложений

Тест не является unit-тестом, если он...

подключается к реальной базе данных; работает с сетью; взаимодействует с файловой системой; тестирует несколько классов и их

взаимодействие.

Page 12: Модульное тестирование iOS-приложений

Устарел Сложен в настройке Неудобен в использовании Хорош для того, чтобы начать практиковать

TDD

Page 13: Модульное тестирование iOS-приложений

Примеры-(void) setUp {

helper = [RequestHelper newRequestHelperWithBaseURL:@"http://mlsdev.com/index.php"]; [helper retain];}

-(void) tearDown { [helper release];}

-(void) testFormatQuery { NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"realsugar", @"login", @"secret", @"password", nil]; NSString* query = [helper formatQuery:params]; STAssertTrue([query hasPrefix:@"?"], query);

NSString* argStr = [query stringByReplacingOccurrencesOfString:@"?" withString:@""]; NSArray* args = [argStr componentsSeparatedByString:@"&"];

STAssertEquals(2U, [args count], nil);}

-(void) testQueryFormatParams { NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"realsugar", @"login", @"secret", @"password",nil];

NSString* query = [helper formatQuery:params]; NSString* match = [query stringByMatching:@"^\\?(?:[\\d\\w]+=[\\d\\w]+|&)+$"]; STAssertTrue([match isEqualToString:query], match);}

Page 14: Модульное тестирование iOS-приложений

Примеры

-(void) testEncodedUrlString { NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Anton Sakharov", @"fullname", nil];

NSString* url = [helper encodedUrlString: params];

STAssertTrue([url isEqualToString:@"http://mlsdev.com/index.php?fullname=Anton%20Sakharov"], url);}

Page 15: Модульное тестирование iOS-приложений

Behavior-driven development

Syntactic sugar “it should” вместо “test” Matchers вместо assert

Page 16: Модульное тестирование iOS-приложений

Cedar by Pivotal Labs

BDD-style Удобен в использовании Универсален (позволяет тестировать логику,

UI, ...)

Page 17: Модульное тестирование iOS-приложений

Примеры

beforeEach(^{ mockAgentDelegate = [OCMockObject mockForProtocol:@protocol(LandingAgentDelegate)]; agent = [[LandingAgent alloc] initWithDelegate:mockAgentDelegate]; });

afterEach(^{ [agent release]; });

describe(@"logIn", ^{ __block NSURLConnection *logInConnection;

beforeEach(^{ [agent logIn]; logInConnection = [[NSURLConnection connections] lastObject]; });

it(@"should try to log into Tracker", ^{ assertThat([[[logInConnection request] URL] path], endsWith(@"tokens/active")); });

...

Page 18: Модульное тестирование iOS-приложений
Page 19: Модульное тестирование iOS-приложений

Спасибо! ;)