Ловим баги или почему программы допускают "недопустимые операции"
Доброе время суток !
Новости сайта «Все о Дельфи от Чертенка » от 05.11 выпуск 11
Напоминаю, что сайт рассылки находится по адресу: www.chertenok.wallst.ru ,
пожалуйста, обновите Ваши закладки !
Новые статьи на сайте:
Жду Ваших идеи и предложений (в том числе по оформлению рассылки) .
Рекомендуемый формат подписки — html.
С наилучшими пожеланиями, Ваш Владимир aka Чертёнок.
Ловим баги или Почему программы допускают «недопустимые операции»
Ловим баги или Почему программы допускают «недопустимые операции»
Е. Левшаков, В. Ковалев, mcsa.ru
Ошибки — неизбежное зло программирования. Видимо, пока трудно даже представить средство с помощью которого можно избавится от них. Человеку, который выдумает это чудодейственное лекарство, благодарные потомки-программисты, несомненно, воздвигнут памятник. Пока же остается лишь заниматься обычным делом: ловлей багов.
«Нарушение Доступа» — фраза, которую пользователи видят, когда приложение делает попытки обратиться к памяти, которая не обозначена для их использования — и как следствие происходит сбой в работе программы:
Ситуация, при которой Windows давала бы полную свободу программам — записывай данные куда хочешь, скорее всего бы привела к разноголосице программ и полной потери управления над компьютером. Но этого не происходит — Windows стоит на страже «границ памяти» и отслеживает недопустимые операции. Если сама она справиться с ними не в силах — происходит запуск утилиты Dr. Watson, которая записывает данные о возникшей ошибке, а сама программа закрывается.
Известно, что при программировании, особенно крупных программных продуктов, уследить за всеми процессами в коде невозможно, да и нет необходимости. Использование сторонних компонентов и библиотек только усложняет дело. Именно поэтому программисты Delphi порой и сталкиваются со «своенравными» программами, которые то и дело норовят «сбросить пользователя». Итак, давайте рассмотрим некоторые вопросы, связанные с корректной средой программирования, так и непосредственно проблемы написания кода, которые ведут к возникновению ошибок типа «ошибка доступа» (AVS) и очертим наиболее известные пути их исправления.
Мы можем поделить AVS, с которыми сталкиваются при разработке в Delphi, на два основных типах: ошибки при выполнения и некорректная разработка проекта, что вызывает ошибки при работе программы.
Ошибки возникают при старте и закрытии Delphi или формировании проекта. Причиной могут являться сбои в «железе» компьютера.
Эти ошибки могут быть вызваны различными источниками, включая систему BIOS, операционную систему или аппаратные подпрограммы драйверов. Некоторые видео-, звуковые или сетевые платы могут фактически вызывать подобного рода ошибки в Delphi. Для решения подобных аппаратных проблем можно предпринять последовательность неких «стандартных» ходов:
проверить, что не имеется никаких конфликтов между установленными устройствами, устранить обнаруженные конфликты;
попробовать слегка уменьшить «аппетиты» видеодрайвера — поставить меньшее разрешение;
в случае если у вас двухпроцесорная система обеспечить равное изменение шага для каждого процессора;
И в конце концов просто попытаться заменить драйвера на более свежие.
Но помимо чисто железных проблем — большую головную боль могут вызвать ошибки в работе программного обеспечения. Особенно это касается непосредственно операционной системы. Зачастую Windows терпит крах спонтанно. Вот рекомендации которые помогут вам создать более устойчивую среду программирования:
Хотя Windows 9X популярная система, разработку лучше проводить в Windows NT или Windows 2000 — это более устойчивые операционные системы. Естественно, при переходе на них придется отказаться от некоторых благ семейства Windows 95/98/Me — в частности, не все программы адаптированы для Windows NT/2000. Зато вы получите более надежную и стабильную систему.
Не забывайте о том, как важно всегда иметь под рукой свежие версии компонентов для Delphi и дополнительных библиотек. В отличие от Windows создатели данных пакетов стараются от версии к версии уменьшать количество ошибок.
Следите за тем, чтобы устанавливаемые компоненты были предназначены непосредственно для вашей версии Delphi. Попробуйте деинсталлировать чужеродные компоненты один за другим (или пакет за пакетом), пока проблема не будет устранена.
Контролируйте все программные продукты, установленные на вашей машине и деинсталлируйте те из них, которые сбоят. Фаворитами AV среди них являются шароварные утилиты и программы и бета версии программных продуктов.
Все вышеперечисленное в основном не касалось самого процесса программирования и в малой степени зависит от разработчика. Теперь же обратимся к теме, как не допустить при разработке программного продукта ситуации, при которой он сам будет являться причиной ошибки.
Вы могли бы рассмотреть компилирование вашего приложения с директивой <$D>, данная директива компилятора может создавать файлы карты (файлы с расширением map, которые можно найти в том же каталоге, что и файлы проекта), которые могут послужить большой справкой в локализации источника подобных ошибок. Для лучшего «контроля» за своим приложением компилируйте его с директивой <$D>. Таким образом, вы заставите Delphi генерировать информацию для отладки, которая может послужить подспорьем при выявление возникающих ошибок.
Следующая позиция в Project Options — Linker & Compiler позволяет вам, определить все для последующей отладки. Лучше всего, если помимо самого выполняемого кода будет доступна и отладочная информация — это поможет при поиске ошибок. Отладочная информация увеличивает размер файла и занимает дополнительную память при компилировании программ, но непосредственно на размер или быстродействие выполняемой программы не влияет. Включение опций отладочной информации и файла карты дают детальную информацию только если вы компилируете программу с директивой <$D+>.
Эта информация состоит из таблицы номеров строк для каждой процедуры, которая отображает адреса объектных кодов в номера строк исходного текста. Директива $D обычно используется совместно с другой директивой — $L, что позволяет или запрещает генерацию информации о локальных символах для отладки.
Таким образом вы без труда сможете найти точный адрес той подпрограммы, которая была ответственна за ошибку. Одна из наиболее общих причин ошибок выполнения — использование объекта, который еще не был создан. Если второй адрес при выдачи ошибки — FFFFFFF (или 0000000) Вы можете почти утверждать, что было обращение к объекту, который еще не был создан. Например, вызов метода формы, которая не была создана.
Попытаемся разобратся в этой ситуации. Предположим, что BadForm есть в списке «Available forms» в окне Project Options|Forms. В этом списке находятся формы, которые должны быть созданы и уничтожены вручную. В коде выше происходит вызов метода Refresh формы BadForm, что вызывает нарушение доступа, так как форма еще не была создана, т.е. для объекта формы не было выделено памяти.
Если вы установите «Stop on Delphi Exceptions» в Language Exceptions tab в окне Debugger Options, возможно возникновение сообщения об ошибке, которое покажет, что произошло ошибка типа EACCESSVIOLATION. EACCESSVIOLATION — класс исключение для недопустимых ошибок доступа к памяти. Вы будете видеть это сообщение при разработке вашего приложения, т.е. при работе приложения, которое было запущено из среды Delphi.
Следующее окно сообщения будет видеть пользователь — и программа будет закрыта при совершение недопустимой операции:
Первое шестнадцатиричное число (‘0043F193’) — адрес ошибки во время выполнения программы. Выберите опцию меню ‘Search|Find Error’, введите адрес, в котором произошла ошибка (‘0043F193’) в диалоге и нажмите OK. Теперь Delphi перетранслирует ваш проект и покажет вам строку исходного текста, где произошла ошибка во время выполнения программы, то есть BadForm.Refresh.
Естественно, что списка наиболее общих причин ошибок, вызывающих аварийное завершение работы программы, написанной в Delphi, в чистом виде нет. Есть несколько общих «узких мест» в коде и структуре программы, когда подобная ошибка может произойти. Перечислим наиболее распространенные.
Недопустимый параметр API
Если вы пытаетесь передать недопустимый параметр в процедуру Win API, может произойти ошибка. Необходимо отслеживать все нововведения в API при выходе новых версий операционных систем и их обновлений.
Никогда не уничтожайте временный объект исключения. Обработка исключения автоматически уничтожает объект исключения. Если вы уничтожите объект самостоятельно, то приложение попытается уничтожать объект снова, и произойдет ошибка.
Индексация пустой строки
Пустая строка не имеет никаких достоверных данных. Следовательно, попытка индексировать пустую строку — подобно попытке обратиться к нулю, что приведет также к ошибке:
Обращение к динамической переменной
Вы должны строить обращение к динамической переменной корректно, иначе вы перемещаете адреса указателей и возможно разрушаете другие выделенные ячейки памяти.
procedure TForm1.Button1Click(Sender: TObject);
Перечисленные подходы позволят избежать наиболее частых недочетов в разработке, которые могут вызвать столь неприятное как для пользователя, так и для разработчика сообщение о том, что программа выполнила «недопустимую операцию».
Ловим баги или почему программы допускают "недопустимые операции"
Переформулировали. Видите, что это можно поправить — отлично, возьмите с полки пирожок. Нормальная формулировка, почти идеальная. Но пошлют. Потому что кое-кто забывает ставить приоритеты.
9. Расставляем приоритеты
Наши разработчики идут по баглистам в порядке приоритетов:
0 — критические баги, сайт не работает вообще или работает не так, как ожидается;
1 — критичное юзабилити, забытые фичи;
2 — некритичные баги;
3 — некритичное юзабилити;
4 — ошибки в текстах;
8 — хотелки.
Написали «Ссылочку мне сделай красиво». Ок. Баг без приоритета. Разработчик начнет делать вперемешку, если не проигнорит. И будет злиться и посылать в далекое пешее путешествие.
При таком подходе программист исправит баг, и даже не особо перенервничает. Ну ладно, раз просит — сделаю.
10. Не подкидываем посуду
Новый сайт Сибирикса тестировали ежедневно. Каждый день создавался новый лист. Баги отлавливались сразу.
В чем минус постоянной работы над проектом?
Сидит программист, думает над баглистом, а тестировщик в это время подкладывает новые баги. Вам приходилось мыть посуду после большого праздника? Ее постоянно приносят новую и новую. И как настроение было? Не очень, да? «Ты можешь не подбрасывать, блять?»
Терминальная стадия такого багтрекера — чат разработчика и тестировщика в режиме гуглодока. Вместо того чтобы пройти три метра и голосом задать вопрос, начинаются милые беседы — переписка по полчаса, где все считают друг друга уродами. Ну или не уродами, в зависимости от темперамента. Но обида копится. Поэтому ни в коем случае тестировщик не должен работать в одной вкладке с программистом. Вы в своей делаете, он пишет в своей. Это нормально и не бесит.
Бывает и такое, что не апнули боевой сервер для теста. Об этом лучше сразу сообщить разработчику до начала тестирования.С критическими вещами, которые не дают проверить систему, лучше по-быстренькому попросить разобраться. Если рядышком сидите. Это сильно обезопасит вас от получения негативной обратной связи, а мир станет чище и добрее
Как правильно описывать похожие баги или один баг в разных браузерах
Часто бывает ситуация, когда в приложении, или на сайте встречается один и тот же баг на разных страницах, либо однотипные баги в разных местах. Если описывать каждое такое место отдельным дефектом – можно занять много лишнего места в баг-трекере, запутать себя и разработчиков, или же испортить всю статистику по дефектам.
Однотипные баги в разных местах
Во время тестирования как сайтов, так и приложений можно встретить несколько однотипных дефектов. Например, при изменении локализации некоторые элементы не переведены или текст выходит за пределы отведенной области.
Рассмотрим данные ситуации подробнее:
- При изменении локализации некоторые элементы не переведены.
Как мы видим на скриншоте, после переключения языка сайта на русский, названия разделов и текст баннеров продолжают отображаться на английском. Это отличный пример бага локализации. В данном случае лучше будет сгруппировать элементы в отдельные блоки (блок с кнопками разделов и блок с баннерами) и завести по одному отчету об ошибке на каждый из них:
- Названия разделов «Women», «Dresses» и «T-Shirts» не переведены на главной странице сайта после переключения языка сайта на «Русский».
- Текст баннеров «Excepteur occaecat», «3 Days sale» и «Only online summer» не переведен на главной странице сайта после переключения языка сайта на «Русский».
Если элементы, для которых дефект воспроизводится, расположены на определенном расстоянии друг от друга и не могут быть сгруппированными, можно завести один отчет об ошибке для одного такого элемента и в поле «Подробное описание» (Description) перечислить остальные на данной странице.
Например:
Summary: Курсор мыши не меняется на «Указатель» на главной странице сайта после наведения на кнопку «Обратная связь».
Description: Курсор мыши не меняется на «Указатель» на главной странице сайта после наведения на кнопку «Обратная связь». Дефект также воспроизводится для кнопок «Добавить в корзину» и «Избранное».
- Текст выходит за пределы отведенной области.
На скриншоте отчетливо видно, что текст кнопок «Toista panos» и «Toista panos x2» выходит за пределы отведенной области. В данном случае не стоит заводить отдельные отчеты об ошибках на каждый отдельный элемент. Лучше завести один баг-репорт, в котором перечислить найденные элементы с дефектами:
- Текст кнопок «Toista panos» и «Toista panos x2» выходит за пределы отведенной области на экране «Table» после переключения языка на «Finnish».
Если дефект воспроизводится для нескольких языков, или для всех, кроме некоторых, то в таком случае их необходимо перечислить в поле «Подробное описание» (Description).
Например:
Summary: The «Details» value field is overlapped by the «Round ID» text on the «Hand History» screen.
Description: The «Details» value field is overlapped by the «Round ID» text on the «Hand History» screen. The issue is reproduced with all languages, except English.
Также рассмотрим одну из типичных ошибок новичков.
Обратите внимание на расположение кнопки «Корзина». Элемент одновременно не выровнен и по горизонтали, и по вертикали. Так и нужно писать в отчете об ошибке:
- Кнопка «Корзина» не выровнена по горизонтали и вертикали на главной странице сайта.
Мы уместили смысл всего баг-репорта в одном предложении, коротко и ясно. Не стоит заводить отчеты об ошибках отдельно на выравнивание по горизонтали и отдельно на выравнивание по вертикали.
Что делать, если баг встретился в разных браузерах?
Очень часто бывают ситуации, когда найденный дефект воспроизводится в разных браузерах или на разных операционных системах. Что же, собственно, делать, если баг встретился на разном окружении?
Необходимо просто перечислить все браузеры / устройства / ОС в одном баг-репорте, на которых воспроизводится баг в отдельном поле «Environment», если оно есть, либо в «Additional Info».
Пример:
Environment:
Safari 4.1.3
IE 11.435
Chrome 43.567 (56)
Если однотипный баг встречается в нескольких местах – решение также предельно простое. В разделе «Additional Info» указывается перечень страниц, на которых был найден дефект, например, при дефектах перевода элементов сайта на выбранный язык.
Пример:
Кнопка «Вход» не переведена и отображается как «Enter» на страницах «Регистрация», «Меню» и «Поиск». На остальных же – отображается переведенной. Если в шагах мы указали, как воспроизвести баг, скажем, для страницы «Search», тогда в «Additional Info» пишется:
The bug is also reproduced on the «Registration» and «Menu» pages.
Стоит понимать, что можно объединить несколько однотипных инцидентов в один, но чаще всего один баг-репорт должен сообщать об одном баге.
Освежим в памяти основные понятия при заведении бага:
Баг – это несоответствие фактического результата выполнения программы ожидаемому результату. Дефекты обнаруживаются на этапе тестирования программного обеспечения (ПО), когда тестировщик проводит сравнение полученных результатов работы программы (компонента или дизайна) с ожидаемым результатом, описанным в спецификации требований.
Баг-репорт – это документ, описывающий ситуацию или последовательность действий, приведшую к некорректной работе объекта тестирования, с указанием причин и ожидаемого результата.
Баг-трекер – прикладная программа, разработанная с целью помочь разработчикам программного обеспечения учитывать и контролировать ошибки, найденные в программах, пожелания пользователей, а также следить за процессом устранения этих ошибок и выполнения или невыполнения пожеланий.
Атрибуты бага в баг-трекере:
ID – это уникальный идентификатор бага в баг-трекере. Автоматически присваивается системой.
Summary – краткое и лаконичное описание бага, отвечающее на вопрос «Что произошло, где произошло и при каких условиях?».
Например: «The «404 Page not Found» error message is shown (что?) on the «Contact us» page (где?) after clicking the «Contact us» link (когда?)». То есть описание бага должно быть такое, чтобы программисту его даже можно было не открывать, а сразу искать в чем же баг. Но чаще попадаются все же сложные баги, которые и требуют описания внутри дополнительных действий и разъяснений, как же его воспроизвести и как на самом деле должно быть, так что только по Summary может быть трудно понять проблему. Поэтому существуют следующие, приведенные ниже, поля:
Preconditions – в данном поле пишется обычно то, что нужно сделать перед выполнением наших шагов воспроизведения. Также, можно указать данные для воспроизведения (логин и пароль, ссылка, ID продукта и т.д.). Например, нужно создать специальную структуру или пользователей с разными ролями нужных для воспроизведения этого бага.
Если суть бага в том, что недавно созданный администратор не может войти в админ панель с правильными данными, а старые админ-пользователи могут, то в это поле следует написать, что нужно создать нового админа пользователя.
Так как шаги создания админа – не суть этого бага, то это действие можно вынести в Preconditions. Например: «A new admin account is created»
Steps to Reproduce – поле используется для описания шагов, необходимых для воспроизведения данного бага.
Например:
- Open the login page of admin panel.
- Enter valid credentials into the «Username» and «Password» text fields.
- Click the «Sign in» button.
То есть в этом поле описываются детальные шаги до того момента, когда баг будет воспроизведен. После последнего шага мы должны увидеть тот результат, который и является багом в данной ситуации.
Actual Result – описывает, какой результат был получен после выполнения последнего шага. Например, это может быть описано так:
The «You have entered incorrect user or password» message is displayed on the login page after entering valid credentials
Expected Result – правильное поведение системы после выполнения последнего шага.
На первый взгляд кажется, что данное поле не является важным, но на самом деле работа системы может выполняться и правильно, но не соответствовать заявленным требованиям, описанным в документации или предоставленным заказчиком. Поэтому и нужно указывать ожидаемый результат работы системы.
Priority – служит для определения приоритета бага и обычно выставляется менеджером проекта, таким образом определяя первоочередность исправления дефекта на фоне остальных.
В разных баг-трекерах приоритетность может определяться разными уровнями (от «Immediate» до «Low», или цифрами от 1 до 4), принцип от наивысшего приоритета к низшему. В некоторых трекерах может вовсе и не быть такого поля (например, Pivotal tracker).
Severity – указывает на серьезность ошибки с точки зрения влияния на работу ПО. Существуют несколько уровней серьезности ошибки, таких как:
- Blocker. Баг блокирует дальнейшую работу приложения или блокирует дальнейшее тестирование. Например, после создания пользователя, с существующим именем нельзя войти в систему любым пользователем, так как отображается SQL ошибка на главной странице, предотвращающая всяческие попытки входа в систему.
- Critical. Баг оказывает существенное влияние на работу ПО, но не блокирует его работу. Например, пользователь может войти в систему без введения пароля.
- Major. Баг оказывает незначительное влияние на работу ПО. Например, количество записей в списке записей подсчитывается неверно.
- Minor. Баг не влияет на функционал ПО. Например, грамматическая ошибка в названии чего-либо.
Также, как и в случае с Priority, в разных трекерах уровни серьезности могут быть разными, но все они отражают вышеизложенную суть.
Следует отметить, что во многих случаях Severity бага будет примерно равен его Priority. Но это не всегда так.
Например:
- Логотип компании на главной странице отображается неверно или не отображается вовсе. Такого рода дефект не оказывает никакого влияния на функционал сайта, но с точки зрения бизнеса, это очень серьезно. В итоге, имеем наинизшую серьезность и наивысший приоритет.
- Отображается ошибка 404 при попытке перейти в один из разделов сайта. Казалось бы, необходимо устанавливать максимальные Severity и Priority, но менеджер проекта два дня назад сообщил, что в текущей итерации работ в том функционале не планируется, т.к. это не самый важный функционал и есть задачи более важные. В итоге, имеем Severity = Blocker, но Priority = Low.
Assignee – в этом поле указывается ответственный за исправление данного бага. В большинстве ситуаций назначается менеджер проекта, который уже распределяет баги дальше, или разработчик, отвечающий за секцию, в которой был найден баг.
Status – статус изначально автоматически выставляется как «Новый» или «Открытый». Дальше может меняться разработчиком, тестировщиком или менеджером проекта в зависимости от того, на какой стадии находится баг.
Также, к баг-репорту нужно в обязательном порядке добавить скриншот/видео, который показывает проблему. При этом, нужно помнить, что баг должен быть описан так, чтобы разработчик мог его воспроизвести и без просмотра вложения. Это связано с тем, что бывают случаи, когда возникают проблемы при попытке просмотра вложения (медленный Интернет, ограниченный траффик, перебои в работе сервиса), и, если дефект описан неподобающим образом, это заблокирует работу разработчика по устранению ошибки.
Ловим баги или почему программы допускают "недопустимые операции"
• Продукт у нас хороший, и вы бы сами убедились, если бы не…
Онлайн-тренинги
Конференции
Что пишут в блогах (EN)
Разделы портала
Про инструменты
Как локализовать плавающие баги |
12.07.2020 14:37 | |
Автор: Джеймс Бах (James Bach) Перевод: Ольга Алифанова Способность уверенно исследовать плавающие баги – одна из характеристик отличного тестировщика. Самые захватывающие истории, которые я слышал от тестировщиков, были про охоту на «белых китов» в океане сложного кода. В отличие от багов, которые загадочным образом воспроизводятся постоянно, плавающий баг – это больше проблема тестирования, нежели разработки. Многие программисты просто не хотят гоняться за причинами таких проблем, если есть куда более доступные жертвы. Вообще-то плавающие баги не должны вас удивлять. Все программирование, можно сказать, крутится вокруг контроля неустойчивого поведения. Итак, о чем речь? Нас не беспокоит неустойчивое поведение, если оно а) так и задумано б) не несет в себе тайны, даже если оно не вполне предсказуемо. Например, результат подброшенной монеты или шанс выбить 777 в игровом автомате – вполне себе неустойчивое поведение. Даже загадочное неустойчивое поведение не волнует нас, если мы уверены, что оно не вызовет проблем. Когда я тестирую, я не думаю о магнитных полях или мелких скачках напряжения, хотя они влияют на мою работу постоянно. Многие плавающие баги никем не обнаружены просто потому, что они еще ни разу не проявились (или проявились, но никто их не заметил). Все, что мы можем сделать – это позаботиться о создании наилучшего тестового покрытия и придерживаться этого подхода. Нет в мире алгоритмов для автоматического определения или предотвращения всех плавающих багов. Итак, то, что обычно называется плавающим багом – это загадочное, нежелательное поведение системы, которое наблюдалось как минимум единожды, и которое мы не можем спровоцировать повторно. Наша задача – превратить плавающий баг в обычный, раскрыв тайны, окружающие его. После этого он становится головной болью программистов. Принципы работы с плавающими багами
Общие советы по исследованию плавающих проблем
Возможные причины плавающих багов Локализуя плавающий баг, поразмышляйте о типах причин, вызывающих подобные проблемы. Ниже – список эвристик, которым можно пользоваться для подобного анализа. Некоторые из причин дублируются, потому что их можно рассматривать с разных точек зрения. Вероятная причина номер 1: Система ведет себя точно так же, как и вела. Кажущийся сбой поведения – артефакт, относящийся к вашему восприятию.
Вероятная причина номер 2: Система ведет себя иначе, потому что это другая система.
Вероятная причина номер 3. Система ведет себя иначе, потому что находится в другом состоянии.
Вероятная причина номер 4. Система ведет себя иначе, потому что получила другие вводные данные.
Вероятная причина номер 5. Прочие причины связаны с тем, что ваша ментальная модель системы и того, что на нее влияет, неверна или неполна.
Программа при релизе не работает, а при дебаге работает |
16.06.2013, 03:02 |
Разные значения в дебаге и релизе Почему вылетает программа при 32768, а при 20 все работает нормально? Ошибка выхода за пределы памяти в дебаге, в релизе ОК Ловим баги или почему программы допускают "недопустимые операции"Ошибки — неизбежное зло программирования. Видимо пока трудно даже представить средство с помощью которого можно избавится от них. Человеку, которые выдумает это чудодейственное лекарство, благодарные потомки-программисты, несомненно, воздвигнут памятник. Пока же остается лишь заниматься обычным делом: ловлей багов. «Нарушение Доступа» — фраза, которую пользователи видят, когда приложение делает попытки обратиться к памяти, которая не обозначена для их использования — и как следствие происходит сбой в работе программы: Но помимо чисто железных проблем — большую головную боль могут вызвать ошибки в работе программного обеспечения. Особенно это касается непосредственно операционной системы. Зачастую Windows терпит крах спонтанно. Вот рекомендации которые помогут вам создать более устойчивую среду программирования: Недопустимый параметр API Если вы пытаетесь передать недопустимый параметр в процедуру Win API, может произойти ошибка. Необходимо отслеживать все нововведения в API при выходе новых версий операционных систем и их обновлений. Никогда не уничтожайте временный объект исключения. Обработка исключения автоматически уничтожает объект исключения. Если вы уничтожите объект самостоятельно, то приложение попытается уничтожать объект снова, и произойдет ошибка. Индексация пустой строки Пустая строка не имеет никаких достоверных данных. Следовательно, попытка индексировать пустую строку — подобно попытке обратиться к нулю, что приведет также к ошибке: Обращение к динамической переменной Вы должны строить обращение к динамической переменной корректно, иначе вы перемещаете адреса указателей и возможно разрушаете другие выделенные ячейки памяти. Перечисленные подходы позволит избежать наиболее частых недочетов в разработке, а также если купить домен дешево, которые могут вызвать столь неприятно как для пользователя, так и для разработчика сообщение о том, что программа выполнила «недопустимую операцию». Программы для фильтрации баннеров, всплывающих окон, Flash и прочих «интернет-неудобств»В последнее время в нашем форуме возникает множество жалоб пользователей на нелегкую жизнь в интернете, отягощаемую различными рекламными баннерами, всплывающими окнами, Flash-роликами и прочими разнообразными неудобствами. Почему такой вопрос вообще возник и вызывает такой резонанс — мне, честно говоря, совершенно непонятно. Ведь эта тема не раз поднималась в том числе и на страницах нашего сайта, а стандартные средства блокировки и фильтрации встроены во множество популярных программ. Но раз есть спрос, значит есть и предложение, поэтому сегодня вы узнаете о предельно простых, эффективных и зачастую совершенно бесплатных способах фильтрации различных видов рекламы и других встречающихся в сети неудобств. рекламаБлагодаря же официальному плагину Adblock браузеры Mozilla/Firefox приобретают весьма мощные и интересные функции по фильтрации нежелательных элементов. Подробно использование Adblock описано в отдельном обзоре, с которым рекомендуется ознакомиться для получения адекватного представления о функциональности плагина. рекламаБраузер Opera, который многие вполне справедливо называют лучшим в мире (а разработчики — самым быстрым в мире) уже очень давно одним из первых получил встроенные функции по блокировке всплывающих окон. В настройках программы (в т.ч. в быстрых настройках, вызываемых по F12) возможен выбор одного из четырех вариантов обработки всплывающих окон, которые могут несколько отличаться в зависимости от версии:
рекламаСуществует очень много различных браузеров, использующих для работы движок Internet Explorer и фактически являющихся надстройкой над ним. Из них можно выделить две разработки, отличающиеся наибольшей функциональностью, полной русификацией, признанием пользователей и при этом являющихся полностью бесплатными. Так, Avant Browser очень прост и интуитивно понятен в использовании (особенно для имевших дело с браузером Opera, т.к. разрабатывался по его образу и подобию) и обладает широкими и эффективными средствами блокировки и фильтрации:
рекламаВторой заслуживающий внимания браузер на ядре Internet Explorer — адаптированная русская версия бесплатного MYiE2RU, являющегося одним из самых популярных браузеров в нашей стране. Открытая архитектура и модульный принцип делают его чрезвычайно подверженным настройке и модификации. Возможности фильтрации нежелательной рекламы и всплывающих окон во многом соответствуют таковым в Avant Browser и, по заявлению разработчиков MYiE2RU, принцип реализации был заимствован именно из последнего:
рекламаПо совокупности преимуществ/недостатков использовать стандартный Internet Explorer крайне не рекомендуется, если только у вас нет на это особых причин (например, запрет альтернативных браузеров корпоративной политикой вашего предприятия). Поэтому настойчиво советую вам приглядеться к указанным выше браузерам — выбрав какой-то из них для себя вы поймете, что не можете без него жить . Еще один простой, доступный и интересный вариант «убить рекламу» — использование брандмауэра Outpost Firewall, имеющего стандартные подключаемые модули для фильтрации рекламы и интерактивных элементов, которые позволяют с успехом выполнять ряд интересующих нас задач, в частности:
И если в первых реализациях модулей пользователи имели нарекания к их работе, то в последних версиях программы они постоянно дорабатываются, расширяются и совершенствуются, являясь неплохим «бесплатным приложением» и «усилителем продаж» этого очень недорогого (500 рублей) и эффективного отечественного брандмауэра. Скачать последнюю версию можно отсюда:
Одним же из наиболее универсальных и эффективных методов борьбы с интернет-рекламой, всплывающими окнами и множеством прочих неприятных «назойливостей» является использование специализированных программ. Пожалуй, наиболее удобным и мощным средством является небольшая утилита AD Muncher. Программа «селится» в системном трее и фильтрует весь трафик для всех приложений, т.е. не только для запущенных браузеров, но и для прочих программ, содержащих рекламные баннеры, например, ICQ, Morpheus, Kazaa, Opera, Bearshare, LimeWire. Список возможностей огромен:
При этом программа устанавливается совершенно прозрачно, что позволяет даже без дополнительных «телодвижений» использовать ее в локальной сети, запустив на компьютере с прокси-сервером. Ad Muncher — это однозначно «наш выбор». Радость портит только коммерческий принцип распространения программы — за 25$, но универсальность, простота в использовании, широкий охват всех потенциальных проблем, заметное ускорение времени загрузки страниц и масса сэкономленного трафика, на мой взгляд, с лихвой перекрывают этот «недостаток» и делают покупку программы оправданной. Скачать полнофункциональную пробную версию можно из нашего файлового архива:
В противовес распространяемому на коммерческой основе Ad Muncher можно привести бесплатную альтернативу, реализованную в виде прокси-сервера — Proxomitron Naoko. К сожалению, развитие программы приостановлено, но, тем не менее, она до сих пор является одним из самых эффективных, гибко настраиваемых и мощных средств фильтрации интернет-трафика, требующего однако, углубленного изучения способов применения и настроек. Из интересующих нас возможностей программа предлагает:
В освоении программы вам очень поможет русский сайт Proxomitron.nm.ru , скачать сам дистрибутив можно из нашего файлового архива:
Надеюсь, вы получили достаточное представление о многообразии способов и механизмов фильтрации нежелательной рекламной информации, а значит теперь этот вопрос принципиально исчерпан и интерес вызовут уже только подробности и детали настройки/реализации каких-то функций . Теперь выбирайте подходящую вам комбинацию программ и объявляйте войну рекламе! P.S. Во избежание обвинений поклонников и разработчиков тех или иных программ они представлены внутри каждой категории по алфавиту . Все способы и варианты фильтрации охватить в одном материале невозможно да и не нужно, поэтому описана только часть функций наиболее популярных и доказавших свою эффективность продуктов. Обсудить методы и средства можно в специальной ветке нашей конференции. Почему компьютерный сбой называют *БАГ*?В самом первом переводе bug — это «насекомое» , конкретнее — клоп. Во втором, известном по шпионским фильмам — «жучок» , малоформатное подслушивающее устройство. Есть ещё с десяток оттенков этого великолепного по краткости слова, но «прописку» в русском получило одно: дефект, присущий чему-то техническому или программному изначально. Таким образом, баг — это не то, что ломается по прошествии времени в силу износа, а то, что обнаруживает себя спустя какое-то время. Обнаруживает самым прискорбным образом: внезапно портит игру, прогу, комп, связь, наладку, проверку… всё, что угодно. в «Неакадемическом словаре языкового уплотнения» — “Bug — баг” Но ещё в 1878 году Томас Эдисон писал: В действительности этот случай произошёл 9 сентября 1947, а не 1945, года. Слово «bug» в современном значении употреблялось задолго до этого. Так, в течение Второй мировой войны словом «bugs» назывались проблемы с радарной электроникой. Основы тестирования. Как правильно составить баг-репортыЗачем нужен хороший баг-репорт?Если ваш отчет об ошибках (баг-репорт) составлен правильно, то шансы на быстрое исправление этих багов — выше. Таким образом, исправление ошибки зависит от того, насколько качественно вы о ней сообщите. Составление отчетов об ошибках — не что иное, как навык, и сейчас мы рассмотрим, как его сформировать. «Смысл написания отчета о проблемах (баг-репорта) состоит в том, чтобы исправить эти проблемы» — Cem Kaner. Если тестировщик не сообщает об ошибке правильно, программист, скорее всего, отклонит эту ошибку, заявив, что она невоспроизводима. Это может повредить рабочему настрою тестировщиков, затронуть их профессиональную гордость, их эго. Каковы качества хорошего баг-репорта в разработке программного обеспечения?Любой может написать баг-репорт. Но не каждый может написать эффективный бар-репорт. Вы должны уметь хорошо различать баг-репорт среднего качества и хороший баг-репорт. Как отличить хороший и плохой баг-репорты? Это очень просто, примените следующие характеристики и методы, чтобы качественно сообщить об ошибке. Характеристики и методы включают в себя:1) Наличие четко определенного номера ошибки: Всегда присваивайте уникальный номер каждому сообщению об ошибке. Это, в свою очередь, поможет вам четко идентифицировать запись об ошибке. Если вы используете какой-либо инструмент автоматического формирования баг-репортов, то этот уникальный номер будет генерироваться автоматически каждый раз, когда вы делаете отчет. 2) Воспроизводимость: Если найденная вами ошибка не воспроизводима, то она никогда не будет исправлена. Вы должны четко указать шаги для воспроизведения ошибки. Не принимайте и не пропускайте ни одного шага воспроизведения. Ошибку, которая описана шаг за шагом, легко воспроизвести и исправить. 3) Будьте конкретны: Не пишите очерк о проблеме. Пишите конкретно и по существу. Попытайтесь описать обнаруженную проблему минимальным количеством слов и максимально эффективным способом. Не объединяйте описания нескольких багов в одном отчете, даже если они кажутся похожими. Напишите разные отчеты для каждой проблемы. Эффективный баг-репортингОтчеты об ошибках являются важным аспектом тестирования программного обеспечения. Эффективный баг-репорт хорошо понимается командой разработчиков и позволяет избежать путаницы или недопонимания. Хороший отчет об ошибке должен быть четким и кратким, без каких-либо пропущенных ключевых моментов. Любое отсутствие ясности ведет к недопониманию и замедляет процесс разработки. Описание дефектов и составление отчетов — одна из самых важных, но часто игнорируемых областей в жизненном цикле тестирования. Правильно составленный текст отчета про найденный баг очень важен для регистрации ошибки. Один из важных моментов, которые должен иметь в виду тестер, — это не использовать командный тон в отчете. Такой тон нарушает моральное состояние коллектива и создает нездоровые рабочие отношения. Используйте нейтральный тон. Не думайте, что если разработчик допустил ошибку, то вы можете использовать грубые слова. Прежде чем сообщать, не менее важно проверить, был ли уже баг-репорт по этой ошибке ранее или нет. Дубликаты ошибок — это постоянная проблема в цикле тестирования. Проверяйте весь список обнаруженных багов. Иногда разработчики могут знать о наличествующей проблеме и игнорировать ее в будущем выпуске. Используйте специальные инструменты, такие как Bugzilla, который автоматически ищет дубликаты ошибок. Тем не менее, лучше всего дополнительно вручную искать дубликаты ошибок. Четко указывайте информацию об ошибке: «Как?» и «Где?». Отчет должен ясно показывать, как был выполнен тест и где именно произошел дефект. Читатель отчета должен легко воспроизвести ошибку и найти ее. Имейте в виду, что цель написания баг-репорта — дать разработчику возможность визуализировать проблему. Он/она должен четко понимать суть дефекта, прочитав отчет об ошибке. Не забудьте предоставить всю необходимую информацию, которую ищет разработчик. Кроме того, имейте в виду, что отчет об ошибках будет сохранен для будущего использования и должен быть хорошо написан и содержать необходимую информацию. Используйте содержательные предложения и простые слова, чтобы описать найденные ошибки. Не используйте запутанные утверждения, которые тратят время читателя. Сообщайте о каждой ошибке как о отдельной проблеме. В случае описания нескольких багов в одном отчете, вы не сможете закрыть его, пока все проблемы не будут решены. Следовательно, лучше всего разбить большие проблемы на отдельные баги. Это гарантирует, что каждая ошибка может быть обработана отдельно. Хорошо написанный баг-репорт помогает разработчику воспроизвести ошибку на своем терминале. Это помогает им также правильно диагностировать проблему. Как сообщить об ошибке?Используйте следующий простой шаблон баг-репорта:Это простая форма баг-репорта. Его содержание может варьироваться в зависимости от используемого вами инструмента отчетов об ошибках. Если вы пишете баг-репорт вручную, то необходимо упомянуть некоторые поля, например номер ошибки, который должен быть назначен вручную. Составитель отчета: Ваше имя и адрес электронной почты. Продукт: В каком продукте вы нашли эту ошибку. Версия: Версия продукта с ошибкой, если таковая имеется. Компонент: Основные подмодули продукта. Платформа: Укажите аппаратную платформу, на которой вы обнаружили эту ошибку. Различные платформы, такие как «ПК», «MAC», «HP», «Sun» и т. д. Операционная система: Укажите все операционные системы, в которых вы обнаружили ошибку. Операционные системы, такие как Windows, Linux, Unix, SunOS, Mac OS. Упомяните разные версии ОС, такие как Windows NT, Windows 2000, Windows XP и т. д., если это применимо. Приоритет: Когда следует исправлять ошибку? Приоритет обычно устанавливается от P1 до P5. P1 следует понимать, как «исправить ошибку с наивысшим приоритетом» и P5 — «исправить, если позволяет время». Серьезность ошибки: Описывает влияние ошибки. Типы Серьезности ошибки:
Статус ошибки: Когда вы регистрируете ошибку в любой системе отслеживания ошибок, то по умолчанию статус ошибки будет «Новый». Позднее ошибка проходит через различные этапы, такие как «Исправлено», «Проверено», «Повторно открыто», «Не исправлено» и т. д. Назначить разработчику: Если вы знаете, какой разработчик отвечает за тот конкретный модуль, в котором произошла ошибка, вы можете указать адрес электронной почты этого разработчика. В противном случае оставьте это поле пустым, так как это присвоит полю авторства ошибки значение владельца модуля, если менеджер не назначит ошибку разработчику. URL: URL страницы, на которой произошла ошибка. Краткое резюме: Добавьте краткое описание ошибки. Ориентируйтесь на 60 слов или меньше. Убедитесь, что составленное резюме отражает проблему и место, где она находится. Описание: Подробное описание ошибки. Используйте следующие поля для поля описания:
Это важные шаги в отчете об ошибках. Вы также можете добавить «Тип отчета» как еще одно поле, которое будет описывать тип ошибки. Типы отчетов включают в себя: 1) Ошибка в коде Важные фичи в вашем отчете об ошибкахРассмотрим несколько составляющих отчета о найденном баге Ниже приведены важные элементы баг-репорта:1) Номер ошибки/идентификатор: Номер ошибки или идентификационный номер (например, xyz007) значительно упрощает составление баг-репорта и поиск места ошибки. Разработчик может легко проверить, исправлена ли конкретная ошибка или нет. Это делает весь процесс тестирования и повторного тестирования более плавным и легким. 2) Наименование ошибки: Заголовок ошибки читается чаще, чем любая другая часть баг-репорта. Стоит указать в нем всё о том, что входит в баг. Название ошибки должно быть достаточно осмысленным, чтобы читатель мог его понять. Четкий заголовок ошибки облегчает понимание, и читатель легко сможет проверить, было ли сообщение об ошибке ранее и была ли она исправлена. 3) Приоритет: В зависимости от серьезности ошибки, для нее может быть установлен приоритет. Ошибка может быть Blocker, Critical, Major, Minor, Trivial или предложением по улучшению функционала. Приоритет ошибки от P1 до P5 может быть задан так, чтобы важные из них просматривались первыми. 4) Платформа / Среда: Указание конфигурации ОС и браузера необходимо для большей точности в баг-репорте. Это лучший способ сообщить о том, как можно воспроизвести ошибку. 5) Описание: Правильное описание ошибки помогает разработчику понять ошибку. Оно описывает возникшую проблему. Плохое описание создаст путаницу и потратит время разработчиков и тестеров. Необходимо четко сообщить об эффекте в описании. Всегда полезно использовать полные предложения. Рекомендуется описывать каждую проблему отдельно, а не разрушать их полностью. Не используйте такие термины, как «я думаю» или «я считаю». 6) Шаги для воспроизведения ошибки: Хороший отчет об ошибке должен четко указывать шаги для воспроизведения. Шаги должны включать действия, которые вызывают ошибку. Не делайте общих заявлений. Будьте конкретны в следующих шагах. Хороший пример правильно написанной пошаговой процедуры приведен ниже: Последовательность шагов:
7) Ожидаемый и фактический результат: Описание ошибки будет неполным без указания ожидаемых и фактических результатов. Необходимо обрисовать в общих чертах, каков результат теста и что ожидал бы пользователь в случае корректной работы программы. Читатель отчета должен знать, какой результат теста будет корректным. Ясно упомяните, что произошло во время теста и каков был результат.
Одна картинка стоит тысячи слов. Сделайте скриншот с примером сбоя с соответствующими выделениями, чтобы указать дефект. Выделите неожиданные сообщения об ошибках светло-красным цветом. Это привлекает внимание к необходимой области. Некоторые дополнительные советы, для написания хорошего баг-репортаНиже приведены некоторые дополнительные советы, чтобы написать хороший отчет об ошибке: 1) Немедленно сообщите о проблеме: Если вы обнаружите какую-либо ошибку во время тестирования, не нужно ждать, чтобы написать подробный отчет об ошибке позже. Вместо этого напишите отчет об ошибке немедленно. Это обеспечит хорошее качество отчета и воспроизводимость шагов получения ошибках. Если вы решите написать отчет об ошибке позже, есть большие шансы пропустить важные детали в баг-репорте. 2) Воспроизведите ошибку три раза перед написанием баг-репорта: Ваш баг должен быть воспроизводимым. Убедитесь, что ваши шаги достаточно четкие, чтобы воспроизвести ошибку без какой-либо двусмысленности. Если ваша ошибка не воспроизводима каждый раз, вы все равно можете подать ошибку, указав периодическую природу бага. 3) Протестируйте эту же ошибку на других похожих модулях: Иногда разработчик использует один и тот же код для разных похожих модулей. Таким образом, вероятность того, что ошибка в одном модуле возникнет и в других подобных модулях, выше. Вы даже можете попытаться найти более серьезную версию найденной ошибки. 4) Составьте хорошее резюме ошибки: Краткое описание ошибки поможет разработчикам быстро проанализировать природу ошибки. Низкое качество отчета излишне увеличит время разработки и тестирования. Правильно взаимодействуйте с вашим баг-репортом. Имейте в виду, что сводка об ошибках используется в качестве справочной информации для поиска ошибки в инвентаре ошибок. 5) Прочитайте несколько раз отчет об ошибке, прежде чем нажать кнопку «Отправить»: Прочитайте все предложения, формулировки и шаги, которые используются в баг-репорте. Посмотрите, не создает ли какое-либо предложение двусмысленность, которая может привести к неправильной интерпретации. Следует избегать вводящих в заблуждение слов или предложений, чтобы составить четкое сообщение об ошибке. 6) Не используйте оскорбительные выражения: Приятно, что вы проделали хорошую работу и обнаружили ошибку, но не используете это для критики разработчика или нападок на какого-либо человека. Заключение.Мы рассмотрели некоторые особенности составления отчета про найденный баг. Нет сомнений, что ваш баг-репорт должен быть качественным документом. Сосредоточьтесь на написании хороших отчетов об ошибках и потратьте некоторое время на выполнение этой задачи, потому что именно качественный баг-репорт является основной точкой связи между тестером, разработчиком и менеджером. Менеджеры со своей стороны должны объяснить своей команде, что составление хорошего отчета об ошибках является основной обязанностью любого тестировщика. Ваши усилия по написанию хорошего отчета об ошибках не только сохранят ресурсы компании, но и создадут хорошие отношения между вами и разработчиками. С нашей стороны для качественной подготовки тестировщиков, предлагаем вам ознакомиться с курсом подготовки специалиста-тестировщика на ITVDN — Quality Assurance |