Чек-лист — как тестировать поиск

Я посмотрела, как тестируют поиск начинающие тестировщики, и решила написать этот чит-лист проверок. Это такая серебряная пуля, которую можно применить на любом проекте, лишь немного варьируя под себя, под свой проект.

Поиск — он же есть практически в каждой системе. Поэтому здорово, когда есть шпаргалка «какие вопросы задать аналитику» и «какие проверки провести». Именно это мы в статье и обсудим. Сначала я дам чек-лист, а потом разберу каждый пункт отдельно.

Что надо узнать

  1. По каким полям поиск должен работать / по каким нет

  2. Ищет по включению или полному соответствию?

  3. Регистрозависимый ли поиск?

  4. Какая максимальная длина поисковой строки?

  5. А если длина превышена, запрос обрезается?

  6. Как работает поиск при пустом запросе?

Что надо проверить

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

  1. Поиск ищет по всем полям, указанным в ТЗ

  2. Поиск НЕ ищет по тем полям, которые НЕ указаны в ТЗ

  3. Релевантность выдачи — то, что я ищу, в начале списка, или в конце?

  4. Учитывается ли контекст поиска — ищу я по всему сайту или только разделу игрушек

  5. Регистронезависимость поиска — найдет ли «Платье», если я ввела «платье»?

  6. Ищет ли по включению или полному соответствию — «ту» найдет мне «туфли»?

  7. Найдет ли 2 слова из одного поля? В любом порядке введенные?

  8. Найдет ли 2 слова из разных полей?

  9. Ошибка в вводе (исправляются ли опечатки, ищет ли похожее)

  10. Исправляет ли система неправильную раскладку?

  11. Ищет ли на разных языках? А если сразу на двух попробовать?

  12. Поиск со спецсимволами работает?

  13. А с эмоджи? Не упадет система при вводе какашки?

  14. Тримаются ли открывающие и закрывающие пробелы

  15. Пустое поле / только пробелы в поле

  16. Нижнюю границу (от скольких символов ищет)

  17. Верхнюю произвольную границу — указанную в ТЗ

  18. Верхнюю границу на выходе

  19. Поиск технологической границы — ввести «войну и мир», 100 млн символов

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

1. Поиск ищет по всем полям, указанным в ТЗ

Вроде бы капитан очевидность, но с чего только новички не начинают свой чек-лист:

  • Оставить поле пустым

  • Вбить кириллицу / латиницу

  • Большую строку

  • Всяко потыкать поиск по названию (а если часть названия указать, а если с опечаткой, а если…)

Если надо выбирать, то последний вариант выглядит наиболее логичным. Он по крайней мере не абстрактная серебряная пуля про любое текстовое поле. Он про поиск.

Но ведь чтобы всяко-разно издеваться над названием, надо сначала убедиться, что по названию вообще ищет, верно? Так что пишем в названии слово «Тест» (или любое другое, но одно, без спецсимволов и прочего), его же вводим в строку поиска. Так мы понимаем, что поиск по названию в принципе работает. Значит, можно будет дальше над ним изгаляться =)

Но сначала надо проверить основное — то, что поиск вообще работает. Что он ищет по всем тем полям, по которым должен.

image-loader.svg

Иначе сами представьте, идет у нас чек-лист на 30 проверок по названию, а потом уже «что поиск работает по описанию, категории товара, бренду…». А времени на тестирование нет, и выделяется буквально 5–10 минут.

В итоге тестировщик провел первые 20 тестов и гордо говорит:

— Всё отлично! Поиск работает! А если всякую чухню в него вбить, не падает!

При этом поиск работает по 1 полю из 10 обязательных. И пользователи пытаются искать, а у них ничего не получается, потому что ищут не по названию. Нехорошо…

image-loader.svg

В любом чек-листе надо думать о приоритетах. Сначала — самое важное. Как в чек-листе в целом, так и внутри каждого блока проверок, постепенно идем от важного к неважному. От позитива к негативу.

Чтобы при ограниченном времени не пытаться в спешке понять, что в чек-листе важно, прыгая глазами туда-сюда и ища эти пункты.

А что самое важное в поиске? Для этого думаем, зачем его вообще делают. Чтобы искать. По чему? По каким-то полям / признакам. По каким? Узнаем и проверяем, ищет он по ним или нет.

