Upload
marat-akhin
View
276
Download
1
Embed Size (px)
Citation preview
Проблема наблюдаемостиSoftware Testing 101
Марат Ахин
Санкт-Петербургский государственный политехнический университет
2014
Марат Ахин (СПбГПУ) NP 2014 110 / 320
Quiz
Марат Ахин (СПбГПУ) NP 2014 111 / 320
Recap
Марат Ахин (СПбГПУ) NP 2014 112 / 320
Проблемы тестирования Проблемы тестирования
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данныхПроблема наблюдаемостиПроблема «останова»Проблема тестового оракула
Марат Ахин (СПбГПУ) NP 2014 113 / 320
Проблема наблюдаемости
Содержание
1 Проблема наблюдаемостиОбеспечение распространения сбояAssertionsЖурналирование
Марат Ахин (СПбГПУ) NP 2014 114 / 320
Проблема наблюдаемости Обеспечение распространения сбоя
Обеспечение распространения сбоя
Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода
Необходимо обнаружить сбой и распространить его, сделавнаблюдаемым снаружи (Propagation)
Марат Ахин (СПбГПУ) NP 2014 115 / 320
Проблема наблюдаемости Обеспечение распространения сбоя
Обеспечение распространения сбоя
Марат Ахин (СПбГПУ) NP 2014 116 / 320
Проблема наблюдаемости Assertions
Assertions
Основной способ обеспечения наблюдаемости – assertions
1 private void checkInvariants () {2 assert elements[tail] == null;3 assert head == tail4 ? elements[head] == null5 : (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
Проблема наблюдаемости Assertions
Assertions
Что такое assertion?
Формула в логике первого порядкаПроверяется на истинность во время выполнения программыТакже может проверяться на истинность статическиДопускает возможность отключения проверки истинности
Марат Ахин (СПбГПУ) NP 2014 118 / 320
Проблема наблюдаемости Assertions
Что дает использование assertions?
Проверка корректности внутреннего состояния
Внутреннее состояние обычно недоступно снаружи (полностьюили частично)При изменении состояния хочется проверить, что оно остаетсякорректным
Марат Ахин (СПбГПУ) NP 2014 119 / 320
Проблема наблюдаемости Assertions
Что дает использование assertions?
Неудача происходит ближе к причине ее возникновения
Чем больше задержка перед обнаружением неудачи, тем сложнеенайти ее исходную причинуAssertions позволяют найти неудачу практически в любой точкепрограммы
Марат Ахин (СПбГПУ) NP 2014 120 / 320
Проблема наблюдаемости Assertions
Что дает использование assertions?
Явное документирование пред- и пост-условий
В общем случае программист ничего не знает о контрактеиспользуемой функцииИспользование assertions позволяет в явном виде описатьвнешний контракт функции
Марат Ахин (СПбГПУ) NP 2014 121 / 320
Проблема наблюдаемости Assertions
Assertions
Марат Ахин (СПбГПУ) NP 2014 122 / 320
Проблема наблюдаемости Assertions
Какие проблемы связаны с assertions?
Ошибки в assertions
Побочные эффекты в assertionsНеправильное логическое условие срабатывания
Марат Ахин (СПбГПУ) NP 2014 123 / 320
Проблема наблюдаемости Assertions
Какие проблемы связаны с assertions?
Влияние на производительность
Проверка assertions занимает времяЧем сложнее assertion, тем больше он замедляет работупрограммы
Марат Ахин (СПбГПУ) NP 2014 124 / 320
Проблема наблюдаемости Assertions
Какие проблемы связаны с assertions?
Эффект «вышибалы»
Сработавший assertion превращает любую ошибку в неудачуЭто полностью останавливает возможность дальнейшеготестирования
Марат Ахин (СПбГПУ) NP 2014 125 / 320
Проблема наблюдаемости Assertions
Какие проблемы связаны с assertions?
Сложность проверки определенных условий
Некоторые просто формулируемые условия крайне сложнопроверить на практикеИх реализация в виде assertion является крайне затруднительной
Марат Ахин (СПбГПУ) NP 2014 126 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?
Марат Ахин (СПбГПУ) NP 2014 127 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?
1 int* ptr = malloc(sizeof(int) * 10);2 assert(ptr);
Адекватный assertion в правильном месте
Марат Ахин (СПбГПУ) NP 2014 128 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?
1 int* ptr = malloc(sizeof(int) * 10);2 assert(ptr);
Замена обработки ошибок на assertion
Марат Ахин (СПбГПУ) NP 2014 129 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?
Марат Ахин (СПбГПУ) NP 2014 130 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?
Microsoft Office ≈ 1%Proprietary software ≈ 3%Open source software ≈ 5%Eiffel software ≈ 7%
Сейчас assertions используются еще более широко
Марат Ахин (СПбГПУ) NP 2014 131 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?1
LLVM
≈ 500,000 SLOC≈ 7000 assertions> 400 ошибок, относящихся к assertions
1http://blog.regehr.org/Марат Ахин (СПбГПУ) NP 2014 132 / 320
Проблема наблюдаемости Assertions
Работают ли assertions?1
GCC
≈ 1,000,000 SLOC≈ 9500 assertions> 200 ошибок, относящихся к assertions
1http://blog.regehr.org/Марат Ахин (СПбГПУ) NP 2014 132 / 320
Проблема наблюдаемости Журналирование
Журналирование
Марат Ахин (СПбГПУ) NP 2014 133 / 320
Проблема наблюдаемости Журналирование
Журналирование
Журналирование (logging)
Запись хода выполнения программы в том или ином видеВ зависимости от необходимости журнал может быть более илименее детализированнымПо журналу выполнения при необходимости возможновосстановить причину возникшей ошибки
Марат Ахин (СПбГПУ) NP 2014 134 / 320
Проблема наблюдаемости Журналирование
Журналирование
Журналирование дляпользователя
ВысокоуровневыесообщенияКак можно меньше«мусора»Чем проще и понятнееформат сообщений, темлучше
Журналирование дляпрограммиста
НизкоуровневыесообщенияДопустим любой шумНикаких ограничений наформат сообщений
Марат Ахин (СПбГПУ) NP 2014 135 / 320
Проблема наблюдаемости Журналирование
Как вести журнал?
1 Result ::Ptr processBatchJob(Job::Ptr job) {2 // do the heavy lifting ...3 }
Как записать ход выполнения программы?
Марат Ахин (СПбГПУ) NP 2014 136 / 320
Проблема наблюдаемости Журналирование
Как вести журнал?
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
Проблема наблюдаемости Журналирование
Как вести журнал?
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
Проблема наблюдаемости Журналирование
Как вести журнал?
Logging as a Service
Марат Ахин (СПбГПУ) NP 2014 139 / 320
Проблема наблюдаемости Журналирование
Основная проблема журналирования
INFO [http -thread -pool -8080(5)] Received token: e6749451TRACE [http -thread -pool -8080(5)] Calling: AuthStorageBean.getAuthDataTRACE [http -thread -pool -8080(5)] Called: AuthStorageBean.getAuthData -> 2.0708E-5INFO [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.getAuthDateTimeTRACE [http -thread -pool -8080(5)] Called: AuthStorageBean.getAuthDateTime -> 1.9825E-5INFO [http -thread -pool -8080(5)] Token is valid
TRACE [http -thread -pool -8080(5)] attempting to get session; create = false; session isnull = 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 fortokenCredentials 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 tobyte 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
Проблема наблюдаемости Журналирование
Основная проблема журналирования
Чем больше мы хотим узнать о ходе выполнения программы, тембольше мы должны журналироватьЧем больше мы журналируем, тем сложнее разобраться в журналеЧем сложнее разобраться в журнале, тем меньше мы знаем о ходевыполнения программы
Марат Ахин (СПбГПУ) NP 2014 141 / 320
Проблема наблюдаемости Журналирование
Ограничение размера журнала
Необходимо ограничивать размер записываемых данных
Марат Ахин (СПбГПУ) NP 2014 142 / 320
Проблема наблюдаемости Журналирование
Уровни журналирования
Сообщения пишутся в журнал с определенным уровнемВ дальнейшем возможно фильтровать сообщения по уровням
Error / Warning / Info / Debug / Trace
Марат Ахин (СПбГПУ) NP 2014 143 / 320
Проблема наблюдаемости Журналирование
Домены журналирования
Домены ортогональны уровням журналированияВ зависимости от типа сообщения пишутся в разные домены
Database / Network / UI / Configuration / ...
Марат Ахин (СПбГПУ) NP 2014 144 / 320
Проблема наблюдаемости Журналирование
Стохастическое журналирование
В случае, если какие-то события встречаются очень часто,достаточно записывать лишь их часть
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
Проблема наблюдаемости Журналирование
Сессионное журналирование
Часто работа ПО разбита на набор слабо связанных сессийКаждая сессия может журналироваться независимо от других
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
W.I.L.T. What I Learned Today?
W.I.L.T.
Марат Ахин (СПбГПУ) NP 2014 147 / 320