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

39
Проблема наблюдаемости Software Testing 101 Марат Ахин Санкт-Петербургский государственный политехнический университет 2014 Марат Ахин (СПбГПУ) NP 2014 110 / 320

Upload: marat-akhin

Post on 24-Jun-2015

263 views

Category:

Education


1 download

TRANSCRIPT

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

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

Марат Ахин

Санкт-Петербургский государственный политехнический университет

2014

Марат Ахин (СПбГПУ) NP 2014 110 / 320

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

Quiz

Марат Ахин (СПбГПУ) NP 2014 111 / 320

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

Recap

Марат Ахин (СПбГПУ) NP 2014 112 / 320

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

Проблемы тестирования Проблемы тестирования

Проблемы тестирования

What’s up, Doc? (с)

Проблема тестовых входных данныхПроблема наблюдаемостиПроблема «останова»Проблема тестового оракула

Марат Ахин (СПбГПУ) NP 2014 113 / 320

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

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

Содержание

1 Проблема наблюдаемостиОбеспечение распространения сбояAssertionsЖурналирование

Марат Ахин (СПбГПУ) NP 2014 114 / 320

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

Проблема наблюдаемости Обеспечение распространения сбоя

Обеспечение распространения сбоя

Какими способами можно управлять выполнением кода?Изменением входных данныхИзменением самого исходного кода

Необходимо обнаружить сбой и распространить его, сделавнаблюдаемым снаружи (Propagation)

Марат Ахин (СПбГПУ) NP 2014 115 / 320

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

Проблема наблюдаемости Обеспечение распространения сбоя

Обеспечение распространения сбоя

Марат Ахин (СПбГПУ) NP 2014 116 / 320

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

Проблема наблюдаемости 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

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

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

Assertions

Что такое assertion?

Формула в логике первого порядкаПроверяется на истинность во время выполнения программыТакже может проверяться на истинность статическиДопускает возможность отключения проверки истинности

Марат Ахин (СПбГПУ) NP 2014 118 / 320

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

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

Что дает использование assertions?

Проверка корректности внутреннего состояния

Внутреннее состояние обычно недоступно снаружи (полностьюили частично)При изменении состояния хочется проверить, что оно остаетсякорректным

Марат Ахин (СПбГПУ) NP 2014 119 / 320

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

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

Что дает использование assertions?

Неудача происходит ближе к причине ее возникновения

Чем больше задержка перед обнаружением неудачи, тем сложнеенайти ее исходную причинуAssertions позволяют найти неудачу практически в любой точкепрограммы

Марат Ахин (СПбГПУ) NP 2014 120 / 320

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

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

Что дает использование assertions?

Явное документирование пред- и пост-условий

В общем случае программист ничего не знает о контрактеиспользуемой функцииИспользование assertions позволяет в явном виде описатьвнешний контракт функции

Марат Ахин (СПбГПУ) NP 2014 121 / 320

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

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

Assertions

Марат Ахин (СПбГПУ) NP 2014 122 / 320

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

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

Какие проблемы связаны с assertions?

Ошибки в assertions

Побочные эффекты в assertionsНеправильное логическое условие срабатывания

Марат Ахин (СПбГПУ) NP 2014 123 / 320

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

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

Какие проблемы связаны с assertions?

Влияние на производительность

Проверка assertions занимает времяЧем сложнее assertion, тем больше он замедляет работупрограммы

Марат Ахин (СПбГПУ) NP 2014 124 / 320

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

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

Какие проблемы связаны с assertions?

Эффект «вышибалы»

Сработавший assertion превращает любую ошибку в неудачуЭто полностью останавливает возможность дальнейшеготестирования

Марат Ахин (СПбГПУ) NP 2014 125 / 320

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

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

Какие проблемы связаны с assertions?

Сложность проверки определенных условий

Некоторые просто формулируемые условия крайне сложнопроверить на практикеИх реализация в виде assertion является крайне затруднительной