2. Поиск НЕ ищет по тем полям, которые НЕ указаны в ТЗ

Если прошлый пункт ещё очевиден новичкам, то этот не особо. Поэтому давайте сначала подумаем —, а зачем тестировать то, что поиск не работает по полям, по которым не должен? Может, ну их, эти поля? Не должен же искать, чего проверять то?

А теперь представьте себе ситуации:

1. Я ищу в интернет-магазине «белая майка», а система вываливает всё, что угодно:

И если разобраться, то найдем слова «белая» и «майка» где-то внутри этих товаров. Например, в комментариях.

2. Я операционист банка. Пришла клиентка «Ольга Гагарина», я ищу её в системе, а в ответ получаю:

  • Ольга Морозова (у которой адрес прописки на ул Гагарина)

  • Иван Иванов (жена Ольга, в адресе тоже есть Гагарина)

  • Петр Забубенов (в комментарии к адресу «арендодатель Ольга», в любимых певицах Гагарина)

image-loader.svg

Ведь не зря же делают поиск по конкретным полям, а не «ищи по всему, что видишь». Как раз для того, чтобы результат был более релевантным. И если не тестировать, что поиск НЕ ищет там, где не должен, то в поисковую выборку может попасть вообще не то, что хотелось.

Поэтому проверять «поиск по полю НЕ ищет» тоже надо. А как? Вот тестируют у меня студенты Folks. Читаем ТЗ:

Фолкс найдет человека по следующим признакам: ФИО, предпочтительному имени, дате рождения (дд.мм.гггг), компании, модели девайса, его OS, автору изменений

Первая попытка — проверяют только перечисленные поля в чек-листе. Убеждаются, что поиск по ним работает. Обсуждаем, зачем тестировать «негатив», выясняем. Следующая попытка — проводится один дополнительный тест, что по одному из оставшихся полей карточки поиск НЕ работает. И всё.

Обсуждаем на кошках: допустим, в системе есть 100 полей. Поиск работает только по 10 из них. Что проверяем?

— Что по каждому из этих полей ищет. И одно любое другое, что по нему НЕ ищет.

Моя коллега Ольга Алифанова придумала такую аналогию для этой ситуации:

У нас огромный гипермаркет, в нем сто отделов

В десяти из этих отделов продавщицы Клава, Маня, Муся, Света, Ира, Ната, Дина, Раиса, Тамара и Галя никогда не должны обвешивать никого. В 90 оставшихся отделах продавщицы обвешивают всех.

Достаточно ли нам убедиться, что Муся дает точный вес, чтобы сказать, что Света и Раиса тоже не обманывают покупателей?

image-loader.svg

Если мы проверили одно поле, мы знаем ровно то, что именно по этому полю система НЕ ищет. Но мы ничего не знаем про оставшиеся 89 полей. И не узнаем, пока не проверим.

А проверять надо, потому что иначе мы рискуем получить нерелевантный поиск, который работает по абсолютно рандомным полям системы.

Но тогда возникает другой вопрос. Сколько это тестов?

  • Поиск ищет по всем полям, указанным в ТЗ

  • Поиск НЕ ищет по тем полям, которые НЕ указаны в ТЗ

Нужно ли нам писать отдельный тест на каждое поле? Или их можно объединить? Не получится ли кейс «я надену всё лучшее сразу» и при падении теста будет совершенно непонятно, на чем именно сломалось?

image-loader.svg

См также:

В тестировании всегда начинаем с простого — чем плох принцип «надену всё лучшее сразу»

Смотрите, допустим, что у нас по полю с именем искать система должна, а по фамилии — не должна. Я пишу тест:

В строку поиска вбить: Тест

В системе подготовить карточки с данными:

1. Имя = Тест

2. Фамилия = Тест

ОР: 1

Давайте предположим, что в системе баг и по фамилии она тоже ищет. Какой будет ФР?

ФР: 1, 2

Вернулись обе карточки. Можно ли на основании этого сделать вывод, из-за чего именно поиск сломался? Из-за какого конкретно поля? Можно! Мы четко понимаем из такого ФР, что:

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

  2. А вот с фамилией косяк

И наоборот, если у нас будет такой результат:

ФР: (пусто)

Мы тоже вполне четко понимаем, что:

  1. С именем косяк

  2. Фамилия работает как надо

