Upload
quartsoft
View
1.931
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Модульное тестирование
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
Тестирование ПО
Модульное (unit testing) Интеграционное (integration testing) Регрессионное (regression testing) Системное (system testing) ...
Test-driven development (TDD)
test code refactor
Test first!
Сначала создается набор тестов... ... и только потом пишется код!
Модульное тестирование(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);}
Зачем?
Отдельные части системы протестированы еще до реализации
Требуется меньше времени на отладку Код, который хорошо структурирован и прост
в поддержке Минимизация риска возникновения новых
ошибок при добавлении новой функциональности
Тесты как документация
Еще варианты
Тесты на bug report/feedback Тесты на унаследованнный код Тесты как документация Когда непонятно с чего начать
Процесс
Подготовка тестовых (входных и выходных) данных
Запуск тестов Проверка результатов Удаление тестовых данных, освобождение
ресурсов
iOS
Что тестировать? Какими инструментами?
Что тестировать?
Бизнес-логика, работа алгоритмов Протоколы взаимодействия с сервером Парсинг User Interface, User eXperience
Тест не является unit-тестом, если он...
подключается к реальной базе данных; работает с сетью; взаимодействует с файловой системой; тестирует несколько классов и их
взаимодействие.
Устарел Сложен в настройке Неудобен в использовании Хорош для того, чтобы начать практиковать
TDD
Примеры-(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);}
Примеры
-(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);}
Behavior-driven development
Syntactic sugar “it should” вместо “test” Matchers вместо assert
Cedar by Pivotal Labs
BDD-style Удобен в использовании Универсален (позволяет тестировать логику,
UI, ...)
Примеры
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")); });
...
Спасибо! ;)