SlideShare a Scribd company logo
1 of 23
Download to read offline
Unit + UI testing
in iOS
Kirill Ushkov,
itomych studio
Зачем писать тесты?
• экономия времени (тестировщиков,
разработчиков)
• неожиданная плюшка в виде дополнительной
документации к коду
• раннее (а не заказчиком) обнаружение проблем,
далее см. пункт 1
Техники тестирования
• TDD - “разработка через тестирование”. Сначала
пишем тест на новое требование, убеждаемся, что
тест не проходит, потом пишем соответствующий
код таким образом, чтобы тесты проходили
• BDD - “разработка основанная на поведении”.
Ответвление TDD, основная фишка - тесты
оформляются “общедоступным
языком” (ubiquitous language). Примеры на iOS -
https://github.com/specta/specta, https://
github.com/kiwi-bdd/Kiwi
Метрики тестирования
• Покрытие кода тестами (code coverage) - мера
того, насколько хорошо протестирован Ваш код
Как то так это выглядит в
Xcode
Инструментарий юного
тестировщика
• Matcher - основной инструмент, помогает
сравнивать величины (https://github.com/hamcrest/
OCHamcrest, https://github.com/specta/expecta)
• Stub - заглушка, “заранее подготовленный”
эталон (http://ocmock.org, https://github.com/
AliSoftware/OHHTTPStubs)
• Mock - “макет” данных, эмуляция настоящих
данных для проверки взаимодействий (http://
ocmock.org)
Организация тестирования
• Перед тестированием определенного метода
необходимо четко определить какое поведение
Вы хотите проверить, какой “кейс” рассмотреть
• Для заглушек удобно использовать
заготовленные данные в json, plist или xml
формате - удобно редактировать.
Организация тестируемого
кода
• Тестируемость кода ухудшают неявные
зависимости: 



[[KNAPIClient sharedClient] userOfferWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
KNUserOffer *offer = [KNUserOffer objectWithAttributes:responseObject];
KNUser *user = [KNDataManager sharedManager].appUser;
user.currentUserOffer = offer;
--wSelf.requestCounter;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"User offer %@", error);
--wSelf.requestCounter;
}];
Dependency Injection
• Сначала перемещаем методы запросов в отдельный
протокол
• Далее объявляем в базовом контроллере:

@interface BaseViewController : UIViewController

@property (nonatomic) id<KNNetworkProtocol> apiClient;
@end
• Наконец объявляем геттер таким образом:

- (id<KNNetworkProtocol>)apiClient {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
#ifdef DEBUG
_apiClient = [KNLocalClient sharedClient];
#elif RELEASE
_apiClient = [KNAPIClient sharedClient];
#endif
});
return _apiClient;
}
XCTest
• Используется для тестирования кода в iOS
• Каждый класс, тестирующий отдельный модуль,
должен наследоваться от XCTestCase
• Каждый тестирующий метод в этом классе должен
начинаться со слова test. Можно избежать
выполнения теста если добавить в название метода
DISABLED_
• По умолчанию, все методы выполняются синхронно
XCTest
• Метод setup выполняется перед выполнением
каждого теста, а метода teardown - после
выполнения каждого теста
• Возможна отладка тестирующих методов
• Результаты каждой сессии тестирования
записываются в лог файл, путь к нему
прописывается в логах отладчика по окончанию
тестирования
Стоп, стоп, а как же
асинхронные методы?
• C iOS 8 появилось API для тестирования
асинхронного выполнения кода
XCTestExpectation:
NSString *email = @"unknownEmail@gmail.com";
XCTestExpectation *expectation = [self expectationWithDescription:@"Handler called"];
[self.apiClient forgotPasswordWithRecoveryEmail:email
withSuccessBlock:^(AFHTTPRequestOperation *operation, id response) {
expect(nil).toNot.beNil;
[expectation fulfill];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
expect(@(error.code)).to.equal(@(kCFURLErrorBadServerResponse));
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:self.expectationTimeOut handler:nil];
HTTP Stubs
• Если Вам необходимо проверить поведение
приложения при получении ответов от сервера,
то очень удобно использовать т.н. http stubs -
таким образом можно протестировать поведение
при “медленном” интернете или при его
отсутствии
OHHTTPStubs
• Основная идея такая - сначала Вы определяете
набор запросов по некоторым признакам, а затем
эмулируете ответ от сервера



OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest * _Nonnull request) {
return [request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path
containsString:@"user"];
} withStubResponse:^OHHTTPStubsResponse * _Nonnull(NSURLRequest * _Nonnull request) {
return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFile(@"User.json", [self class])
statusCode:200 headers:headers];
}];
OHHTTPStubs:on stub
activation
• Также есть возможность отловить срабатывание
определенной “заглушки”:



