Содержание

.indexOf() — JavaScript — Дока

  1. Кратко
  2. Как пишется
  3. Как понять
  4. На практике
    1. Николай Лопин советует

Кратко

Скопировано

Этот метод служит для поиска. Он определён для массивов и строк.

При вызове нужно передать, что искать. Вернётся индекс первого найденного элемента или -1, если ничего не нашлось.

Как пишется

Скопировано

Искомый элемент передаётся первым аргументом — array1.indexOf('иголка')

const example = ['чебурашка', 'гена', 'шапокляк', 'лариска']console.log(example.indexOf('гена'))// 1
          const example = ['чебурашка', 'гена', 'шапокляк', 'лариска']
console.log(example.indexOf('гена'))
// 1

Как понять

Скопировано

Для массивов: ищет переданный элемент в массиве. Если элемент один, то возвращает индекс этого элемента. Если элементов много — возвращает индекс первого подходящего элемента. Элемента в массиве нет — вернёт -1

const haystack = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя']console.log(haystack.indexOf('Лена'))// 3console.log(haystack.indexOf('Настя'))// 1console.log(haystack.indexOf('Эдуард Аркадьевич'))// -1
          const haystack = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя']
console.log(haystack.indexOf('Лена'))
// 3
console.log(haystack.indexOf('Настя'))
// 1
console.log(haystack.indexOf('Эдуард Аркадьевич'))
// -1

Для строк: работает так же, как с массивами, но можно искать не только буквы в строке, но и подстроки. Например:

const haystack = 'Мама мыла раму'console.log(haystack.indexOf('а'))// 1console.log(haystack.indexOf('мыла'))// 5console.log(haystack.indexOf('ё'))// -1
          const haystack = 'Мама мыла раму'
console.log(haystack.indexOf('а'))
// 1
console.log(haystack.indexOf('мыла'))
// 5
console.log(haystack.indexOf('ё'))
// -1

На практике

Скопировано

Николай Лопин советует

Скопировано

🛠 Найти индексы всех подходящих элементов

Скопировано

Чтобы найти индексы всех искомых элементов, используют второй аргумент.

Он указывает, с какого места начинать поиск. Таким образом можно проигнорировать те элементы, которые уже нашли и начинать поиск сразу после них:

const haystack = 'мама мыла раму'let lastResult// напечатаем индексы всех букв М во фразеwhile (lastResult !== -1) {  lastResult = haystack.indexOf('м', lastResult + 1)  if (lastResult !== -1) {    console.log(lastResult)  }}
          const haystack = 'мама мыла раму'
let lastResult
// напечатаем индексы всех букв М во фразе
while (lastResult !== -1) {
  lastResult = haystack.indexOf('м', lastResult + 1)
  if (lastResult !== -1) {
    console.log(lastResult)
  }
}

🛠

indexOf() или includes() Скопировано

Не используйте indexOf() для проверки вхождения элемента в массив/строку, для этого есть метод includes().

Раньше методом indexOf() часто проверяли, есть ли элемент в массиве. Эта задача проще, индекс здесь не нужен, но других методов для этого не было.

Поэтому в старых скриптах можно увидеть такой код:

const guestList = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя', 'Эммануил']const guest = // получаем откуда-нибудь имя гостяif (guestList.indexOf(guest) >= 0) {  // пускаем на вечеринку} else {  // отправляем домой}
          
const guestList = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя', 'Эммануил'] const guest = // получаем откуда-нибудь имя гостя if (guestList.indexOf(guest) >= 0) { // пускаем на вечеринку } else { // отправляем домой }

