Перед запуском Jest проверит, установлен ли Babel, и, если он установлен, получит файл .babelrc, преобразует код с помощью Babel и запустит преобразованный код.
3. конфигурация шутки по умолчанию
npx jest --init
шуточный режим
jest --watchAll: Когда изменения в тестовом файле будут найдены, снова запустите все тестовые файлы.
jest --watch: требует иgitПри использовании в комбинации будет сравниваться разница между существующим файлом и зафиксированным файлом, и будет тестироваться только файл разницы.
2. Сопоставитель шуток
Общие сопоставители
toBe
toEqual: суждениеобъектСодержимое равно
toMatchObject: expect(obj).toMatchObject(o), ожидать, что o будет содержать obj
toBeNull
toBeUndefined
toBeDefinded
toBeTruthy
toBeFalsy
not: для отрицания, например .not.toBeTruthy()
Связанный номер
toBeGreaterThan (больше) / toBeGreaterThanOrEqual (больше или равно)
toBeCloseTo: используется для сравнения чисел с плавающей запятой, утверждение выполняется, когда они примерно равны.
toBeLessThan / toBeLessThanOrEqual
Связанные строки
toMatch: Параметру может быть передана строка или обычный
Вот маленькая хитрость: когда мы хотимИгнорировать другие тестовые наборы в одном файле и ориентироваться только на один тестовый наборПри отладке можно добавить.only
it.only('test', () => {
// ...
})
но это не игнорирует тестовые случаи из других тестовых файлов
import axios from 'axios'
export function getData1() {
return axios.get('http://www.dell-lee.com/react/api/demo.json')
}
export function getData2(fn) {
axios.get('http://www.dell-lee.com/react/api/demo.json').then(res => {
fn(res)
})
}
export function get404() {
return axios.get('http://www.dell-lee.com/react/api/404.json')
}
Для асинхронного тестирования кода важно время,Мы должны убедиться, что наш тестовый пример завершается после завершения асинхронного кода.. Есть несколько способов:
done, который контролирует время окончания тестового примера
Если возвращаемое значение выполнения функции является обещанием, верните обещание
Сосредоточьтесь на последнем тестовом примере выше. Предположим, что теперь у нас есть интерфейс, который возвращает 404. Нам нужно протестировать этот интерфейс и ожидать, что он вернет 404.
Ловим уловом и судим по уловке.
Однако если интерфейс вернет 200 вместо 404, перехват не будет выполнен, ожидание не будет выполнено, а тест все равно будет пройден. Это не то, что мы ожидали! Итак, нам нужно добавитьexpect.assertions(1)Сделайте утверждение:Следующее обязательно выполнит ожидание
Конечно, вы также можете использовать асинхронный метод ожидания для тестирования интерфейса 404.
BEFORELL: перед использованием случаев начните выполнять
beforeEach: перед выполнением каждого варианта использования
afterEach
afterAll
describe
Первые четыре хука очень просты в использовании и называются следующим образом:
beforeAll(() => {
// ...
})
Если какая-либо обработка должна быть выполнена до и после теста,Насколько возможно прописать в этих хуках функции, он может гарантировать определенный порядок выполнения.
описать можно использовать для группировки вариантов использования, чтобы сделать результаты нашего теста лучше и иерархичнее.
В то же время в каждом из описаний есть четыре функции-ловушки, описанные выше.Давайте посмотрим на конкретную ситуацию:
Порядок выполнения вышеприведенной функции ловушки таков:
1 > 5 > 2 > 6 > 3 > 7 > 4 > 8 Внешняя функция ловушки также влияет на вариант использования внутри описания, и порядок выполнения следующий:Сначала внешний, потом внутренний
5. Насмешка в шутку
1. Моделирование асинхронных методов в Jest
Как упоминалось ранее, асинхронный код можно тестировать, а для некоторых интерфейсов можно выполнять тестирование запросов. Но если каждый интерфейс действительно инициирует запрос, этот тест займет много времени.
В это время мы можемфиктивный метод запроса,Действуйте следующим образом:
Наш метод запроса экспортируется в mock.js
import axios from 'axios'
export function getData() {
return axios.get('http://www.dell-lee.com/react/api/demo.json')
}
Создайте mock.js в том же каталоге, что и mock.js.mocksПапка, создайте файл с соответствующим именем файла в папке, этот файл является методом экспорта является методом имитации запросаЗдесь мы возвращаем обещание напрямую и разрешаем поддельные данные.
export function getData() {
return Promise.resolve({
success: true
})
}
Часть тестового примера:
Вот заметкаяма:jest.mock не может быть записан ни в какую функцию ловушки, из-за тайминга выполнения функции-хука, и не работает beforeAll.При выполнении функции-хука был выполнен код, не написанный в функции-хуке, то есть он был импортирован!
В дополнение к вышеописанному способу вы также можете настроить автоматическое открытие макета в jest.config.js, чтобы jest автоматически определял, находится ли текущий файл на том же уровне.mockпапка, есть ли в ней соответствующий файл?
module.exports = {
automock: true
}
Есть два способа насмешки, и есть крайний случай, чтобы избежать насмешки: Мы определяем метод getData, который требует насмешек в mock.js, и еще один распространенный метод, который не требует насмешек.Когда мы импортируем тестовый файл, нам нужно избегать шутокmocksНайдите этот общий метод в /mock.js, куда вам нужно импортировать его с помощью метода, предоставляемого jest:
Мы не всегда можем дождаться таймера, в это время мы используем Jest для управления временем! Действуйте следующим образом:
пройти черезjest.useFakeTimers()использовать шутку"Домашнее"Таймер помещен здесь перед каждым, потому чтоВремя перемотки вперед может вызываться несколько раз, я надеюсь, что в каждом тестовом примере эти часы являются начальным состоянием и не будут влиять друг на друга.
После выполнения функции таймера перемотайте время вперед на 3 секунды.jest.advanceTimersByTime(3000), этот метод можно вызывать любое количество раз, и время перемотки вперед будет наложено.
В это время мы переключились на 3 секунды, и ожидаем, что они также могут подействовать!
Специальное примечание: jest.fn() генерирует функцию, эта функцияМожет вызываться слушателем несколько раз.
1. Начало работы с простыми вариантами использования
Vue предоставляет @vue/test-utils, чтобы помочь нам с модульным тестированием.При создании проекта Vue проверка опции теста автоматически установит его для нас.
Давайте сначала представим два широко используемых метода монтажа:
mount: смонтирует компонент и подкомпоненты, содержащиеся в компоненте.
мелкое монтирование: поверхностное монтирование, монтируются только компоненты, игнорируя подкомпоненты.
мелкое монтирование вернет обертку, эта обертка будет содержать множество методов, которые помогут нам в тестировании,смотрите подробности
2. Снимок теста
Снимок теста означает, что компонент будет сфотографирован как фотография и сохранен. Если при следующем запуске тестового примера компонент изменится и будет отличаться от моментального снимка, будет сообщено об ошибке.
Тестовый случай записывается следующим образом:
Первый тест сохранит снимок враппера, второй сравнит разницу между текущим враппером и снэпшотом
Можно видеть, что на самом деле моментальный снимок сохраняет html-часть после рендеринга компонента, css-часть не сохраняется, и некоторые события, такие как @click, привязанные к элементу, также не сохраняются.
Так что снимки подходят дляТест, чтобы увидеть, изменился ли узел DOM.
Когда снимок изменится, мы можем нажатьuСделать снимок обновления
3. Тестирование покрытия
Тест покрытия — это оценка полноты теста.Чем больше бизнес-кода охватывает тест, тем выше охват.
В jest.config.js мы можем установитьcollectCoverageFrom, для установки файлов, которые необходимо протестировать на покрытие, здесь мы тестируем все.vueфайл, игнорироватьnode_modulesСкачать все файлы.
Обратите внимание, что для настройки jest в Vue см.Документация
Выполнение команды сгенерируетcoverageпапка,Icov-report/index.htmlбудет визуализировать наше тестовое покрытие
4. Протестируйте с помощью Vuex
Если мы вводим состояние Vuex или используем связанные методы в компоненте, в тестовом случае нам нужно только пройти в хранилище vuex при монтировании компонента.
import store from '@/store/index'
const wrapper = mount(HelloWorld, {
store
})
7. Пишите в конце
1. Модульное тестирование или интеграционное тестирование?
просто возьмиshallowMountНапример, этот API очень подходит для юнит-тестирования, модульное тестирование не фокусируется на связи между юнитами, а тестирует каждый юнит отдельно.
Это также делает егоОбъем кода велик, а тестовые комнаты слишком независимы.. При тестировании некоторых библиотек функций, когда каждая функция относительно независима, это очень удобно для модульного тестирования. При тестировании некоторых бизнес-компонентов нужно обращать внимание на связь между компонентами, что больше подходит для интеграционного тестирования.
2. TDD или BDD?
TDD: разработка через тестирование. Сначала напишите тестовые примеры, а затем напишите код в соответствии с вариантами использования, уделяя больше внимания самому коду. следующим образом:
TDD обращает внимание на то, как код реализован внутри, и срабатывает ли событие? Свойство установлено? данные Данные обновляются?
BDD: разработка, основанная на поведении пользователя, сначала напишите бизнес-код, а затем протестируйте с точки зрения пользователя.Функция, не обращайте внимание на процесс реализации кода, простоТестируйте функциональность, имитируя действия пользователя. Например, следующий вариант использования: