Всем привет!
Я всегда скептически смотрел на фреймворки автоматизации тестирования с двойной целью — покрытие тестированием UI и API. Обычно вы запускаете разные уровни тестов в разных тестовых запусках (или проектах событий), поскольку каждый из них, вероятно, имеет свои собственные
Недавно я взглянул на то, что Playwright может предложить с точки зрения тестирования API , и сравнил это со своим опытом работы с Cypress , так что вот чем я хочу поделиться со всеми вами…
Cypress некоторое время назад сделал возможным тестирование API . На учебном портале вы можете найти статью о том, насколько хорош этот инструмент с точки зрения тестирования API , с примерами.
Чтобы запускать тесты, вам необходимо установить зависимости проекта, верно? Что ж, Cypress поставляется с электронным браузером , и его установка может быть весьма избыточной (и трудоемкой), если вы хотите запускать исключительно тесты API (скажем, у вас есть отдельные задания в CI для запуска тестов пользовательского интерфейса и API, как это обычно бывает).
Выглядит не очень хорошо, да? ☝️
Кроме того, когда вы запускаете тесты API - он все равно запускает браузер.
Простой тест API с Cypress будет выглядеть так:
it('Sign in with valid credentials', () => { cy.request('POST', '/auth', { login: Cypress.env('username'), password: Cypress.env('password'), }).should(response => { expect(response.body.token).to.be.a('string') expect(response.status).to.eq(200) }) })
Выглядит довольно просто и понятно, да? Здесь важно сказать, что это общий синтаксис Cypress , то есть связывание элементов в цепочку вместо записи каждого вывода в переменную (хотя это возможно с некоторыми изменениями ).
Как и Cypress , Playwright представляет собой среду автоматизации тестирования — вы можете использовать только инструмент автоматизации браузера или всю платформу (средство запуска тестов, библиотеку утверждений, инструмент автоматизации браузера, HTTP-клиент, репортер и т. д.).
Разница здесь в том, что Playwright не поставляется с браузерами из коробки — их нужно установить отдельной командой (если вы этого хотите).
Здесь это имеет огромное значение, поскольку с точки зрения запуска исключительно тестов API он не будет запускать какой-либо браузер или любое другое настольное приложение и сэкономит некоторое время выполнения и ресурсы на вашем компьютере.
Простой тест API с Playwright будет выглядеть так:
import {test, expect} from '@playwright/test' test('Sign in with valid credentials', async ({request}) => { const response = await request.post('/auth', { data: { login: process.env.USERNAME, password: process.env.PASSWORD, }, }) expect(response.status()).toEqual(200) expect(await response.json()).toEqual({ token: expect.any(String), }) })
Я хотел бы выделить Jest-подобный синтаксис утверждения объектов:
expect(await response.json()).toEqual({ token: expect.any(String), })
Этот синтаксис позволяет вам проверить всю структуру объекта с помощью всего лишь одного expect
вызова ☝️
Тесты API должны быть небольшими и легкими, поскольку для их запуска не требуется слишком много усилий.
Подведем итоги вышеизложенному…
✅ Драматург выигрывает благодаря более быстрой чистой установке из коробки в 13 раз .
ℹ️ Вы можете сократить время установки Cypress в CI , если используете образ с предустановленными зависимостями или кешируете их в своем CI- хранилище .
✅ Playwright выигрывает, поскольку ему не требуется браузер для запуска тестов API, поэтому он сразу переходит к делу.
ℹ️ Невозможно «не запускать» браузер в тестах API, так как это часть логики фреймворка.
Здесь невозможно определить победителя, так как объективного преимущества ни у Сайпресса , ни у Драматурга нет.
У них обоих довольно простой синтаксис с небольшими различиями. Я бы сказал, что это решение тестировщика — выбрать то, что ему здесь нравится.
Я могу с уверенностью сказать, что использовать Playwright для автоматизации тестирования API достаточно безопасно из-за его производительности. Было бы разумным решением, если бы у вас уже были тесты пользовательского интерфейса с этой платформой.
Мой совет тем, кто использует Cypress для UI- тестов и хочет охватить слой API — лучше используйте что-нибудь другое ( Jest + Axios , пример можно посмотреть там ).