[OHHTTPStubs onStubActivation:^(NSURLRequest *request, id<OHHTTPStubsDescriptor> stub) {
NSLog(@"[OHHTTPStubs] Request to %@ has been stubbed with %@", request.URL, stub.name);
}];
UI Testing
Тестирование UI
• Механика создания UI-тестов такая:
• Вначале “записываем” взаимодействие с UI
• Далее автоматически записываются наши
действия в виде кода
• Ставим нужные проверки внутри кода
• Прогонка теста
Тестирование UI
• Фича доступна с iOS 9, поэтому минимальный
таргет должен быть iOS 9, в противном случае не
будет доступна (или совсем отсутствовать кнопка
записи)
• Есть несколько основных классов:
XCUIElementQuery, XCUIApplication, XCUIElement
Expectations
• Есть возможность дождаться появления
некоторого элемента UI:



XCUIApplication *app = [[XCUIApplication alloc] init];
XCUIElement *label = app.staticTexts[@"Label"];
[self expectationForPredicate:[NSPredicate predicateWithFormat:@"exists == TRUE"]
evaluatedWithObject:label
handler:nil];
Demo
(https://github.com/muteKey/
WorkMailExample)
Полезное по unit testing
• https://github.com/specta/specta
• https://github.com/kiwi-bdd/Kiwi
• http://nshipster.com/xctestcase/
• https://www.objc.io/issues/15-testing/
• https://github.com/AliSoftware/OHHTTPStubs
• https://github.com/specta/expecta
• https://www.bignerdranch.com/blog/weve-got-you-covered/
• http://dou.ua/forums/topic/8897/
• https://habrahabr.ru/post/258953/
Полезное по UI testing
• https://youtu.be/58-Dfkt9HzU - неявные
зависимости, Dependency injection
• https://github.com/joemasilotti/UI-Testing-Cheat-
Sheet
• http://masilotti.com - блог о UI testing
Вопросы + контакты
• github: muteKey
• twitter: DeveloperKey

More Related Content

What's hot

Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...ISsoft
 
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»e-Legion
 
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQAFest
 
автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumvyacheslavmaslov
 
Tech Talks @NSU: Проходим тест Джоэла
Tech Talks @NSU: Проходим тест ДжоэлаTech Talks @NSU: Проходим тест Джоэла
Tech Talks @NSU: Проходим тест ДжоэлаTech Talks @NSU
 
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...SQALab
 
Team system - фреймворк для автоматизации тестирования от Microsoft
Team system -  фреймворк для автоматизации тестирования от MicrosoftTeam system -  фреймворк для автоматизации тестирования от Microsoft
Team system - фреймворк для автоматизации тестирования от MicrosoftQA Dnepropetrovsk Community (Ukraine)
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClub QA Kostroma
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кодаTatyanazaxarova
 
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...QA Club Minsk
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
 
Михаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииМихаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииYandex
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSProvectus
 
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...QA Club Minsk
 
Getting Tested: методология интеграционного тестирования
Getting Tested: методология интеграционного тестированияGetting Tested: методология интеграционного тестирования
Getting Tested: методология интеграционного тестированияAlexander Byndyu
 
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерах
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерахСпособы оптимизации ручного тестирования веб-сайтов в мобильных браузерах
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерахSQALab
 
Андрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolАндрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolQA Club Minsk
 
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...solit
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурцеAlexander Byndyu
 
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.SECON
 

What's hot (20)

Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
Инструменты автоматизации тестирования мобильных приложений. Сравнительный ан...
 
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»
Степан Гончаров «Тестирование Android-приложений с помощью Robotium и Spoon»
 
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
 
автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Selenium
 
Tech Talks @NSU: Проходим тест Джоэла
Tech Talks @NSU: Проходим тест ДжоэлаTech Talks @NSU: Проходим тест Джоэла
Tech Talks @NSU: Проходим тест Джоэла
 
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
 
Team system - фреймворк для автоматизации тестирования от Microsoft
Team system -  фреймворк для автоматизации тестирования от MicrosoftTeam system -  фреймворк для автоматизации тестирования от Microsoft
Team system - фреймворк для автоматизации тестирования от Microsoft
 
ClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDDClubQA #2. Unit testing and TDD
ClubQA #2. Unit testing and TDD
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кода
 
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
Эльдар Гусейнов "Эффективная архитектура мобильной автоматизации для проектов...
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработке
 
Михаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестированииМихаил Левин: Автоматизация в мобильном тестировании
Михаил Левин: Автоматизация в мобильном тестировании
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
 
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
Антон Семенченко, Никита Беликов "Инструменты автоматизации тестирования моби...
 
Getting Tested: методология интеграционного тестирования
Getting Tested: методология интеграционного тестированияGetting Tested: методология интеграционного тестирования
Getting Tested: методология интеграционного тестирования
 
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерах
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерахСпособы оптимизации ручного тестирования веб-сайтов в мобильных браузерах
Способы оптимизации ручного тестирования веб-сайтов в мобильных браузерах
 
Андрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation ToolАндрей Стахиевич - Appium Mobile Automation Tool
Андрей Стахиевич - Appium Mobile Automation Tool
 
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...
Solit 2014, Инструменты автоматизации тестирования мобильных приложений. Срав...
 
Приемочные тесты на огурце
Приемочные тесты на огурцеПриемочные тесты на огурце
Приемочные тесты на огурце
 
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.
SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.
 

Similar to UI+unit testing in iOS

XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureAnton Katkov
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish SQALab
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииCEE-SEC(R)
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyDmytro Zharii
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQAFest
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionAlbina Tiupa
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRAMBLER&Co
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в JavaKrivoy Rog IT Community
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Fwdays
 

Similar to UI+unit testing in iOS (20)

XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architecture
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
 
М. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с CodeceptionМ. Боднарчук Современное функциональное тестирование с Codeception
М. Боднарчук Современное функциональное тестирование с Codeception
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
 
Михаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с CodeceptionМихаил Боднарчук Современное функциональное тестирование с Codeception
Михаил Боднарчук Современное функциональное тестирование с Codeception
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Rambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOS
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
 