Получается, мы можем объединить тесты без потери простоты локализации при падении! Даже если полей будет 100, а не 2.

image-loader.svg

А дальше уже встает вопрос простоты проведения =) Вернемся к примеру про 100 полей, из которых поиск работает только по 10.

Вот смотрите, если мы делаем автоматизированный тест, то делаем «сразу хорошо». Один раз заполнили 100 карточек, в каждой 1 поле (каждый раз разное).

А вот если мы проводим тест вручную, то тут надо понимать, что заполнение каждой карточки — это затраты времени. Нажал «создать», заполнил поле, нажал «Сохранить» и система чуток подумала при сохранении. И так 100 раз? Грустновато получается.

image-loader.svg

Вообще в этом случае идеальный вариант — полуавтоматизация. Например, REST-метод создания карточки. Тогда создали в постмане коллекцию для создания 100 карточек один раз —, а потом один щелчок кнопки, и все карточки готовы!

Или может, разработчик поможет написать утилитку для заполнения базы. Вот как пример у меня было на одном из проектов: заполняешь табличку экселя значениями, одна команда — и они уже в базе! И снова всё просто. Один раз табличку подготовили, потом используем.

А вот если у нас только графический интерфейс, тогда уже начинаем думать, что можно совместить без потери «качества».

Можно ли ввести искомое слово во все 10 полей одной карточки? Нет, потому что когда система её найдет, мы не будем знать, по какому из 10 полей она сработала. И информацию от такого теста мы получим лишь «по какому-то полю из 10 обязательных поиск работает». Не совсем то, что надо. Значит, позитив объединить нельзя, создаем 10 карточек.

А как насчет негатива? Поиск НЕ должен сработать по 90 полям. Значит, мы можем заполнить все 90 полей одним значением в одной карточке. И поискать по нему. В идеале система ничего не найдет.

image-loader.svg

Конечно, если в системе есть баг и карточка нашлась, ошибку придется локализовывать. И тогда уже или заполнять 90 разных карточек, или использовать метод бисеционного деления.

А как правильно заполнить наши поля? Каким-то одним значением. Оно должно быть простое, без излишеств, без принципа «надену всё лучшее сразу». То есть не надо сразу класть туда спецсимволы, эмоджи, разные алфавиты и регистры, комбинацию слов через пробел… Написали везде «тест» или «котик», и всё.

Потому что сейчас мы проверяем самое важно — что поиск вообще работает. А вот как он работает и обрабатывает всяко-разный ввод — проверим чуть позже. А иначе если поиск не сработает на »%#$**», как понять, он вообще не работает по полю, или не ищет спецсимволы?

image-loader.svg

3. Релевантность выдачи

Здесь важно проверить приоритет поисковой выдачи. Понятно, что туда может попасть что-то «не то». Чем больше у нас данных и чем больше полей, по которым поиск возможен, тем больше вариантов на каждый запрос.

Вот, допустим, пытаюсь я найти однотонное платье в интернет-магазине. Что я могу задать в поиске? «Желтое платье». Что я получаю в выборке?

image-loader.svg

Целиком желтое платье на ШЕСТОМ месте. После 5 черных с вкраплениями желтого цвета.

С одной стороны, это логично. Ведь на других платьях желтый цвет тоже есть, поэтому его добавили в параметр «цвета». Ищем по параметрам:

  • Платье — да, тут платья

  • Желтый цвет — да, в блоке «цвета» есть слово «желтый» у каждого.

И как раз в силу большого ассортимента товаров мы получаем то, что получаем. Можно ли как-то на эту выборку повлиять?

Можно. Причем можно даже разные варианты придумать:

  1. Можно добавить в систему галочку «однотонная вещь». И проставлять её при заполнении товаров. А потом уже по запросу вещи конкретного цвета выводить сначала вещи с этой галочкой, а потом уже все остальные.

    При этом можно даже в фильтры вывести такую галку, чтобы пользователь мог выбрать «только однотонные», и получить только вещи нужного ему цвета.

  2. Можно фильтр настроить так:

    1. Сначала вещи, у которых только один цвет

    2. Потом все остальные (многоцветные)

    В этом случае также можно сделать галку для пользователя «только однотонные», которая будет выводить только вещи, в которых указан один цвет.

  3. Можно при заполнении цветов вещи добавить галку «основной», если они выбираются из списка. Или, если их вводят вручную (что вряд ли) ориентироваться на порядок цветов. Какой идет первым — он приоритетный.

