среда, 6 мая 2009 г.

Фильтровать не перефильтровать или как тестировать поиск

Наверное, нет сейчас человека, который бы не ругался на разработчиков софта из-за ошибок при поиске или фильтрации данных. Вам надо что-то найти, а приложение либо показывает не то что надо, либо выдает какие-то ошибки. В этом случае вы говорите: "Программисты опять накосячили." Хочу перефразировать: "Тестеры не до тестировали", т.к. программист имеет право на ошибку, а вот тестер уже нет. Он - последний оплот качества :) Ладно, перейдем от слов к делу.

Для начала рассмотрим багу из жизни. Решил я поискать себе квартирку, пошел на сайт, задал значения фильтра и получил не совсем то, что ожидал.



Сайт realt.by
Пример неправильной работе фильтра на странице "Квартиры в новостройках, долевое строительство квартир":

Краткое Описание:
Неправильно реализован поиск по условию "Срок сдачи: до"

Пример:
1. выбираем Срок сдачи: до 3 квартал 2009
2. Нажимаем "Начать Поиск"

Результат:
Список объектов со сроком сдачи 3 квартал 2009

Ожидаемый Результат:
Список объектов со сроком сдачи, начиная с сегодняшнего дня до 3 квартала 2009


Теперь приведем некоторые рекомендации по тестированию фильтров и поиска, используя элементарные примеры.

Пример 1. Поиск пользователя


Имеющийся фильтр: Имя, Фамилия, Возраст, Место работы.
Тестовый пользователь: Иван, Иванов, 25, Смольный.

Случаи тестирования
1. Заполните в фильтре все поля, соответственно. В результате вы должны получить только одну запись, а именно тестового пользователя: Иванова Ивана. Если вы получили ни одного или несколько пользователей, и кто-то из них не Иванов Иван 25ти лет, работающий в Смольном, значит это бага.
2. Поиск по отдельным полям. Введите в фильтре только имя "Иван". В результате вы получаете список пользователей с именем "Иван", причем это должны быть все пользователи с этим именем, а не только некоторые из них. Повторите тоже самое с остальными полями фильтра.
3. Поиск используя комбинации полей. Введите в фильтре имя "Иван" и фамилию "Иванов". В результате вы получаете список всех пользователей с именем "Иван" и фамилией "Иванов". Повторите тоже самое варьируя комбинациями полей фильтра, например: (имя, возраст), (фамилия, место работы), (фамилия, возраст, место работы) и т.д.

Примечание: Если какое-либо поле содержит специальные (ASCII) символы, то это не должно искажать результаты поиска, как в функциональном плане, так и при выводе их на экран (XSS и SQL Injections).

Пример 2. Поиск при разных типах граничных условий


Здесь хочется просто дать всем совет:
- Внимательно читайте требования к фильтрам, обращая внимание на границы поиска, а именно: границы включены (=, >=, <=) или не включены (<, >).

Пример 2.1. Поиск места работы по дате:
Имеющийся фильтр: Имя, Фамилия, Дата работы (границы включены - =, >=, <=)

Тестовый пользователь:

ИмяИван
ФамилияИванов
Дата трудоустройства30/10/2007
Дата увольнения (последний рабочий день)30/10/2008
Место работыСмольный

В данном примере, помимо проверок из примера 1, Вам придется обратить внимание на тестирование фильтров по границам дат трудоустройства и увольнения.
Случаи тестирования:
Имя и ФамилияДата работыОписаниеОжидаемый результат
Иван, Иванов30/10/2007= левой границе,
< правой границы
Место работы Смольный
Иван, Иванов30/10/2008> левой границы,
= правой границе
Место работы Смольный
Иван, Иванов29/10/2007< левой границы,
< правой границы
Место работы не определено
Иван, Иванов31/10/2007> левой границы,
< правой границе
Место работы Смольный
Иван, Иванов31/10/2008> левой границы,
> правой границе
Место работы не определено


Пример 2.2. Поиск места работы по дате:
Имеющийся фильтр: Имя, Фамилия, Дата работы (границы НЕ включены - <, >)
Тестовый пользователь:

ИмяИван
ФамилияИванов
Дата трудоустройства30/10/2007
Дата увольнения (день, с которого сотрудник считается уволенным)30/10/2008
Место работыСмольный

Случаи тестирования:
Имя и ФамилияДата работыОписаниеОжидаемый результат
Иван, Иванов30/10/2007= левой границе,
< правой границы
Место работы Смольный
Иван, Иванов30/10/2008> левой границы,
= правой границе
Место работы не определено
Иван, Иванов29/10/2007< левой границы,
< правой границы
Место работы не определено
Иван, Иванов31/10/2007> левой границы,
< правой границе
Место работы Смольный
Иван, Иванов31/10/2008> левой границы,
> правой границе
Место работы не определено


Пример 3. Использование Wildcard символов


Наиболее распространенными wildcard символами являются "*" и "?".
* - включает любое число произвольных символов либо не включает ничего :)
? - включает ниодного или один произвольный символ