UI+unit testing in iOS

  • 1. Unit + UI testing in iOS Kirill Ushkov, itomych studio
  • 2. Зачем писать тесты? • экономия времени (тестировщиков, разработчиков) • неожиданная плюшка в виде дополнительной документации к коду • раннее (а не заказчиком) обнаружение проблем, далее см. пункт 1
  • 3. Техники тестирования • TDD - “разработка через тестирование”. Сначала пишем тест на новое требование, убеждаемся, что тест не проходит, потом пишем соответствующий код таким образом, чтобы тесты проходили • BDD - “разработка основанная на поведении”. Ответвление TDD, основная фишка - тесты оформляются “общедоступным языком” (ubiquitous language). Примеры на iOS - https://github.com/specta/specta, https:// github.com/kiwi-bdd/Kiwi
  • 4. Метрики тестирования • Покрытие кода тестами (code coverage) - мера того, насколько хорошо протестирован Ваш код
  • 5. Как то так это выглядит в Xcode
  • 6. Инструментарий юного тестировщика • Matcher - основной инструмент, помогает сравнивать величины (https://github.com/hamcrest/ OCHamcrest, https://github.com/specta/expecta) • Stub - заглушка, “заранее подготовленный” эталон (http://ocmock.org, https://github.com/ AliSoftware/OHHTTPStubs) • Mock - “макет” данных, эмуляция настоящих данных для проверки взаимодействий (http:// ocmock.org)
  • 7. Организация тестирования • Перед тестированием определенного метода необходимо четко определить какое поведение Вы хотите проверить, какой “кейс” рассмотреть • Для заглушек удобно использовать заготовленные данные в json, plist или xml формате - удобно редактировать.
  • 8. Организация тестируемого кода • Тестируемость кода ухудшают неявные зависимости: 
 
 [[KNAPIClient sharedClient] userOfferWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { KNUserOffer *offer = [KNUserOffer objectWithAttributes:responseObject]; KNUser *user = [KNDataManager sharedManager].appUser; user.currentUserOffer = offer; --wSelf.requestCounter; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"User offer %@", error); --wSelf.requestCounter; }];
  • 9. Dependency Injection • Сначала перемещаем методы запросов в отдельный протокол • Далее объявляем в базовом контроллере:
 @interface BaseViewController : UIViewController
 @property (nonatomic) id<KNNetworkProtocol> apiClient; @end • Наконец объявляем геттер таким образом:
 - (id<KNNetworkProtocol>)apiClient { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ #ifdef DEBUG _apiClient = [KNLocalClient sharedClient]; #elif RELEASE _apiClient = [KNAPIClient sharedClient]; #endif }); return _apiClient; }
  • 10. XCTest • Используется для тестирования кода в iOS • Каждый класс, тестирующий отдельный модуль, должен наследоваться от XCTestCase • Каждый тестирующий метод в этом классе должен начинаться со слова test. Можно избежать выполнения теста если добавить в название метода DISABLED_ • По умолчанию, все методы выполняются синхронно
  • 11. XCTest • Метод setup выполняется перед выполнением каждого теста, а метода teardown - после выполнения каждого теста • Возможна отладка тестирующих методов • Результаты каждой сессии тестирования записываются в лог файл, путь к нему прописывается в логах отладчика по окончанию тестирования
  • 12. Стоп, стоп, а как же асинхронные методы? • C iOS 8 появилось API для тестирования асинхронного выполнения кода XCTestExpectation: NSString *email = @"unknownEmail@gmail.com"; XCTestExpectation *expectation = [self expectationWithDescription:@"Handler called"]; [self.apiClient forgotPasswordWithRecoveryEmail:email withSuccessBlock:^(AFHTTPRequestOperation *operation, id response) { expect(nil).toNot.beNil; [expectation fulfill]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { expect(@(error.code)).to.equal(@(kCFURLErrorBadServerResponse)); [expectation fulfill]; }]; [self waitForExpectationsWithTimeout:self.expectationTimeOut handler:nil];
  • 13. HTTP Stubs • Если Вам необходимо проверить поведение приложения при получении ответов от сервера, то очень удобно использовать т.н. http stubs - таким образом можно протестировать поведение при “медленном” интернете или при его отсутствии
  • 14. OHHTTPStubs • Основная идея такая - сначала Вы определяете набор запросов по некоторым признакам, а затем эмулируете ответ от сервера
 
 OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest * _Nonnull request) { return [request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path containsString:@"user"]; } withStubResponse:^OHHTTPStubsResponse * _Nonnull(NSURLRequest * _Nonnull request) { return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFile(@"User.json", [self class]) statusCode:200 headers:headers]; }];
  • 15. OHHTTPStubs:on stub activation • Также есть возможность отловить срабатывание определенной “заглушки”:
 
 [OHHTTPStubs onStubActivation:^(NSURLRequest *request, id<OHHTTPStubsDescriptor> stub) { NSLog(@"[OHHTTPStubs] Request to %@ has been stubbed with %@", request.URL, stub.name); }];
  • 17. Тестирование UI • Механика создания UI-тестов такая: • Вначале “записываем” взаимодействие с UI • Далее автоматически записываются наши действия в виде кода • Ставим нужные проверки внутри кода • Прогонка теста
  • 18. Тестирование UI • Фича доступна с iOS 9, поэтому минимальный таргет должен быть iOS 9, в противном случае не будет доступна (или совсем отсутствовать кнопка записи) • Есть несколько основных классов: XCUIElementQuery, XCUIApplication, XCUIElement
  • 19. Expectations • Есть возможность дождаться появления некоторого элемента UI:
 
 XCUIApplication *app = [[XCUIApplication alloc] init]; XCUIElement *label = app.staticTexts[@"Label"]; [self expectationForPredicate:[NSPredicate predicateWithFormat:@"exists == TRUE"] evaluatedWithObject:label handler:nil];
  • 21. Полезное по unit testing • https://github.com/specta/specta • https://github.com/kiwi-bdd/Kiwi • http://nshipster.com/xctestcase/ • https://www.objc.io/issues/15-testing/ • https://github.com/AliSoftware/OHHTTPStubs • https://github.com/specta/expecta • https://www.bignerdranch.com/blog/weve-got-you-covered/ • http://dou.ua/forums/topic/8897/ • https://habrahabr.ru/post/258953/
  • 22. Полезное по UI testing • https://youtu.be/58-Dfkt9HzU - неявные зависимости, Dependency injection • https://github.com/joemasilotti/UI-Testing-Cheat- Sheet • http://masilotti.com - блог о UI testing
  • 23. Вопросы + контакты • github: muteKey • twitter: DeveloperKey