И тогда уже при выдаче результатов сначала отдаем вещи, у которых запрошенный пользователем — приоритетный.

А вот другой пример. Исходный запрос — «красная майка женская»:

image-loader.svg

Что вернула система:

  1. Черная майка

  2. Мужская майка

  3. Розовая с белым

  4. Белая майка

А то, что нам нужно, аж на 8-ом месте. Почему так? А снова приоритеты. Где-то мелькнуло слово «красный», вон на мужских майках то каемка красная, то майка. Где-то просто ошиблись цветом при заполнении данных (и такое бывает), где-то в комментариях или другом описании было написано ключевое слово (что-то типа «подойдет и мужчинам, и женщинам, унисекс!»).

Но в результате — нерелевантная выборка. И если большой интернет-магазин с его оборотами может себе это позволить (и так найдут), то маленький, пытающийся завоевать доверие пользователей — нет. Впрочем, это уже выбор хозяина продукта.

Тут хотелось бы добавить, что поиск может быть не только в интернет-магазине. Искать можно среди данных: ФИО, адресов, телефонов… Например, если у нас система с клиентскими данными типа Users. Или подсказки Дадаты, ведь они работают по своим справочникам, но приоритезируют информацию:

image-loader.svg

Имена бывают самые разные, но если вместо Александра и Алексея система предложит Алладина, Алана и Алмаза, то толку от такой системы? Проще руками ввести…

4. Контекст поиска

Откуда я вызываю поиск? С главной страницы сайта или из конкретного раздела?

Скажем, если на Озоне попробовать поискать «котенок» на главной странице, он поищет везде: в книжках, игрушках, чашках, воздушных шариках…

image-loader.svg

А вот если я буду искать в разделе книг, то буду ожидать только книги про котят, не игрушки:

image-loader.svg

В интернет-магазинах обычно куча разных товаров, поэтому контекст поиска очень важен, чтобы выдавать релевантные товары.

А ещё контекст очень важен в мессенджерах. Искать вообще везде, во всех 100500 чатах, или только в одном? Будет очень плохо, если я запущу поиск по диалогу с мамой, а система выдаст мне кучу рабочих чатиков, где нашла совпадение…

image-loader.svg

5. Регистронезависимость поиска

Обычно поиск регистронезависимый, и это логично. Представьте, что я ввожу:

Женское платье

А система ничего не находит, ведь у неё есть только «Платье» (первая заглавная, а у нас в запросе — нет)… Но пользователь же не в курсе, что надо немного изменить запрос, он будет думать, что платья тут просто не продаются…

Так что проверяем:

  1. нижний регистр

  2. ВЕРХНИЙ РЕГИСТР

  3. ЗоЛоТую СеРеДиНу

.

6. Ищет ли по включению или полному соответствию

Поиск по включению — это когда можно ввести только часть слова. Например, «ко» вместо «котик». Это очень удобно во всяких чатах. Вот, например, я помню, что Ольга рассказывала историю про баг, связанный с кораблем. Но в каком падеже она говорила?

На корабле…

У корабля…

Есть корабль…

Если поиск работает по полному совпадению, то нужно перебирать все падежи. Если он работает по включению, мне достаточно написать «корабл».

Бывает, что сам поиск работает по полному совпадению, но при вводе подсказывает варианты:

Ту → туфли / тушь / туника

image-loader.svg

При этом если выбрал подсказку — показались товары. А если не выбрал, то сам себе злобная чебурашка.

image-loader.svg

Впрочем, некоторые магазины всё равно предлагают товары. Или которые включают в себя введенный текст, или какие-то вариации (Озон мне на «ту» выдал товары с «Two» в названии!)

В любом случае, нужно уточнить — как должно работать? А потом проверить:

  • Поиск по полному соответствию в одном слове

  • Поиск по частичному соответствию в одном слове — совпадение в начале слова / середине / конце (вспоминаем про классы эквивалентности и граничные значения)

.

7. Два слова из одного поля

А что будет, если у нас не одно слово, а два или более? Причем 2 слова у нас может быть:

  1. В искомом поле

  2. В поисковом запросе

И это будут разные тесты! Например, название товара: «Игровой набор». Тесты при этом:

  1. Игровой → то есть в поле несколько слов, а мы ввели одно из них, найдётся?

  2. Игровой набор → в поиске тоже несколько слов

