И как их протестировать
Библиотека тестирования — популярная библиотека, облегчающая тестирование компонентов фронтенда с помощью различных утилит. И если вы знакомы с ним, вы также знакомы с getByTestId
— довольно удобным способом нацеливания на элементы в DOM, чтобы подтвердить их существование. Когда я впервые узнал о тестировании компонентов React, я выбрал getByTestId
. Просто добавьте атрибут data-testid
к своему элементу и запросите его в своих тестах. Это может выглядеть примерно так:
Компонент
Тест
Но что это на самом деле говорит нам о том, что title
отображается пользователю? Ничего. Мы просто утверждаем, что элемент заголовка существует. Это значение может быть любым, и уж точно не тем, что ожидает пользователь.
Этот тест может иметь больше смысла в контексте родительского компонента Project
, где мы можем захотеть подтвердить, что проект был загружен с запросом заголовка выше. В любом случае, это значение может быть любым, и наш тест все равно будет пройден.
Когда мы тестируем наши компоненты React, мы должны стремиться тестировать их так же, как пользователи будут с ними взаимодействовать, и, таким образом, проверять значения, которые они увидят, или действия, которые они будут выполнять. Пользователей не интересуют атрибуты данных или classNames
. Сами создатели библиотеки тестирования выступают за то, чтобы запрашивать элементы различными способами, кроме data-testid
, если это возможно:
В духе руководящих принципов рекомендуется использовать это только после того, как другие запросы не работают для вашего варианта использования. Использование атрибутов data-testid не похоже на то, как используется ваше программное обеспечение, и его следует по возможности избегать.
Библиотека тестирования
Предположим, что потребитель компонента Project
вместо этого передает описание проекта в качестве свойства title
. Приведенный выше тест все равно пройдет, потому что присутствует data-testid
.
Но эта проблема не похожа на data-testid
. Вы можете оказаться в похожей ситуации, протестировав className
или настраиваемый атрибут.
«Другие запросы»
В этой документации библиотеки тестирования упоминается, что использование data-testid
следует использовать почти в крайнем случае. Но важно отметить, что его использование не всегда плохо, это просто зависит от того, для чего вы его используете. Например, запуск утверждения о том, что заголовок отображается на основе существования adata-testid
, не идеален, но, допустим, вы хотите просто получить элемент, чтобы затем выполнить над ним определенное действие, например, событие щелчка. Никакого риска, связанного с этим, нет. На основании этого ваш тест не проходит и не проваливается, в отличие от приведенного выше примера. Ниже вы увидите пример того, где этот атрибут особенно полезен и безопасен.
Однако для всех других сценариев я стремлюсь протестировать с использованием тех других запросов, упомянутых в документах, — начиная с тех, которые доступны всем, среди них — getByRole
, getByLabelText
, getByText
.
getByRole
Особенно полезно с button
элементами, есть много других элементов, которые вы можете запрашивать по их роли, хотя заголовок является одним из них. Согласно библиотеке тестирования, это должен быть ваш лучший выбор, поскольку с его помощью вы можете запрашивать практически все что угодно.
getByLabelText
Особенно полезно для форм, но они также принимают aria-label
атрибутов.
получить по тексту
Полезно при поиске неинтерактивных элементов, таких как div, span и параграфы.
byText
было бы отличным вариантом в приведенном выше примере. Это будет означать, что пользователь видит предполагаемый заголовок.
Как низко ты можешь пасть?
Ранее я упоминал, что нежелательное поведение прохождения теста на основе его data-testid
, когда фактические данные неверны, не имеет ничего общего с этим атрибутом. И вы правы, думая, что это также могло бы произойти при запросе с помощью aria-label
(если бы вы предоставили для него фиксированное жестко запрограммированное значение).
Предположим, мы хотим протестировать палитру цветов (представьте себе что-то вроде Pages
или Microsoft Word
, где у нас есть список различных цветов, но у нас также есть раздел «избранное» или «недавно использованные» цвета в другом палитре). . Мы хотим проверить, что при выборе цвета из палитры он добавляется в раздел недавно использовавшихся.Для этого мы автоматически предполагаем, что в палитре будет два вхождения одного и того же цвета (одно в общем списке все цвета и один в недавно использовавшемся разделе.) Тогда, возможно, стоит убедиться, что мы запрашиваем сам недавно использованный раздел, чтобы проверить существование цвета.
Вот тут-то и появляется мой любимый запрос — within
within
позволяет проверять наличие определенных элементов внутри других элементов. Это может выглядеть примерно так:
С помощью within
мы повысили точность и смоделировали поведение пользователя. Это оставляет мало места для ошибки.
Я также упоминал ранее, что в некоторых случаях getByTestId
не так уж рискованно. Приведенный выше тест является одним из таких случаев. Я извлекаю элемент через его data-testid
, чтобы затем углубиться и найти его дочерний элемент, но мое тестирование не проходит или не проходит на основе самого этого раздела.
Краткое содержание
Важно тестировать наши компоненты так же, как с ними будут взаимодействовать пользователи, включая проверку ожидаемых данных и избегание их атрибутов data-testid
. Хотя в некоторых случаях это неизбежно, проверка существования данных с использованием этих атрибутов может привести к ложным срабатываниям, если мы передадим неверную информацию.
Документация библиотеки тестирования предлагает использовать getByRole
большую часть времени, так как это подберет большинство элементов, если они доступны, а getByText
и getByLabelText
чрезвычайно полезны. Если бы мы хотели быть очень точными и проверять, что определенные элементы вложены в определенные элементы, мы могли бы использовать помощник within
для повышения точности.