Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Проблема наблюдаемости

705 views

Published on

Published in: Education
  • Be the first to comment

  • Be the first to like this

Проблема наблюдаемости

  1. 1. Проблема наблюдаемости Software Testing 101 Марат Ахин Санкт-Петербургский государственный политехнический университет 2014 Марат Ахин (СПбГПУ) NP 2014 110 / 320
  2. 2. Quiz Марат Ахин (СПбГПУ) NP 2014 111 / 320
  3. 3. Recap Марат Ахин (СПбГПУ) NP 2014 112 / 320
  4. 4. Проблемы тестирования Проблемы тестирования Проблемы тестирования What’s up, Doc? (с) Проблема тестовых входных данных Проблема наблюдаемости Проблема «останова» Проблема тестового оракула Марат Ахин (СПбГПУ) NP 2014 113 / 320
  5. 5. Проблема наблюдаемости Содержание 1 Проблема наблюдаемости Обеспечение распространения сбоя Assertions Журналирование Марат Ахин (СПбГПУ) NP 2014 114 / 320
  6. 6. Проблема наблюдаемости Обеспечение распространения сбоя Обеспечение распространения сбоя Какими способами можно управлять выполнением кода? Изменением входных данных Изменением самого исходного кода Необходимо обнаружить сбой и распространить его, сделав наблюдаемым снаружи (Propagation) Марат Ахин (СПбГПУ) NP 2014 115 / 320
  7. 7. Проблема наблюдаемости Обеспечение распространения сбоя Обеспечение распространения сбоя Марат Ахин (СПбГПУ) NP 2014 116 / 320
  8. 8. Проблема наблюдаемости Assertions Assertions Основной способ обеспечения наблюдаемости – assertions 1 private void checkInvariants () { 2 assert elements[tail] == null; 3 assert head == tail 4 ? elements[head] == null 5 : (elements[head] != null && 6 elements [( tail - 1) & (elements.length - 1)] != null ); 7 assert elements [( head - 1) & (elements.length - 1)] == null; 8 } Марат Ахин (СПбГПУ) NP 2014 117 / 320
  9. 9. Проблема наблюдаемости Assertions Assertions Что такое assertion? Формула в логике первого порядка Проверяется на истинность во время выполнения программы Также может проверяться на истинность статически Допускает возможность отключения проверки истинности Марат Ахин (СПбГПУ) NP 2014 118 / 320
  10. 10. Проблема наблюдаемости Assertions Что дает использование assertions? Проверка корректности внутреннего состояния Внутреннее состояние обычно недоступно снаружи (полностью или частично) При изменении состояния хочется проверить, что оно остается корректным Марат Ахин (СПбГПУ) NP 2014 119 / 320
  11. 11. Проблема наблюдаемости Assertions Что дает использование assertions? Неудача происходит ближе к причине ее возникновения Чем больше задержка перед обнаружением неудачи, тем сложнее найти ее исходную причину Assertions позволяют найти неудачу практически в любой точке программы Марат Ахин (СПбГПУ) NP 2014 120 / 320
  12. 12. Проблема наблюдаемости Assertions Что дает использование assertions? Явное документирование пред- и пост-условий В общем случае программист ничего не знает о контракте используемой функции Использование assertions позволяет в явном виде описать внешний контракт функции Марат Ахин (СПбГПУ) NP 2014 121 / 320
  13. 13. Проблема наблюдаемости Assertions Assertions Марат Ахин (СПбГПУ) NP 2014 122 / 320
  14. 14. Проблема наблюдаемости Assertions Какие проблемы связаны с assertions? Ошибки в assertions Побочные эффекты в assertions Неправильное логическое условие срабатывания Марат Ахин (СПбГПУ) NP 2014 123 / 320
  15. 15. Проблема наблюдаемости Assertions Какие проблемы связаны с assertions? Влияние на производительность Проверка assertions занимает время Чем сложнее assertion, тем больше он замедляет работу программы Марат Ахин (СПбГПУ) NP 2014 124 / 320
  16. 16. Проблема наблюдаемости Assertions Какие проблемы связаны с assertions? Эффект «вышибалы» Сработавший assertion превращает любую ошибку в неудачу Это полностью останавливает возможность дальнейшего тестирования Марат Ахин (СПбГПУ) NP 2014 125 / 320
  17. 17. Проблема наблюдаемости Assertions Какие проблемы связаны с assertions? Сложность проверки определенных условий Некоторые просто формулируемые условия крайне сложно проверить на практике Их реализация в виде assertion является крайне затруднительной Марат Ахин (СПбГПУ) NP 2014 126 / 320
  18. 18. Проблема наблюдаемости Assertions Работают ли assertions? Марат Ахин (СПбГПУ) NP 2014 127 / 320
  19. 19. Проблема наблюдаемости Assertions Работают ли assertions? 1 int* ptr = malloc(sizeof(int) * 10); 2 assert(ptr); Адекватный assertion в правильном месте Марат Ахин (СПбГПУ) NP 2014 128 / 320
  20. 20. Проблема наблюдаемости Assertions Работают ли assertions? 1 int* ptr = malloc(sizeof(int) * 10); 2 assert(ptr); Замена обработки ошибок на assertion Марат Ахин (СПбГПУ) NP 2014 129 / 320
  21. 21. Проблема наблюдаемости Assertions Работают ли assertions? Марат Ахин (СПбГПУ) NP 2014 130 / 320
  22. 22. Проблема наблюдаемости Assertions Работают ли assertions? Microsoft Office ≈ 1% Proprietary software ≈ 3% Open source software ≈ 5% Eiffel software ≈ 7% Сейчас assertions используются еще более широко Марат Ахин (СПбГПУ) NP 2014 131 / 320
  23. 23. Проблема наблюдаемости Assertions Работают ли assertions?1 LLVM ≈ 500,000 SLOC ≈ 7000 assertions > 400 ошибок, относящихся к assertions 1 http://blog.regehr.org/ Марат Ахин (СПбГПУ) NP 2014 132 / 320
  24. 24. Проблема наблюдаемости Assertions Работают ли assertions?1 GCC ≈ 1,000,000 SLOC ≈ 9500 assertions > 200 ошибок, относящихся к assertions 1 http://blog.regehr.org/ Марат Ахин (СПбГПУ) NP 2014 132 / 320
  25. 25. Проблема наблюдаемости Журналирование Журналирование Марат Ахин (СПбГПУ) NP 2014 133 / 320
  26. 26. Проблема наблюдаемости Журналирование Журналирование Журналирование (logging) Запись хода выполнения программы в том или ином виде В зависимости от необходимости журнал может быть более или менее детализированным По журналу выполнения при необходимости возможно восстановить причину возникшей ошибки Марат Ахин (СПбГПУ) NP 2014 134 / 320
  27. 27. Проблема наблюдаемости Журналирование Журналирование Журналирование для пользователя Высокоуровневые сообщения Как можно меньше «мусора» Чем проще и понятнее формат сообщений, тем лучше Журналирование для программиста Низкоуровневые сообщения Допустим любой шум Никаких ограничений на формат сообщений Марат Ахин (СПбГПУ) NP 2014 135 / 320
  28. 28. Проблема наблюдаемости Журналирование Как вести журнал? 1 Result :: Ptr processBatchJob (Job :: Ptr job) { 2 // do the heavy lifting ... 3 } Как записать ход выполнения программы? Марат Ахин (СПбГПУ) NP 2014 136 / 320
  29. 29. Проблема наблюдаемости Журналирование Как вести журнал? 1 Result :: Ptr ThreadedProcessor :: processBatchJob (Job:: Ptr job) { 2 log () << "Start of: " << job << endl; 3 // do the heavy lifting ... 4 log () << "End of: " << job << endl; 5 } Ручная вставка журналирующих вызовов Марат Ахин (СПбГПУ) NP 2014 137 / 320
  30. 30. Проблема наблюдаемости Журналирование Как вести журнал? 1 aspect ProcessTracer { 2 advice call("% %Processor :: process %(%)") : before () { 3 log () << "Start of: " << * JoinedPoint ::arg <0 >() << endl; 4 } 5 advice call("% %Processor :: process %(%)") : after () { 6 log () << "End of: " << *JoinedPoint ::arg <0 >() << endl; 7 } 8 }; Журналирующие аспекты / интерсепторы Марат Ахин (СПбГПУ) NP 2014 138 / 320
  31. 31. Проблема наблюдаемости Журналирование Как вести журнал? Logging as a Service Марат Ахин (СПбГПУ) NP 2014 139 / 320
  32. 32. Проблема наблюдаемости Журналирование Основная проблема журналирования INFO [http -thread -pool -8080(5)] Received token: e6749451 TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthData TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean .getAuthData -> 2.0708E-5 INFO [http -thread -pool -8080(5)] Authentication data found: AuthData { authToken:e6749451 userId :1 firstName: lastName:Admin patrName: role:ru.korus.tmis.core.entity.model. Role[id=1] spec: } TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean . getAuthDateTime TRACE [http -thread -pool -8080(5)] Called: AuthStorageBean . getAuthDateTime -> 1.9825E-5 INFO [http -thread -pool -8080(5)] Token is valid TRACE [http -thread -pool -8080(5)] attempting to get session; create = false; session is null = true; session has id = false TRACE [http -thread -pool -8080(5)] Authentication attempt received for token [ru.korus.tmis .core.auth. TmisShiroToken@37bd2b6 ] DEBUG [http -thread -pool -8080(5)] Performing credentials equality check for tokenCredentials of type [java.lang.String and accountCredentials of type [java.lang .String] DEBUG [http -thread -pool -8080(5)] Both credentials arguments can be easily converted to byte arrays. Performing array equals comparison DEBUG [http -thread -pool -8080(5)] Authentication successful for token [ru.korus.tmis.core. auth. TmisShiroToken@37bd2b6 ]. Returned account [(admin ,ru.korus.tmis.core.entity. model.Role[id =1])] DEBUG [http -thread -pool -8080(5)] No SecurityManager available in subject context map. Falling back to SecurityUtils . getSecurityManager () lookup. Too much data! Марат Ахин (СПбГПУ) NP 2014 140 / 320
  33. 33. Проблема наблюдаемости Журналирование Основная проблема журналирования Чем больше мы хотим узнать о ходе выполнения программы, тем больше мы должны журналировать Чем больше мы журналируем, тем сложнее разобраться в журнале Чем сложнее разобраться в журнале, тем меньше мы знаем о ходе выполнения программы Марат Ахин (СПбГПУ) NP 2014 141 / 320
  34. 34. Проблема наблюдаемости Журналирование Ограничение размера журнала Необходимо ограничивать размер записываемых данных Марат Ахин (СПбГПУ) NP 2014 142 / 320
  35. 35. Проблема наблюдаемости Журналирование Уровни журналирования Сообщения пишутся в журнал с определенным уровнем В дальнейшем возможно фильтровать сообщения по уровням Error / Warning / Info / Debug / Trace Марат Ахин (СПбГПУ) NP 2014 143 / 320
  36. 36. Проблема наблюдаемости Журналирование Домены журналирования Домены ортогональны уровням журналирования В зависимости от типа сообщения пишутся в разные домены Database / Network / UI / Configuration / ... Марат Ахин (СПбГПУ) NP 2014 144 / 320
  37. 37. Проблема наблюдаемости Журналирование Стохастическое журналирование В случае, если какие-то события встречаются очень часто, достаточно записывать лишь их часть 1 if (_ok == true) { 2 _logger.log( Level.WARNING , "Server seen down: " + _addr , e ); 3 } else if (Math.random () < 0.1) { 4 _logger.log( Level.WARNING , "Server seen down: " + _addr ); 5 } Марат Ахин (СПбГПУ) NP 2014 145 / 320
  38. 38. Проблема наблюдаемости Журналирование Сессионное журналирование Часто работа ПО разбита на набор слабо связанных сессий Каждая сессия может журналироваться независимо от других 1 try { 2 // logging ... 3 } catch (Exception ex) { 4 ctx.logging. dumpCurrentSession (); 5 throw; 6 } finally { 7 ctx.logging.reset (); 8 } Марат Ахин (СПбГПУ) NP 2014 146 / 320
  39. 39. W.I.L.T. What I Learned Today? W.I.L.T. Марат Ахин (СПбГПУ) NP 2014 147 / 320

×