Тестовый пользователь: Иван, Иванов
Фильтр по фамилии с разрешенными Wildcard-ами
Случаи тестирования (*):
ФильтрРезультат
*ивановиванов, а также все фамилии заканчивающиеся на "иванов": криванов, ливанов и т.д
иванов*иванов, а также все фамилии начинающиеся на "иванов": иванович, иванова и т.д.
ив*овиванов, а также все фамилии начинающиеся на "ив" и оканчивающиеся на "ов": иваньков, ивченков и т.д.
*иванов*иванов, а также все фамилии имеющие в середине сочетание "иванов": диванович, иванович, диванов и т.д.

Случаи тестирования (?):
ФильтрРезультат
?ивановиванов, а также все фамилии заканчивающиеся на "иванов": диванов, ливанов и т.д
иванов?иванов, а также все фамилии начинающиеся на "иванов": ивановъ, иванова и т.д.
ив?новиванов, а также все фамилии начинающиеся на "ив" и оканчивающиеся на "нов": иванов, ивенов и т.д.
?иванов?иванов, а также все фамилии имеющие в середине сочетание "иванов": диванова, ивановъ, диванов и т.д.

Примеры с совместным использованием wildcard придумайте сами, не так это и сложно.

* * *

Это было всего лишь несколько рекомендаций, от которых можно отталкиваться при тестировании фильтров и поиска. Надеюсь, что они помогут Вам и сделают выпускаемые вами продукты более чистыми от багов :)

Напоследок расскажу, как мы автоматизированно тестировали правильность поиска на одном японском сайте:
1. Выкачали из базы все необходимые данные
2. Создали список кейвордов для поиска
3. Задали фильтры, используя заготовленные кейворды
4. Сверили наши данные с теми, что получили от приложения
5. Написали баги, если нашли :)

К выходу продукта в свет, ни одного открытого на фильтры бага не было...

Удачного тестирования,
Да пребудет с Вами Качество...

9 комментариев:

Анонимный комментирует...

рекомендую проработать тему тестирования поиска с произвольной скобочной структурой и логическими операторами - поинтересней задача будет ;) успехов!

bugsclock комментирует...

Даже несмотря на то, что приведенные кейсы очевидны, они гроша ломаного не стоят без тестовых данных. Прошу прощения за прямоту.

Фильтр Результат
?иванов Иванов (???), а также все фамилии заканчивающиеся на "иванов": диванов, ливанов и т.д

ой ли?

А.Б. комментирует...

Спасибо за прямоту :) И правда они ничего не стоят, и можно было даже не писать и данный пост. Какой в этом смысл итак все все знают. Но с другой строны, я пишу блог, потому что я его пиши и делаю это так как у меня получается :)

На счет примера в кейсе, то 1) если вы имели ввиду большую букву "И", то просто руки не добрались поправить, было замечено немного раньше Вас, 2) в описании описания вайлкарты "?" не нашел ничего, чтобы говорило, что она не может означать пустоту, т.е. отсутствие символа (если у вас есть описание стандартов для испольщования wikdcards, не могли бы вы поделиться ей?)

Спасибо

bugsclock комментирует...

По поводу тестовых данных, тупой пример, чтобы было понятно. Я новичок, прочитал заметку, возрадовался и пошел тестировать свой поиск. И тут же в первом примере вопрос: у меня в базе должна быть только одна запись "Иван, Иванов, 25, Смольный" или 10 одинаковых записей или 5 Иванов, 2 Петра и 3 Сидора, или все записи должны быть разными? Или может заполнение реальными данными? Пока мы не сформируем тестовый набор данных, подтверждающих правильную работу поиска на описанных кейсах, мы не можем ответить на вопрос "как тестировать поиск".

По поводу wildcard, ссылки нет, я просто посмотрел как работает ? в MidnightCommander. Поэтому не стал на 100% утверждать. Но уверен на 99% что фильтр ?иванов не должен выдавать иванов (там же тупо регулярные выражения наверное).

bugsclock комментирует...

Вообще, тестирование поиска и сортировка, интересные задачки по тестированию, иногда спрашиваем на собеседовании.

bugsclock комментирует...

Вдогонку по wildcards http://www.linfo.org/wildcard.html

Можно ведь и такой запрос написать ??иванов. 100%не должно выдавать иванов.

А.Б. комментирует...

Скажем так. На счет примера, какой есть, такой есть. Вообще, пытаясь описать все возможные случаи можно книгу написать, а это блог. Поэтому рассмотрен небольшой вакуумный пример.
Пока мы не сформируем тестовый набор данных, подтверждающих правильную работу поиска на описанных кейсах, мы не можем ответить на вопрос "как тестировать поиск" - Согласен. А еще надо сформулировать требования и т.д. И тогда получается, что тестирование поиска ничем не отличается от какого-либо другого тестирования.
Долго можно об этом говорить...

Вернемся к примеру: ??иванов
я долго копался и искал описание wildcard-ы "?" и нигде не нашел, что она не может ровняться пустому значению "".
Если вы найдете мне источник, говорящий, что ? <> "", то я исправлю свою ошибку в статье...

Большое спасибо за отличные комменты.

Анонимный комментирует...

Статья будет полезной для новичков в тестировании. Алексей, спасибо за ваш труд :)

Unknown комментирует...

Да, было интересно, но пока ещё не совсем понятно..

Условия копирования публикаций:

Все публикации в данном блоге являются частной собственностью авторов. Любое копирование информации допускается только при условии указания имени автора и активной ссылки на источник.