Но что будет, если в поиске мы изменим порядок слов?

image-loader.svg

8. Два слова из разных полей

Если мы проверяем несколько слов в поиске, то тут тоже возможны варианты:

  1. Они все из разных полей — например, мы ищем по цвету + названию + полу: «красная майка женская».

  2. Они из одного поля — как выше с игровым набором. И в этом случае намного интереснее изменить порядок слов и проверить поведение системы =)

Важно понимать, что это разные тесты. И стоит проверить и тот вариант, и другой.

.

9. Опечатки

Как система работает с опечатками? Найдет ли похожее слово?

Краный галстук → Красный галстук

Если система работает с опечатками, то как:

Это, конечно, зависит от длины искомого слова, но тогда исправляются ли опечатки в коротких словах? Тут, главное, не увлечься, и не побежать ставить баг «система не исправила хлеб на пиво» =))

image-loader.svg

10. Неправильная раскладка

Типичный пример опечатки — пользователь забыл изменить раскладку на клавиатуре и напечатал английскими символами русский текст. Ищем «котик», но вводим «rjnbr».

Озон понимает, что мы ошиблись и ненавязчиво исправляет ошибку, подсказывая варианты по котикам:

image-loader.svg

Если нажать энтер, то увидим, что система исправила раскладку прямо в поисковой строке, но на всякий случай уточняет, правильно ли сделала:

image-loader.svg

Это — хороший тон. Если система русскоязычная и пользователь ввел данные на английском, по которым ничего не ищется, надо проверить — не забыл ли он переключить раскладку? Если по переключенной раскладке поиск работает, показываем эти результаты.

Всегда лучше ненавязчиво исправить ошибку пользователя, чем гневно тыкать ему под нос «По такому запросу ничего не найдено!»

.

11. Другой язык

Что, если в системе есть данные и на русском, и на английском? Или даже смешанный вариант: «Сухой корм Purina ONE». Найдет ли система и по русскому алфавиту, и по английскому?

А ещё интересный кейс, если в системе можно изменить язык! Что будет, если я изменю язык сайта на английский, а поищу по русскому названию, или наоборот?

image-loader.svg

12. Спецсимволы

Это стандартная серебряная пуля для всех текстовых полей:

И поэтому приоритет у таких проверок не супер-важный. Ведь проверить «английский, русский, спецсимволы, перемешал» может любой человек, даже робот. А тестировщик отталкивается от того, что он вообще тестирует. Что это за поле, для чего оно нужно? Сначала особенность приложения, потом серебряная пуля.

Но проверять этот мини чек-лист для любого текстового поля тоже надо. Ведь нам надо предоставить информацию о том, как система себя поведет в том или ином случае. А спецсимволы попасть в поле вполне себе могут, причем по разным причинам.

1. Спецсимвол есть в искомом поле. Вот буквально на днях студентка завела такой интересный баг на одном из сайтов поиска книг — если в запросе есть восклицательный знак, поиск не срабатывает:

image-loader.svg

При том, что сама книга на сайте есть:

image-loader.svg

И система умеет работать со спецсимволами. Скажем, по вопросительному знаку она ищет:

image-loader.svg

Поэтому проверить нужно все спецсимволы. Я обычно делаю это примерно так: создаю товар / искомый объект сразу с набором спецсимволов:

~!@#$%^&*()_+{}|:»>? <Ё!”№;%:?*()_+/Ъ,/.,;’[]\|

И по нему ищу. А вот если не срабатывает, тогда уже разбираюсь, с каким именно символом проблема.

2. Пользователь может забыть переключить раскладку и вот уже вместо «Хлеб» он вводит »{kt,»

3. Пользователь может случайно вкопипастить в поле какой-то текст со спецсимволами. Ошибки тоже надо предусмотреть, и уж точно не падать на этом =)

.

13. Эмоджи

Я специально вынесла их в отдельный пункт, чтобы вы не забыли проверить. Потому что эмоджи — это даже не совсем спецсимвол. Система может не искать по спецсимволам, но при этом падать на эмоджи. Получается, классы эквивалентности разные!

Так что в любую текстовую строку, в том числе строку поиска, обязательно вводим какую-нибудь эмоджи. Например, отсюда:


    
            

© Habrahabr.ru