🤖 Из-за того, что indexOf() возвращает индекс, в условии обязательно нужна проверка (>= 0 или !==-1

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

Дело в том, что JavaScript интерпретирует ненулевые числа как истину (true) и будет запускать первую ветку if. А на первом госте indexOf() вернёт 0, что считается ложным (false), и наш скрипт не пустит человека на вечеринку.

Оценка материала

Если вы нашли ошибку, отправьте нам пул-реквест!

Во время отправки формы что-то пошло не так. Попробуйте ещё раз?

Предыдущий материал

.includes()

ctrl + alt +

Следующий материал

.length

ctrl + alt +

includes vs indexOf / Хабр

Начиная с ECMAScript 2016 в JavaScript появился новый метод includes для работы с массивами. По своей сути он очень сильно напоминает indexOf. В этой статье я хочу рассмотреть подробнее для чего был введен этод метод и в чем его отличие от indexOf.



Массивы

Итак, метод Array.prototype.includes определяет содержится ли в массиве искомое значение и возвращает true или false. Таким образом, в отличие от indexOf, который возвращает целое число, includes возвращает значение типа boolean. Это нововведение поможет разработчикам писать более чистый и понятный код.

Например, вот стандартный пример проверки того, содержится ли элемент в массиве, с помощью indexOf:

var numbers = [3, 5, 8, 11, 23, 7];
if (numbers.indexOf(1) !== -1) {
    // ...
}
Используя includes, то же самое можно написать так:

var numbers = [3, 5, 8, 11, 23, 7];
if (numbers.includes(1)) {
    // ...
}
Также при внедрении этого метода были учтены некоторые неочевидные особенности, замеченные при работе с indexOf. В отношении значений NaN поведение этого метода отличается.

Рассмотрим на примере:

var numbers = [3, 5, 8, 11, 23, 7, NaN];
if (numbers.indexOf(NaN) !== -1) {
    // Этот код не выполнится
}
if (numbers.includes(NaN)) {
    // Этот код выполнится
}
Таким образом, indexOf(NaN) всегда возвращает -1, независимо от того содержится ли это значение в массиве, а includes(NaN) возвращает true или false в зависимости от того есть этот элемен в массиве или нет.

Производительность

Оценка производительности javascript методов не такая уж очевидная вешь, так как по сути в разных браузерах одна и та же функция может быть реализована по-разному в зависимости от языка, на котором написан сам браузер. К тому же очень много зависит от компьютера, на котором делается эта оценка. Но, тем не менее, я попытался сделать небольшой анализ.

Я создал массив из 10000 целых положительных чисел и использовал для анализа сайт jsbench.github.io. В обоих случаях, для чистоты эксперимента, был использован один и тот же массив.

Оценка производилась в браузерах Chrome 53 и Firefox 48.

Chrome
includes indexOf
элемент есть
в середине массива
8,361 ops/sec ±0.38% 31,296 ops/sec ±0.65%
элемент есть
в начале массива
22,043,904 ops/sec ±1.89% 136,512,737 ops/sec ±2.06%
искомого эелемента
нет в массиве
4,018 ops/sec ±0.71% 95,221 ops/sec ±0.53%

Firefox
includes indexOf
элемент есть
в середине массива
84,880 ops/sec ±0.59% 86,612 ops/sec ±1.35%
элемент есть
в начале массива
34,087,623 ops/sec ±0.99% 33,196,839 ops/sec ±0.84%
искомого эелемента
нет в массиве
25,253 ops/sec ±2.
75%
14,994 ops/sec ±1.16%
Получается, что в Chrome indexOf всегда работает быстрее, а в Firefox ощутимой разницы практически нет (кроме случая, когда в массиве нет искомого элемента). И поведение нового метода в Firefox кажется более логичным, так как в общем-то indexOf и includes по логике должны иметь одну и ту же вычислительную сложность.

Строки

Аналогичный метод был добавлен и для работы со строками начиная с ECMAScript 2015. Ранее в Firefox в версиях с 18 по 39 этот метод существовал под именем contains, однако из-за проблем совместимости он был переименован в includes().

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

Браузер Массив Строки
Chrome 47 41
Firefox 43 40
IE нет нет
Opera 34 нет
Safari 9 9

Index • JavaScript для нетерпеливых программистов (версия ES2022)

JavaScript для нетерпеливых программистов (версия ES2022)
Пожалуйста, поддержите эту книгу: купи это или пожертвовать

Символ

  • !x
  • ++х
  • х++
  • , (запятая)
  • --х
  • х--
  • х && у
  • х + у
  • х-у
  • х/у
  • х << у
  • х === у
  • х >>> у
  • х >> у
  • х ??= у
  • х ?? д
  • х и у
  • х ** у
  • х * у 9у
  • х ¦ у
  • х ¦¦ у
  • х ٪ у
  • =
  • с ? т : е
  • __прото__

A

  • средство доступа (объектный литерал)
  • дополнение
  • Модуль AMD
  • выражение анонимной функции
  • аргумент
  • Аргумент
  • против параметра
  • Массив
  • Отверстие для массива
  • Индекс массива
  • Литерал массива
  • Массив, плотный
  • Массив, многомерный
  • Массив, разреженный
  • Разрушение массива
  • Объект, подобный массиву
  • Аррайбуфер
  • Массивы, фиксированная компоновка
  • Массивы, последовательность
  • функция стрелки
  • ESCII-побег
  • ASI (автоматическая вставка точки с запятой)
  • утверждать (модуль)
  • утверждение
  • оператор присваивания
  • асинхронный
  • асинхронная функция
  • асинхронная функция*
  • асинхронное ожидание
  • асинхронный генератор
  • асинхронный итеративный
  • асинхронная итерация
  • асинхронный итератор
  • асинхронное программирование
  • атрибут свойства
  • автоматическая вставка точки с запятой (ASI)
  • ожидание (асинхронная функция)
  • ожидание (асинхронный генератор)

B

  • базовый класс
  • с прямым порядком байтов
  • большойинт
  • BigInt64Array
  • BigUint64Array
  • двоичный целочисленный литерал
  • привязка (переменная)
  • побитовое И
  • побитовое Не
  • побитовое или
  • побитовый Xor
  • логическое значение
  • Логическое значение()
  • связанная переменная
  • перерыв

C

  • стек вызовов
  • обратный вызов (асинхронный шаблон)
  • функция обратного вызова
  • верблюжий чемодан
  • верблюжий чемодан
  • кейс, верблюжий
  • корпус, приборная панель
  • чехол, кебаб
  • чехол
  • , змейка
  • регистр, подчеркивание
  • улов
  • класс
  • класс
  • объявление класса
  • определение класса
  • выражение класса
  • класс
  • , база
  • Класс
  • , производный от
  • класс
  • , примесь
  • классов, расширение
  • крышка
  • кодовая точка
  • кодовый блок
  • принуждение
  • Функция комбинатора
  • , Обещание
  • оператор запятой
  • Модуль CommonJS
  • сравнение по тождеству
  • сравнение по значению
  • ключ вычисляемого свойства
  • объединение строк
  • условный оператор
  • консоль
  • консоль. ошибка()
  • console.log()
  • константа
  • константа
  • функция-конструктор (роль обычной функции)
  • продолжить
  • Преобразование в [тип]
  • Всемирное координированное время (UTC)
  • копировать объект глубоко
  • копировать объект неглубоко

D

  • чехол для приборной панели
  • чехол для приборной панели
  • Просмотр данных
  • дата
  • формат даты и времени
  • десятичный литерал с плавающей запятой
  • десятичный целочисленный литерал
  • оператор декрементации (префикс)
  • оператор декрементации (суффикс)
  • глубокая копия объекта
  • экспорт по умолчанию
  • значение по умолчанию (деструктуризация)
  • значение по умолчанию (параметр)
  • оператор значения по умолчанию ( ?? )
  • удалить
  • удаление свойства
  • плотный массив
  • производный класс
  • дескриптор свойства
  • деструктивная операция
  • деструктуризация
  • деструктурирование массива
  • деструктурирование объекта
  • объект словаря
  • прямой вызов метода
  • отправленный вызов метода
  • разделить на оператора
  • подразделение
  • пока
  • динамический импорт
  • динамический это
  • динамический против статического

E

  • ранняя активация
  • Экма
  • ECMA-262
  • ECMAScript
  • Модуль ECMAScript
  • Эйх, Брендан
  • порядок следования байтов (типизированные массивы)
  • перечислимость
  • перечисляемый (атрибут свойства)
  • оператор равенства
  • Модуль ЕС
  • побег, ASCII
  • побег, кодовая точка Unicode
  • побег, кодовая единица Unicode
  • экранирование HTML
  • оценка()
  • вычисление выражения
  • событие (асинхронный шаблон)
  • цикл событий
  • исключение
  • упражнений, начало работы с
  • возведение в степень
  • экспорт
  • экспорт по умолчанию
  • экспорт, по умолчанию
  • экспорт, названный
  • выражение
  • расширение классов
  • удлиняет
  • внешняя итерация
  • извлечение метода

F

  • ложный
  • ложность
  • ложный
  • наконец
  • Массивы с фиксированной компоновкой
  • объект фиксированной компоновки
  • флагов (регулярное выражение)
  • Массив с плавающей запятой32
  • Массив с плавающей точкой64
  • литерал с плавающей запятой
  • для
  • ожидание
  • для входящих
  • для
  • свободная переменная
  • замораживание объекта
  • выполнено (состояние обещания)
  • объявление функции
  • функциональное выражение, анонимное
  • Функциональное выражение
  • с именем
  • функция, стрелка
  • функция, обычная
  • функция, роли обычного
  • функция, специализированная
  • функция*

Г

  • сбор мусора
  • Генератор
  • , асинхронный
  • Генератор
  • синхронный
  • геттер (литерал объекта)
  • глобальный
  • глобальный объект
  • глобальная область действия
  • глобальная переменная
  • глобальныйЭтот
  • по Гринвичу (время по Гринвичу)
  • графемный кластер
  • Среднее время по Гринвичу (GMT)

H

  • куча
  • шестнадцатеричный целочисленный литерал
  • подъемный
  • отверстие в массиве

I

  • идентификатор
  • идентификатор объекта
  • если
  • IIFE (немедленно вызываемое функциональное выражение)
  • немедленно вызванное функциональное выражение (IIFE)
  • импорт
  • импорт()
  • импорт, названный
  • импорт, пространство имен
  • импорт. мета
  • import.meta.url
  • импорт, динамический
  • импорт, статический
  • в
  • оператор приращения (префикс)
  • оператор приращения (суффикс)
  • индекс массива
  • Бесконечность
  • наследование, множественное
  • наследство, холост
  • экземпляр
  • экземпляр
  • Int16Array
  • Int32Array
  • Int8Array
  • целых чисел
  • целое, безопасное
  • внутренняя итерация
  • итеративный (асинхронный)
  • итеративный (синхронный)
  • итерация, асинхронная
  • итерация, внешняя
  • итерация, внутренняя
  • итерация, синхронная
  • итератор (асинхронный)
  • итератор (синхронный)

J

  • JSON (формат данных)
  • JSON (объект пространства имен)

K

  • Чемодан для кебаба
  • Чемодан для кебаба
  • ключевое слово

L

  • этикетка
  • Оператор левой смены
  • пусть
  • лексический этот
  • список свойств
  • с прямым порядком байтов
  • логический И
  • логический Не
  • логический или

М

  • Карта
  • Карта
  • Карта против объекта
  • Math (объект пространства имен)
  • метод
  • метод (литерал объекта)
  • метод (роль обычной функции)
  • вызов метода
  • , прямой
  • Вызов метода
  • , отправлено
  • Метод
  • , извлечение
  • минус оператор (двоичный)
  • минус оператор (унарный)
  • смешанный класс
  • спецификатор модуля
  • Модуль
  • , AMD
  • Модуль
  • , CommonJS
  • многомерный массив
  • множественное наследование
  • несколько возвращаемых значений
  • умножение

N

  • именованный экспортный
  • именованное функциональное выражение
  • именованный импорт
  • именованный параметр
  • импорт пространства имен
  • NaN
  • узлы_модули
  • н/мин
  • нпм пакет
  • ноль
  • нулевой оператор присваивания объединения (`??=`)
  • нулевой оператор объединения ( ?? )
  • номер
  • Номер()

О

  • Объект
  • литерал объекта
  • Объект
  • против карты
  • Объект
  • против примитивного значения
  • Объект()
  • объект, копировать глубоко
  • объект, скопируйте неглубоко
  • объект, словарь
  • объект, фиксированная компоновка
  • Объект
  • , замораживающий
  • Объект
  • , личность
  • объектно-деструктурирующий
  • Объект. is()
  • восьмеричный целочисленный литерал
  • дополнение единиц
  • оператор, назначение
  • оператор, запятая
  • Оператор
  • , значение по умолчанию ( ?? )
  • оператор, равенство
  • Оператор
  • , нулевое объединение ( ?? )
  • оператор, нулевое объединение присваивания (`??=`)
  • оператор, пустота
  • обычная функция
  • обычная функция, роли
  • переопределение свойства

P

  • упаковка, н/мин
  • пакет.json
  • параметр
  • значение параметра по умолчанию
  • Параметр
  • против аргумента
  • прохождение личности
  • передача по значению
  • Шаблон
  • (регулярное выражение)
  • в ожидании (состояние обещания)
  • плюс оператор (двоичный)
  • плюс оператор (унарный)
  • полифилл
  • полифилл, спекулятивный
  • понифилл
  • примитивное значение
  • примитивное значение по сравнению с объектом
  • личное имя
  • частный слот
  • проллифилл
  • Обещание
  • Обещание
  • Функция комбинатора обещаний
  • Обещание, состояния
  • Обещание. все()
  • Обещание.allSettled()
  • Обещание.любое()
  • Обещание.гонка()
  • свойств, листинг
  • имущество
  • имущество (объект)
  • атрибут свойства
  • дескриптор свойства
  • ключ свойства
  • Ключ свойства
  • , вычисленный
  • Ключ свойства
  • ,
  • в кавычках
  • имя свойства
  • символ свойства
  • сокращенное значение свойства
  • свойство
  • , удаление
  • прототип
  • прототип цепи
  • публичный слот
  • общеизвестный символ

В

    Тесты
  • , начало работы с
  • указанный ключ свойства

R

  • реальная функция (роль обычной функции)
  • приемник
  • Регулярное выражение
  • регулярное выражение
  • литерал регулярного выражения
  • отклонено (состояние обещания)
  • остаточный оператор
  • ЗАМЕНА
  • реплика
  • Требовать JS
  • зарезервированное слово
  • остаточный элемент (деструктурирование массива)
  • остаточный параметр (вызов функции)
  • остальное свойство (объект-деструктурирование)
  • возвращаемых значений, кратных
  • Выкройка модуля раскрытия
  • ролей обычной функции
  • семантика выполнения до завершения

S

  • безопасное целое число
  • область действия переменной
  • скрипт
  • сам
  • Массивы последовательности
  • Комплект
  • Набор
  • сеттер (литерал объекта)
  • заселено (состояние Promise)
  • слежка
  • поверхностная копия объекта
  • прокладка
  • короткое замыкание
  • подписанный оператор правой смены
  • одиночное наследование
  • неаккуратный режим
  • слот
  • , частный
  • слот
  • , общедоступный
  • чехол для змеи
  • чехол для змеи
  • разреженный массив
  • специализированная функция
  • Спецификатор
  • , модуль
  • спекулятивный полифилл
  • распространение ( . .. ) в вызов функции
  • распространение в литерал массива
  • распространение в объектный литерал
  • выписка
  • состояний Обещания
  • статический
  • статический импорт
  • статических против динамических
  • строгий режим
  • строка
  • Строка()
  • подкласс
  • подкласс
  • вычитание
  • суперкласс
  • переключатель
  • символ
  • Символ
  • , общеизвестный
  • синхронный генератор
  • синхронный итеративный
  • синхронная итерация
  • синхронный итератор
  • синтаксис

T

  • шаблон с тегами
  • очередь задач
  • ТС39
  • TC39 процесс
  • ТДЗ (временная мертвая зона)
  • Технический комитет 39
  • литерал шаблона
  • временная мертвая зона
  • тернарный оператор
  • этот
  • это , динамический
  • это , лексический
  • это , значения
  • бросок
  • значение времени
  • раз оператор
  • в степени оператора
  • запятые в конце литералов массива
  • завершающих запятых в JSON
  • замыкающие запятые в литералах объектов
  • запятые в конце списка параметров
  • правда
  • правдивость
  • правдивый
  • попробовать
  • тип
  • иерархия типов
  • подпись типа
  • Типизированный массив
  • тип

U

  • Uint16Array
  • Uint32Array
  • Uint8Array
  • Uint8ClampedArray
  • не определено
  • регистр подчеркивания
  • подчеркивание регистр
  • Юникод
  • Кодовая точка Unicode escape
  • Escape-блок кода Unicode
  • Формат преобразования Юникода (UTF)
  • Модульный тест
  • беззнаковый оператор сдвига вправо
  • UTC (Всемирное координированное время)
  • UTF (формат преобразования Unicode)
  • УТФ-16
  • UTF-32
  • UTF-8

В

  • сохранение стоимости
  • переменная, связанная
  • переменная, бесплатная
  • переменная, область действия
  • пустота оператор

Вт

  • Слабая карта
  • Слабая карта
  • Слабый набор
  • Слабый набор
  • Веб-работник
  • , а
  • окно
  • типов оболочки (для примитивных типов)

Y

  • выход (асинхронный генератор)
  • выход (синхронный генератор)
  • выход* (асинхронный генератор)
  • выход* (синхронный генератор)

Z

  • Z (Часовой пояс Зулу)
  • Часовой пояс Зулу (Z)

Написание и организация тестов | Документация Cypress

Передовой опыт

Мы выступили на конференции «Передовой опыт» в AssertJS (февраль 2018 г. ). Этот видео демонстрирует, как подойти к разбивке вашего приложения и организации ваши тесты.

AssertJS — Cypress Best Practices

Структура папок

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

  • JavaScript
  • TypeScript
 E2E: 
/cypress.config.js
/cypress/fixtures/example.json
/cypress/support/commands.js
/cypress / поддержка / e2e .js

Компонент:
/cypress.config.js
/cypress/fixtures/example.json
/cypress/support/commands.js
/cypress/support/component.js
/cypress/support/component-index.html

Оба:
/cypress.config.js
/cypress/fixtures/example.json
/cypress/support/commands.js
/cypress/support/e2e.js
/cypress/support/component. js
/cypress/support/component-index.html

Настройка структуры папок

Хотя Cypress позволяет вам настроить, где ваши тесты, фикстуры и поддержка расположены файлы, если вы начинаете свой первый проект, мы рекомендуем вам использовать вышеуказанную структуру.

Вы можете изменить конфигурацию папки в файле конфигурации. См. Конфигурация Cypress для большего деталь.

Файлы спецификаций​

Тестовые файлы по умолчанию расположены в папке cypress/e2e , но могут быть настроен на другой каталог. Тестовые файлы могут быть записаны как:

  • .js
  • .jsx
  • .ts
  • .tsx 90 012
  • .кофе
  • .cjsx

Cypress также поддерживает ES2015 из коробки. Вы можете использовать либо Модули ES2015 или Модули CommonJS . Это означает, что вы можете импортировать или требовать оба пакета npm и локальных относительных модулей .

Чтобы увидеть пример каждой команды, используемой в Cypress, откройте 2-расширенные примеры папка в папке cypress/e2e .

Fixture Files​

Fixture Files используются как внешние фрагменты статических данных, которые могут использоваться вашим тесты. Файлы фикстуры расположены в кипарис/светильники по умолчанию, но может быть настроен на другой каталог.

Обычно вы используете их с cy.fixture() команду и чаще всего, когда вы забиваете Сетевые запросы.

Файлы активов

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

Вы можете добавить эти папки в свой файл .gitignore , чтобы игнорировать проверка этих файлов в системе контроля версий.

Загрузка файлов

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

 /cypress 
/downloads
- records.csv
Файлы снимков экрана

Если снимки экрана были сделаны с помощью cy.screenshot() команда или автоматически, когда тест не пройден, снимки экрана сохраняются в скрины Папка в которой установлено до кипарис/скриншоты по умолчанию.

 /cypress 
/screenshots
/app.cy.js
— переход в главное меню (сбои).png

Дополнительные сведения о доступных снимках экрана и настройках см. Скриншоты и видео

Видеофайлы​

видеоПапка , для которой установлено значение кипарис/видео по умолчанию.

 /cypress 
/videos
- app.cy.js.mp4
Пути к файлам активов

Сгенерированные скриншоты и видео сохраняются в соответствующих папках ( кипарис/скриншоты , кипарис/видео ). Пути сгенерированных файлов будут быть лишенным любых общих путей предков, общих для всех файлов спецификаций, найденных параметр specPattern (или с помощью параметра командной строки --spec или spec опция API модуля, если указана)

Пример 1:

  • Файл спецификации найден
    • cypress/e2e/path/to/file/one. cy.js
  • Общие пути предков (рассчитываются во время выполнения)
    • cypress/e2e/path/to/file
    90 013
  • Сгенерированный файл скриншота
    • cypress/screenshots/one.cy.js/your-screenshot.png
  • Сгенерированный видеофайл
    • cypress/videos/one.cy.js.mp4

Пример 2:

  • Спецфайлы найдены
    • cypress/e2e/path/to/file/one.cy.js
    • cypress/e2e/path/to/two.cy.js
  • Пути общих предков (рассчитаны в время выполнения)
    • cypress/e2e/path/to/
  • Сгенерированные файлы снимков экрана /скриншоты/two.cy.js /your-screenshot.png
  • Сгенерированные видеофайлы
    • cypress/videos/file/one.cy.js.mp4
    • cypress/videos/two.cy.js.mp4
  • Assets in Cypress Cloud​ 91 514

    Вместо того, чтобы самостоятельно управлять активами, ты можешь сохраните их в облаке с помощью Cypress Cloud. Скриншоты и видео хранятся постоянно, прикрепленные к соответствующему тесту. результаты, и легко делиться или просматривать через наш веб-интерфейс.

    Дополнительные сведения о видео и доступных настройках см. Скриншоты и видео

    Файл плагинов

    Внимание

    Устарело

    Настройка плагинов через cypress/plugins/index.js больше не поддерживается Кипарис версии 10.0.0.

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

    Файл плагинов — это специальный файл, который выполняется в узле перед запуском проекта. загружается перед запуском браузера и во время выполнения теста. В то время Тесты Cypress выполняются в браузере, файл плагинов работает в фоновом режиме. Node, дающий вашим тестам возможность доступа к файловой системе и остальную часть операционной системы, вызвав cy.task() команда.

    Файл плагинов — это хорошее место, чтобы определить, как вы хотите связать файлы спецификаций. через препроцессоры, как найти и запустить браузеры через API запуска браузера, и другие классные вещи. Прочтите наше руководство по плагинам для больше подробностей и примеров.

    Первоначальный импортированный файл плагинов может быть настроен на другой файл.

    Файл поддержки​

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

    Компонент:

    • кипарис/поддержка/компонент.js
    • кипарис/поддержка/компонент.jsx
    • кипарис/поддержка/компонент.тс
    • кипарис/поддержка/компонент.тсх

    E2E:

    • кипарис/поддержка/e2e.js
    • кипарис/поддержка/e2e. jsx 90 013
    • кипарис/поддержка/e2e.ts
    • кипарис/поддержка/e2e .tsx
    опасность

      Для данного типа тестирования сопоставление файлов supportFile приведет к ошибке при загрузке Cypress.

    Cypress автоматически создает пример файла поддержки для каждого настроенного тип тестирования, который имеет несколько закомментированных примеров.

    Этот файл запускает до каждого отдельного файла спецификации. Мы делаем это исключительно как удобный механизм, поэтому вам не нужно импортировать этот файл.

    По умолчанию Cypress автоматически включает файлы поддержки определенного типа. Для E2E, по умолчанию cypress/support/e2e.{js,jsx,ts,tsx} и для компонента Тестирование кипарис/поддержка/компонент.{js,jsx,ts,tsx} .

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

    Первоначальный импортированный файл поддержки можно преобразовать в другой файл или превратить полностью отключить с помощью supportФайл конфигурации. Из вашего файла поддержки вы можете импортировать или требуется других файлов для хранения вещей организованный.

    Вы можете определить поведение в до или до каждого в любой из cypress/support files:

     beforeEach(() => { 
    cy.log('Я запускаю перед каждым тестом в каждом файле спецификаций!!!!!!')
    })
    Выполнение​

    Cypress выполняет файл поддержки перед файлом спецификаций. Например, когда Cypress выполняет файл спецификации через cypress open или cypress run , выполняется файлы в следующем порядке:

    пример e2e:

    1. support/e2e.js (ваш файл поддержки)
    2. e2e/spec-a.cy.js (ваш файл спецификации )

    Пример компонента :

    1. support/component. js (ваш файл поддержки)
    2. components/Button/Button.cy.js (ваш файл спецификации)

    Устранение неполадок ing​

    Если Cypress не находит файлы спецификаций по какой-то причине, вы можете устранить неполадки свою логику, открыв или запустив Cypress с помощью журналы отладки включены:

     DEBUG=cypress:server:specs npx cypress open 
    ## или
    DEBUG=cypress:server:specs npx cypress run

    Написание тестов

    Cypress построен на основе Mocha и Чай. Мы поддерживаем обоих Чай Стили утверждений BDD и TDD . Тесты, которые вы пишете на Cypress, в основном будут придерживаться этому стилю.

    Если вы знакомы с написанием тестов на JavaScript, то написание тестов на Кипарис будет легким.

    Тестовая конструкция​

    Тестовый интерфейс, позаимствованный у Мокко, предоставляет description() , context() , it() и spec() .

    context() идентично описать() и указать() идентично it() , так что выбирайте любую терминологию, которая лучше всего подходит для вас.

     // -- Начало: Код нашего приложения -- 
    function add(a, b) {
    return a + b
    }

    function subtract(a, b) {
    return a - b
    }

    функция разделить (a, b) {
    вернуть a / b
    }

    функция умножить (a, b) {
    вернуть a * b
    }
    // -- End: Код нашего приложения --

    // -- Начало: Наши тесты Cypress --
    description('Модульное тестирование наших математических функций', () => {
    context('math', () => {
    it('может складывать числа', () => {
    expect(add(1, 2)).to.eq(3)
    })

    it('может вычитать числа', () => {
    expect(subtract(5, 12)).to .eq(-7)
    })

    указать('может делить числа', () => {
    ожидать(разделить(27, 9)).to.eq(3)
    })

    указать('может умножать числа', () => {
    expect(multiply(5, 4)). to.eq(20)
    })
    })
    })
    // -- Конец: Наши тесты Cypress --

    Крючки

    Cypress также предоставляет хуки ( заимствовано из Мокко).

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

     before(() => { 
    // ловушка корневого уровня
    // выполняется один раз перед всеми тестами
    })

    beforeEach(() => {
    // ловушка корневого уровня
    // выполняется перед каждым тестовым блоком
    })

    afterEach(() => {
    // выполняется после каждого тестового блока
    })

    after(() => {
    // выполняется после завершения всех тестов
    })

    description('Hooks ', () => {
    before(() => {
    // выполняется один раз перед всеми тестами в блоке
    })

    beforeEach(() => {
    // выполняется перед каждым тестом в блоке
    })

    afterEach(() => {
    // выполняется после каждого теста в блоке
    })

    after(() => {
    // выполняется один раз после все тесты в блоке
    })
    })

    Порядок выполнения ловушек и тестов следующий:
    крючки run
  • Tests run
  • Any afterEach() hooks run
  • Все after() хуки запускаются (один раз)
  • опасность

    🚨 Прежде чем писать after() или afterEach() хуков, пожалуйста, ознакомьтесь с нашим мысли об антипаттерне очистки состояния с помощью after() или afterEach() .

    Исключение и включение тестов

    Чтобы запустить указанный набор или тест, добавьте .только к функции. Все вложенные люксы также будут выполнены. Это дает нам возможность запускать один тест за раз. время и является рекомендуемым способом написания набора тестов.

     // -- Начало: код нашего приложения -- 
    function fizzbuzz(num) {
    if (num % 3 === 0 && num % 5 === 0) {
    return 'fizzbuzz'
    }

    if ( num % 3 === 0) {
    return 'fizz'
    }

    if (num % 5 === 0) {
    return 'buzz'
    }
    }
    // -- End: Код нашего приложения --

    // -- Начало: Наши тесты Cypress --
    description('Unit Test FizzBuzz', () => {
    function numsExpectedToEq(arr,ожидаемый) {
    //проходим по массиву чисел и делаем
    // уверены, что они равны ожидаемому " когда число кратно 3', () => {
    numsExpectedToEq([9, 12, 18], 'шипение')
    })

    it('возвращает "жужжание", когда число кратно 5', ( ) => {
    numsExpectedToEq([10, 20, 25], 'buzz')
    })

    it('возвращает "fizzbuzz", когда число кратно 3 и 5', () => {
    numsExpectedToEq( [15, 30, 60], «шипение»)
    })
    })

    Чтобы пропустить указанный набор или тест, добавьте к функции . skip() . Все вложенные наборы также будут пропущены.

     it.skip('возвращает "шипение", если число кратно 3', () => { 
    numsExpectedToEq([9, 12, 18], 'шипение')
    })

    Тестовая изоляция​

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

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

    Мы делаем это, очищая состояние теста и контекст браузера перед каждым тестом чтобы гарантировать, что работа одного теста не повлияет на другой тест позже. Целью каждого теста должно быть надежное прохождение независимо от того, выполняется ли он изолированно. или последовательно с другими тестами. Наличие тестов, зависящих от состояния более ранний тест потенциально может привести к недетерминированным сбоям теста, что делает отладка сложная.

    Поведение запуска тестов в чистом контексте браузера описывается как тестИзоляция .

    Тестовая изоляция является глобальной конфигурацией и может быть сквозное тестирование на уровне описания с вариант testIsolation .

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

    Тестовая конфигурация​

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

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

    Синтаксис
     Опишите (имя, конфигурация, FN) 
    Контекст (имя, конфигурация, FN)
    ИТ (имя, конфигурация, FN)
    Укажите (имя, конфигурация, FN)
    . Допустимые значения
    предостережение

    Примечание: Некоторые значения конфигурации доступны только для чтения и не могут быть изменены с помощью теста конфигурация. Обязательно ознакомьтесь со списком параметры тестовой конфигурации.

    Конфигурация пакета

    Если вы хотите, чтобы набор тестов выполнялся или исключался при выполнении в конкретного браузера, вы можете переопределить конфигурацию браузера в пределах набора конфигурация. Параметр браузера принимает те же аргументы, что и Cypress.isБраузер().

    Следующий набор тестов будет пропущен при выполнении тестов в Chrome браузеры.

     описать('Когда НЕ в Chrome', { браузер: '!chrome' }, () => { 
    it('Показывает предупреждение', () => {
    cy.get('[data-testid="browser-warning"]').should(
    'содержать',
    'Для оптимального просмотра используйте браузер Chrome'
    )
    })

    it('Ссылки на совместимость браузера doc', () => {
    cy.get('a.browser-compat')
    .should('have.attr', 'href')
    .and('include', 'browser-compatibility')
    })
    })

    Следующий набор тестов будет выполняться только при запуске в Firefox браузер. Он перезапишет разрешение области просмотра в одном из тестов и объединить любые текущие переменные среды с предоставленными.

     описать( 
    'Когда в Firefox',
    {
    браузер: 'firefox',
    viewportWidth: 1024,
    viewportHeight: 700,
    env: {
    DEMO: true,
    API: 'http://localhost:90 00 ',
    },
    },
    () => {
    it('Устанавливает ожидаемую область просмотра и URL-адрес API', () => {
    expect(cy.config('viewportWidth')).to.equal(1024 )
    ожидаем(cy.config('viewportHeight')).to.equal(700)
    ожидаем(cy.env('API')).to.equal('http://localhost:9000')
    })

    it(
    'Использует ближайшую переменную среды API',
    {
    env: {
    API: 'http://localhost:3003',
    },
    },
    () => {
    expect(cy.env('API')).to.equal('http ://localhost:3003')
    // остальные переменные окружения остаются без изменений

    Вы можете настроить количество повторных попыток во время cypress run или кипарис открытый . Дополнительные сведения см. в разделе «Повторные попытки тестирования». информация.

     it('следует перенаправить неаутентифицированного пользователя на страницу входа', { 
    повторных попыток: {
    runMode: 3,
    openMode: 2
    }
    } () => {
    // тестовый код...
    })
    })

    Динамическое создание тестов

    Вы можете динамически создавать тесты с помощью JavaScript.

     описать('если ваше приложение использует jQuery', () => { 
    ;['mouseover', 'mouseout', 'mouseenter', 'mouseleave'].forEach((event) => {
    it('triggers event: ' + event, () => {
    // если ваше приложение использует jQuery, мы можем запустить jQuery
    // событие, вызывающее срабатывание обратного вызова события
    cy.get('#with-jquery')
    .invoke('trigger', event)
    .get('[data-testid="messages"]')
    .should('contain', 'событие' + событие + 'было запущено')
    })
    })
    })

    Приведенный выше код создаст набор из 4 тестов:

     > если ваше приложение использует jQuery 
    > запускает событие: «mouseover»
    > запускает событие: «mouseout»
    > запускает событие: «mouseenter»
    > запускает событие: «mouseleave»

    Стили утверждений

    Cypress поддерживает как BDD ( ожидать / следует ), так и TDD ( утверждать ) простой стиль утверждения. Узнайте больше о простых утверждениях.

     it('может складывать числа', () => { 
    expect(add(1, 2)).to.eq(3)
    })

    it('может вычитать числа', () => {
    assert.equal(subtract(5, 12), -7, 'эти числа равны')
    })

    Команда .should() и ее псевдоним .and() также можно использовать для упрощения цепочки утверждений. команд Cypress. Подробнее об утверждениях.

     cy.wrap(add(1, 2)).should('equal', 3) 

    Выполнение тестов

    Вы можете запустить тест, щелкнув имя файла спецификации. Например Приложение Cypress RealWorld имеет несколько тестовых файлов, но ниже мы запускаем тест «new-transaction.spec.ts». файл, нажав на него.

    После завершения спецификации Cypress каждый тест имеет один из четырех статусов: пройдено , не пройдено , ожидает или пропущено . Поведение этих статусы наследуются от Mocha, так как это тестовый бегун от Кипарис.

    Пройдено​

    Пройденные тесты успешно выполнили все свои хуки и команды без провал каких-либо утверждений. На приведенном ниже снимке экрана показан пройденный тест:

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

    Failed​

    Хорошие новости – неудачный хук или тест выявил проблему. Могло быть намного хуже - это может быть пользователь, который столкнулся с этой ошибкой!

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

    Pending​

    Вы можете написать тесты placeholder несколькими способами, как показано ниже, и Cypress знает, что НЕ запускать их. Кроме того, вы можете условно указать, какой браузер(ы) и тесты должны выполняться, в том числе если тест не должен выполняться для браузер в настоящее время тестируется, он помечен как ожидающий .

    Cypress оценивает все приведенные ниже тесты как в ожидании .

     description('TodoMVC', () => { 
    it('еще не написано')

    it. skip('добавляет 2 задачи', function () {
    cy.visit('/')
    cy. get('[data-testid="new-todo"]').as('new').type('изучить тестирование{enter}')

    cy.get('@new').type('be cool{enter}')

    cy.get('[data-testid="todo-list"] li').should('have.length', 100)
    })

    xit('другой тест', () => {
    expect(false).to.true
    })

    it('только тест хром', { браузер: 'хром' }, () => {
    cy.visit('/')
    cy.contains('To Do')
    })
    })

    Все четыре вышеприведенных теста помечены как ожидающие , когда Cypress завершит выполнение спецификации файл.

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

    Пропущено

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

     ///  

    description('TodoMVC', () => {
    beforeEach(() => {
    cy.visit('/')
    })

    it( 'изначально скрывает нижний колонтитул', () => {
    cy.get('[data-testid="filters"]').should('not.exist')
    })

    it('добавляет 2 задачи', () => {
    cy.get('[data-testid="new-todo"]').as('new').type('изучить тестирование{enter}')

    cy.get('@ новый').type('будь крутым{enter}')

    cy.get('[data-testid="todo-list"] li').should('have.length', 2)
    })
    })

    Если хук beforeEach завершается и оба теста заканчиваются, два теста проходят.

    Но что произойдет, если команда внутри хука beforeEach завершится ошибкой? Например, давайте представим, что мы хотим посетить несуществующую страницу /does-not-exist вместо /. Если мы изменим наш beforeEach на fail:

     beforeEach(() => { 
    cy.visit('/does-not-exist')
    })

    Когда Cypress начинает выполнение первого теста, хук beforeEach дает сбой. Сейчас первый тест помечен как неудачный . НО, если хук перед каждым хуком не удался один раз, зачем нам выполнять его еще раз перед вторым тестом? Это просто провал так же! Итак, Cypress пропускает оставшиеся тесты в этом блоке, потому что они также потерпит неудачу из-за отказа хука beforeEach .

    Если мы свернем тестовые команды, мы увидим пустое поле, обозначающее пропущенные тест «добавляет 2 задачи».

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

    Совет: прочтите сообщение в блоге Написание прогресса теста научиться использовать ожидающие тесты для отслеживания стратегии тестирования выполнение.

    Просмотр тестов​

    Cypress следит за файловой системой за изменениями в ваших файлах спецификаций. Вскоре после добавления или обновление теста Cypress перезагрузит его и запустит все тесты в этой спецификации файл.

    Это делает разработку более продуктивной, поскольку вы можете добавлять и редактировать тесты по мере реализации функции, и пользовательский интерфейс Cypress будет всегда отражать результаты ваших последних правок.

    Что просматривается?​

    Файлы​
    • Конфигурация Cypress
    • cypress.env.json
    Папки​
    • Каталог E2E ( cypress/e2e/ по умолчанию)
    • Каталог поддержки ( кипарис/поддержка/ по умолчанию)

    папка, файлы в папке и все дочерние папки и их файлы (рекурсивно) просматриваются.

    Что не просматривается?​

    Все остальное; это включает, но не ограничивается следующим:

    • Код вашего приложения
    • node_modules
    • cypress/fixtures/

    вероятно, получил поддержку какой-либо формы горячей замены модуля, которая отвечает за для просмотра кода вашего приложения — HTML, CSS, JS и т.