Модульное тестирование iOS-приложений TDD: All code is guilty until it's proven innocent @implementation  RpnCalculatorTes...
Тестирование ПО <ul><li>Модульное (unit testing) </li></ul><ul><li>Интеграционное (integration testing) </li></ul><ul><li>...
Test-driven development (TDD) <ul><li>test </li></ul><ul><li>code </li></ul><ul><li>refactor </li></ul>
Test first! <ul><li>Сначала создается набор тестов... </li></ul><ul><li>... и только потом пишется код! </li></ul>
Модульное тестирование (unit testing) <ul><li>тестируется минимально возможный для тестирования компонент, например, отдел...
Зачем? <ul><li>Отдельные части системы протестированы еще до реализации </li></ul><ul><li>Требуется меньше времени на отла...
Еще варианты <ul><li>Тесты на bug report/feedback </li></ul><ul><li>Тесты на унаследованнный код </li></ul><ul><li>Тесты к...
Процесс <ul><li>Подготовка тестовых (входных и выходных) данных </li></ul><ul><li>Запуск тестов </li></ul><ul><li>Проверка...
iOS <ul><li>Что тестировать? </li></ul><ul><li>Какими инструментами? </li></ul>
Что тестировать? <ul><li>Бизнес-логика, работа алгоритмов </li></ul><ul><li>Протоколы взаимодействия с сервером </li></ul>...
Тест не является unit-тестом, если он... <ul><li>подключается к реальной базе данных; </li></ul><ul><li>работает с сетью; ...
<ul><li>Устарел </li></ul><ul><li>Сложен в настройке </li></ul><ul><li>Неудобен в использовании </li></ul><ul><li>Хорош дл...
Примеры <ul><li>-( void ) setUp {   helper  = [ RequestHelper   newRequestHelperWithBaseURL : @&quot;http://mlsdev.com/ind...
Примеры <ul><li>-( void ) testEncodedUrlString {   NSMutableDictionary * params = [ NSMutableDictionary   dictionaryWithOb...
Behavior-driven development <ul><li>Syntactic sugar </li></ul><ul><li>“ it should” вместо “test” </li></ul><ul><li>Matcher...
Cedar by Pivotal Labs <ul><li>BDD-style </li></ul><ul><li>Удобен в использовании </li></ul><ul><li>Универсален (позволяет ...
Примеры <ul><li>b eforeEach (^{   mockAgentDelegate = [ OCMockObject   mockForProtocol : @protocol (LandingAgentDelegate)]...
 
Спасибо! ;)
Upcoming SlideShare
Loading in …5
×

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

2,021 views

Published on

Published in: Technology, Design
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,021
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Модульное тестирование iOS-приложений TDD: All code is guilty until it's proven innocent @implementation RpnCalculatorTestCase -( void )setUp { rpnCalculator = [[ RpnCalculator alloc ] init ]; } -( void )testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{ [ rpnCalculator put : @&quot;1&quot; ]; [ rpnCalculator put : @&quot;enter&quot; ]; [ rpnCalculator put : @&quot;2&quot; ];! STAssertEqualObjects ( @&quot;1n2&quot; , rpnCalculator . display , nil ); } -( void )tearDown{ [ rpnCalculator release ]; } Антон Сахаров mlsdev.com
  2. 2. Тестирование ПО <ul><li>Модульное (unit testing) </li></ul><ul><li>Интеграционное (integration testing) </li></ul><ul><li>Регрессионное (regression testing) </li></ul><ul><li>Системное (system testing) </li></ul><ul><li>... </li></ul>
  3. 3. Test-driven development (TDD) <ul><li>test </li></ul><ul><li>code </li></ul><ul><li>refactor </li></ul>
  4. 4. Test first! <ul><li>Сначала создается набор тестов... </li></ul><ul><li>... и только потом пишется код! </li></ul>
  5. 5. Модульное тестирование (unit testing) <ul><li>тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция. </li></ul>-( 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); }
  6. 6. Зачем? <ul><li>Отдельные части системы протестированы еще до реализации </li></ul><ul><li>Требуется меньше времени на отладку </li></ul><ul><li>Код, который хорошо структурирован и прост в поддержке </li></ul><ul><li>Минимизация риска возникновения новых ошибок при добавлении новой функциональности </li></ul><ul><li>Тесты как документация </li></ul>
  7. 7. Еще варианты <ul><li>Тесты на bug report/feedback </li></ul><ul><li>Тесты на унаследованнный код </li></ul><ul><li>Тесты как документация </li></ul><ul><li>Когда непонятно с чего начать </li></ul>
  8. 8. Процесс <ul><li>Подготовка тестовых (входных и выходных) данных </li></ul><ul><li>Запуск тестов </li></ul><ul><li>Проверка результатов </li></ul><ul><li>Удаление тестовых данных, освобождение ресурсов </li></ul>
  9. 9. iOS <ul><li>Что тестировать? </li></ul><ul><li>Какими инструментами? </li></ul>
  10. 10. Что тестировать? <ul><li>Бизнес-логика, работа алгоритмов </li></ul><ul><li>Протоколы взаимодействия с сервером </li></ul><ul><li>Парсинг </li></ul><ul><li>User Interface, User eXperience </li></ul>
  11. 11. Тест не является unit-тестом, если он... <ul><li>подключается к реальной базе данных; </li></ul><ul><li>работает с сетью; </li></ul><ul><li>взаимодействует с файловой системой; </li></ul><ul><li>тестирует несколько классов и их взаимодействие. </li></ul>
  12. 12. <ul><li>Устарел </li></ul><ul><li>Сложен в настройке </li></ul><ul><li>Неудобен в использовании </li></ul><ul><li>Хорош для того, чтобы начать практиковать TDD </li></ul>
  13. 13. Примеры <ul><li>-( void ) setUp { helper = [ RequestHelper newRequestHelperWithBaseURL : @&quot;http://mlsdev.com/index.php&quot; ]; [ helper retain ]; } </li></ul><ul><li>-( void ) tearDown { [ helper release ]; } -( void ) testFormatQuery { NSMutableDictionary * params = [ NSMutableDictionary dictionaryWithObjectsAndKeys : @&quot;realsugar&quot; , @&quot;login&quot; , @&quot;secret&quot; , @&quot;password&quot; , nil ]; NSString * query = [ helper formatQuery :params]; STAssertTrue ([query hasPrefix: @&quot;?&quot; ], query); </li></ul><ul><li>NSString * argStr = [query stringByReplacingOccurrencesOfString : @&quot;?&quot; withString : @&quot;&quot; ]; NSArray * args = [argStr componentsSeparatedByString : @&quot;&&quot; ]; </li></ul><ul><li>STAssertEquals ( 2U , [args count], nil ); } </li></ul><ul><li>-( void ) testQueryFormatParams { NSMutableDictionary * params = [ NSMutableDictionary dictionaryWithObjectsAndKeys : @&quot;realsugar&quot; , @&quot;login&quot; , @&quot;secret&quot; , @&quot;password&quot; , nil ]; </li></ul><ul><li>NSString * query = [ helper formatQuery :params]; NSString * match = [query stringByMatching : @&quot;^?(?:[ dw]+=[dw ]+|&)+$&quot; ]; STAssertTrue ([match isEqualToString:query], match); } </li></ul>
  14. 14. Примеры <ul><li>-( void ) testEncodedUrlString { NSMutableDictionary * params = [ NSMutableDictionary dictionaryWithObjectsAndKeys : @&quot;Anton Sakharov&quot; , @&quot;fullname&quot; , nil ]; NSString * url = [ helper encodedUrlString : params]; </li></ul><ul><li>STAssertTrue ([url isEqualToString: @&quot;http://mlsdev.com/index.php?fullname=Anton%20Sakharov&quot; ], url); } </li></ul>
  15. 15. Behavior-driven development <ul><li>Syntactic sugar </li></ul><ul><li>“ it should” вместо “test” </li></ul><ul><li>Matchers вместо assert </li></ul>
  16. 16. Cedar by Pivotal Labs <ul><li>BDD-style </li></ul><ul><li>Удобен в использовании </li></ul><ul><li>Универсален (позволяет тестировать логику, UI, ...) </li></ul>
  17. 17. Примеры <ul><li>b eforeEach (^{ mockAgentDelegate = [ OCMockObject mockForProtocol : @protocol (LandingAgentDelegate)]; agent = [[LandingAgent alloc ] initWithDelegate :mockAgentDelegate]; }); </li></ul><ul><li>a fterEach (^{ [agent release ]; }); </li></ul><ul><li>describe( @&quot;logIn&quot; , ^{ __block NSURLConnection *logInConnection; beforeEach(^{ [agent logIn ]; logInConnection = [[NSURLConnection connections ] lastObject ]; }); </li></ul><ul><li>it ( @&quot;should try to log into Tracker&quot; , ^{ assertThat([[[logInConnection request ] URL ] path ], endsWith( @&quot;tokens/active&quot; )); }); ... </li></ul>
  18. 19. Спасибо! ;)

×