Марат Ахин (СПбГПУ) NP 2014 126 / 320

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

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

Работают ли assertions?

Марат Ахин (СПбГПУ) NP 2014 127 / 320

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

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

Работают ли assertions?

1 int* ptr = malloc(sizeof(int) * 10);2 assert(ptr);

Адекватный assertion в правильном месте

Марат Ахин (СПбГПУ) NP 2014 128 / 320

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

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

Работают ли assertions?

1 int* ptr = malloc(sizeof(int) * 10);2 assert(ptr);

Замена обработки ошибок на assertion

Марат Ахин (СПбГПУ) NP 2014 129 / 320

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

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

Работают ли assertions?

Марат Ахин (СПбГПУ) NP 2014 130 / 320

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

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

Работают ли assertions?

Microsoft Office ≈ 1%Proprietary software ≈ 3%Open source software ≈ 5%Eiffel software ≈ 7%

Сейчас assertions используются еще более широко

Марат Ахин (СПбГПУ) NP 2014 131 / 320

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

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

Работают ли assertions?1

LLVM

≈ 500,000 SLOC≈ 7000 assertions> 400 ошибок, относящихся к assertions

1http://blog.regehr.org/Марат Ахин (СПбГПУ) NP 2014 132 / 320

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

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

Работают ли assertions?1

GCC

≈ 1,000,000 SLOC≈ 9500 assertions> 200 ошибок, относящихся к assertions

1http://blog.regehr.org/Марат Ахин (СПбГПУ) NP 2014 132 / 320

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

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

Журналирование

Марат Ахин (СПбГПУ) NP 2014 133 / 320

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

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

Журналирование

Журналирование (logging)

Запись хода выполнения программы в том или ином видеВ зависимости от необходимости журнал может быть более илименее детализированнымПо журналу выполнения при необходимости возможновосстановить причину возникшей ошибки

Марат Ахин (СПбГПУ) NP 2014 134 / 320

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

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

Журналирование

Журналирование дляпользователя

ВысокоуровневыесообщенияКак можно меньше«мусора»Чем проще и понятнееформат сообщений, темлучше

Журналирование дляпрограммиста

НизкоуровневыесообщенияДопустим любой шумНикаких ограничений наформат сообщений

Марат Ахин (СПбГПУ) NP 2014 135 / 320

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

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

Как вести журнал?

1 Result ::Ptr processBatchJob(Job::Ptr job) {2 // do the heavy lifting ...3 }

Как записать ход выполнения программы?

Марат Ахин (СПбГПУ) NP 2014 136 / 320

Page 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

Page 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

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

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

Как вести журнал?

Logging as a Service

Марат Ахин (СПбГПУ) NP 2014 139 / 320

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

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

Основная проблема журналирования

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

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

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

Основная проблема журналирования

Чем больше мы хотим узнать о ходе выполнения программы, тембольше мы должны журналироватьЧем больше мы журналируем, тем сложнее разобраться в журналеЧем сложнее разобраться в журнале, тем меньше мы знаем о ходевыполнения программы

Марат Ахин (СПбГПУ) NP 2014 141 / 320

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

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

Ограничение размера журнала

Необходимо ограничивать размер записываемых данных

Марат Ахин (СПбГПУ) NP 2014 142 / 320

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

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

Уровни журналирования

Сообщения пишутся в журнал с определенным уровнемВ дальнейшем возможно фильтровать сообщения по уровням

Error / Warning / Info / Debug / Trace

Марат Ахин (СПбГПУ) NP 2014 143 / 320

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

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

Домены журналирования

Домены ортогональны уровням журналированияВ зависимости от типа сообщения пишутся в разные домены

Database / Network / UI / Configuration / ...

Марат Ахин (СПбГПУ) NP 2014 144 / 320

Page 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

Page 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

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

W.I.L.T. What I Learned Today?

W.I.L.T.

Марат Ахин (СПбГПУ) NP 2014 147 / 320