Что нужно, чтобы находить баги? |
21.09.2020 00:00 |
Автор: Алан Ричардсон (Alan Richardson) Краткое содержание: для испытаний системы в тестировании используются модели, и наша информация ограничена теми моделями, которые мы используем и строим. Мы можем варьировать их, чтобы увеличить вероятность нахождения информации, связанной с багами. Надо быть осторожными, чтобы не впасть в ложную уверенность. Заметки о тестировании, вдохновленные цитатами Акоффа, Эшби, Дейкстры и Вайнберга. Баги "Дейкстра: Тестирование показывает наличие, а не отсутствие багов". Конференция разработки программного обеспечения НАТО, 1969 г. Как нам могут помочь такие утверждения? Мы можем подумать "Что нам сделать, чтобы продемонстрировать наличие багов?" И… Что такое "баги"? Баги могут означать, что "это не всегда работает так, как мне нужно". Проблема: Оно вообще работает? Что значит "работает"? Нам надо определить, что значит "работает" – и это можно сделать через модель взаимодействия. Мы можем смоделировать взаимодействие ПО с внешним интеграционным компонентом – пользователем или другой системой. Я могу смоделировать или определить "работу" так: "ПО работает, если у меня есть цель, и я могу использовать ПО для достижения этой цели". Я могу определить цель и "использовать ПО" способом, который, по моему мнению, подойдет для достижения этой цели. Если я увижу, что цель достигнута, тогда оно "работает". Но… я не могу сказать, что оно всегда работает, из-за:
Если изменится любая из этих переменных, могу ли я быть уверен, что ПО продолжит работать?
Я наблюдал за отдельным проявлением "работы", но я не могу экстраполировать это и сказать, что оно работает всегда. "С самого начала было понятно, что тестирование довольно неэффективно в качестве способа повышения уверенности". "Дисциплина программирования", Эдсгер В. Дейкстра. Модели Когда мы тестируем, мы сравниваем модель системы с самой системой. Когда я говорю "с системой", я имею в виду "со своими наблюдениями или нашим восприятием реальности системы". Мы можем использовать фокус на "наблюдении" в качестве рычага, помогающего нам улучшать наше тестирование.
Тестирование – это процесс моделирования, а не "решения" или "доказательства". Я смоделировал взаимодействие в определенный момент времени, и в результате тестирования я получил исправленную версию системы. Для тех путей, в которых проблем не наблюдалось, я усилил модель, пометив, что в этой части приложения снижена субъективная вероятность ошибок – это значит, что я не встретил проблем и теперь сильнее убежден, что оно "работает". Я могу приравнять это к повышению уверенности. Если я приравниваю это к уверенности, то могу начать думать о моей модели системы, как о реальной системе, а о ПО – как о "беспроблемном". Как тестировщик, я должен сохранять скептицизм по отношению к системе. Самый простой способ этого добиться – осознавать, что я строю модель системы и взаимодействую с моделью системы, а не работаю с "реальной системой". "Экстремальный скептицизм – единственный верный подход". "Основы компьютерного программирования", Герберт Лидс, Джеральд Вайнберг. Глава 11 – тестирование программ. Что нужно, чтобы показать присутствие багов? "Тестирование может быть довольно эффективным для демонстрации присутствия багов, но безнадежно неадекватно для демонстрации их отсутствия". С. 20 "Дисциплины программирования", Эдсгер В. Дейкстра. Найдите данные, взаимодействие, путь через систему и варьируйте их. Если мы будем использовать одни и те же данные, взаимодействия и пути, мы не максимизируем свою возможность "продемонстрировать присутствие багов". Вместо этого мы повышаем риск ложного повышения "уверенности". "Теории можно тестировать, используя данные прошлого, настоящего и будущего, в результате прогрессивно улучшая их. Однако используемые для тестирования теории данные должны отличаться от тех, которые породили теорию". С. 73 "Концепции корпоративного планирования", Рассел Л. Экофф, 1969 При помощи варьирования мы можем наткнуться на комбинацию переменных, демонстрирующую присутствие багов. Почему? "Только вариативность может уничтожить вариативность". "Введение в Кибернетику", У. Росс Эшби (11/7), 1964 Мы используем вариации, чтобы найти такую комбинацию ввода, при которой система не варьирует результаты обработки, и результат попадает в пределы толерантности нашего оракула. Но тут есть проблемы:
Достаточно, чересчур Один из ключевых вопросов тестирования – какого уровня вариативности достаточно? Это одна из самых сложных штук в тестировании. Как узнать, когда остановиться? Ряд эвристик для этого:
Легче сказать, когда не надо останавливаться.
Автоматизация уверенности Автоматизация зачастую используется как инструмент повышения уверенности. "Если мы прогоним автотесты, и все работает, то мы, как минимум, ничего не сломали". Если мы понимаем, что это верно в пределах:
то мы можем добавить в автоматизацию вариативности. "Данные на входе" кажутся простейшей точкой внедрения вариаций. Оставьте путь и метод взаимодействия без изменений, и варьируйте данные. Нам часто приходится ограничивать вариации в данных оракулом, что в целом означает рандомный выбор значений из набора классов эквивалентности, или исчерпывающее тестирование с набором входных значений. Идентификация ограничений данных на входе может привести к обнаружению новых путей или пробелов в покрытии оракула. Мы несем риск упустить что-то за пределами наборов данных, или же неверного определения классов эквивалентности. Этот риск существует, потому что мы моделируем, а не решаем задачу. Тестирование ограничено моделью, и наши оценки ей ограничены. Риск еще в том, что это занимает много времени, поэтому варьирующиеся тесты можно прогонять параллельно прочим автотестам. Мы несем риск генерации большого объема вариаций. Затем нам нужно убедить себя, что вариации не нужны, или определить, где они могут нам помочь, пересмотрев существующее покрытие автотестами в свете вариаций, которые мы хотим внедрить. Но надо быть осторожными, чтобы последующие изменения не повлияли и не обесценили нашу оценку. Если в автотестах нет вариаций, мы создали фиксированную модель приложения, и должны быть бдительными и скептичными к ее покрытию. Этот скептицизм может привести к более частому пересмотру автотестов и проверки, что они покрывают достаточную часть модели системы. Относитесь к ним, как к "дырявой страховочной сетке", а не к "увеличителю уверенности". Тестирование Я могу смотреть на тестирование, как на процесс построения и сравнения модели. Мы стараемся повысить вероятность нахождения значимой информации. Вариации помогают нам в этом. Будьте осторожны, используя тестирование для повышения уверенности, сохраняйте здоровый скептицизм. |