Cypress отлично подходит для внешнего тестирования, но он также может эффективно тестировать ваши API.
Cypress — популярная среда тестирования, предназначенная для приложений JavaScript. Хотя он в первую очередь предназначен для тестирования компонентов пользовательского интерфейса и взаимодействия с элементами пользовательского интерфейса в браузере, он также хорошо подходит для тестирования API. Вы можете использовать эту платформу для тестирования API RESTful через HTTP-запросы и проверки ответы.
Cypress позволяет вам писать комплексные тесты, охватывающие весь спектр рабочего процесса вашего веб-приложения.
Начало работы с тестированием API с использованием Cypress
Cypress поможет вам убедиться, что ваши API работают так, как вы ожидаете. Этот процесс обычно включает в себя тестирование конечных точек API, входных данных и ответов HTTP. Вы можете проверить интеграцию с любыми внешними службами и убедиться, что механизмы обработки ошибок работают правильно.
Тестирование ваших API гарантирует, что они функциональны, надежны и соответствуют потребностям приложений, которые от них зависят. Это помогает выявлять и исправлять ошибки на ранних стадиях, предотвращая возникновение проблем в рабочей среде.
Кипарис — отличный инструмент для тестирования пользовательского интерфейса, используемый некоторыми популярные фреймворки JavaScript. Его способность создавать и тестировать HTTP-запросы делает его одинаково эффективным при тестировании API.
Он делает это, используя Node.js в качестве механизма для выполнения HTTP-запросов и обработки их ответов.
Вы можете найти код этого проекта в его GitHub хранилище.
Создайте REST API Express.js.
Для начала, создать веб-сервер Expressи установите этот пакет в свой проект:
npm install cors
Затем добавьте пакет Cypress в свой проект:
npm install cypress --save-dev
Наконец, обновите свой пакет.json файл, чтобы включить этот тестовый скрипт:
"test": "npx cypress open"
Определите контроллеры API
В реальном случае вы будете выполнять вызовы API для чтения и записи данных из базы данных или внешнего API. Однако в этом примере вы будете моделировать и тестировать такие вызовы API, добавляя и извлекая пользовательские данные из массива.
В корневом каталоге папки вашего проекта создайте файл контроллеры/userControllers.js файл и добавьте следующий код.
Сначала определите РегистрацияПользователя функция контроллера, которая будет управлять маршрутом регистрации пользователя. Он извлечет данные пользователя из тела запроса, создаст новый объект пользователя и добавит его в пользователи множество. Если процесс успешен, он должен ответить кодом состояния 201 и сообщением, указывающим, что пользователь зарегистрирован.
const users = [];
exports.registerUser = async (req, res) => {
const { username, password } = req.body;
try {
const newUser = { username, password };
users.push(newUser);
res.status(201).send({ message: 'User registered successfully' });
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Добавьте вторую функцию —getUsers— для получения пользовательских данных из массива и возврата их в виде ответа JSON.
exports.getUsers = async (req, res) => {
try {
res.json(users);
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Наконец, вы также можете имитировать попытки входа в систему. В том же файле добавьте этот код, чтобы проверить, соответствуют ли заданные имя пользователя и пароль каким-либо пользовательским данным в пользователи множество:
exports.loginUser = async (req, res) => {
const { username, password } = req.body;try {
const user = users.find((u) =>
u.username username && u.password password);
if (user) {
res.status(200).send({ message: 'Login successful' });
} else {
res.status(401).send({ message: 'Invalid credentials' });
}
} catch (error) {
console.error(error);
res.status(500).send({ message: 'An error occurred!!' });
}
};
Определите маршруты API
Чтобы определить маршруты для вашего Express REST API, создайте новый маршруты/userRoutes.js файл в корневом каталоге и добавьте в него этот код:
const express = require('express');
const router = express.Router();
const userControllers = require('../controllers/userControllers');const baseURL = '/v1/api/';
router.post(baseURL + 'register', userControllers.registerUser);
router.get(baseURL + 'users', userControllers.getUsers);
router.post(baseURL + 'login', userControllers.loginUser);
module.exports = router;
Обновите файл Server.js.
Обновите сервер.js файл для настройки API следующим образом:
const express = require('express');
const cors = require('cors');
const app = express();
const port = 5000;app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());const userRoutes = require('./routes/userRoutes');
app.use('/', userRoutes);app.listen(port, () => {
console.log(`Server is listening at http://localhost:${port}`);
});
module.exports = app;
Настройка тестовой среды
Имея демонстрационный API, вы готовы настроить среду тестирования. Запустите сервер разработки с помощью этой команды терминала:
node server.js
Затем запустите команду тестового сценария в отдельном терминале:
npm run test
Эта команда запустит настольный клиент Cypress, который предоставляет среду тестирования. Когда оно откроется, нажмите кнопку E2E-тестирование кнопка. Сквозные тесты гарантируют, что вы протестируете Express API в целом, а это означает, что Cypress будет иметь доступ к веб-серверу, маршрутам и связанным функциям контроллера.
Далее нажмите Продолжать для добавления файлов конфигурации Cypress.
После завершения процесса установки вы должны увидеть новую папку Cypress в своем проекте. Cypress также добавит кипарис.config.js файл, содержащий настройки конфигурации для ваших тестов.
Обновите этот файл, включив в него базовый URL-адрес вашего сервера следующим образом:
const { defineConfig } = require("cypress");
module.exports = defineConfig({
chromeWebSecurity: false,
e2e: {
baseUrl: 'http://localhost: 5000',
setupNodeEvents(on, config) {
},
},
});
Напишите тестовые примеры
Теперь вы готовы написать несколько тестовых примеров. Сначала выберите браузер, в котором Cypress запустится для запуска тестов, из опций, доступных в клиенте Cypress.
Далее нажмите кнопку Создать новую спецификацию кнопку, чтобы создать тестовый файл, и укажите имя. Затем нажмите Создать спецификацию.
Теперь откройте кипарис/светильники/example.json файл и обновите его содержимое, указав следующие учетные данные пользователя. Фикстуры — это файлы, содержащие статические тестовые данные, которые можно использовать в тестовых случаях.
{
"username": "testuser",
"password": "password123"
}
Кипарис обеспечивает cy.request метод для отправки HTTP-запросов на веб-сервер. Вы можете использовать его для тестирования различных типов конечных точек HTTP, которые управляют различными операциями, включая GET, POST, PUT и DELETE.
Чтобы протестировать три маршрута API, которые вы определили ранее, начните с описания тестового примера для конечной точки регистра. Этот тестовый пример должен проверить правильность работы конечной точки путем успешной регистрации нового пользователя и проверки утверждений.
Открой кипарис/e2e/user.routes.spec.cy.js файл и обновите его содержимое с помощью следующего кода.
describe('User Routes', () => {
it('registers a new user', () => {
cy.fixture('example').then((testUser) => {
cy.request({
method: 'POST',
url: `${baseUrl}/v1/api/register`,
body: testUser,
}).then((response) => {
expect(response.status).to.eq(201);
expect(response.body.message).to.eq('User registered successfully');
});
});
});
В этом тесте Cypress загрузит тестовые данные в файл фикстуры и выполнит POST-запросы к указанной конечной точке с данными в теле запроса. Если все утверждения пройдены, тестовый пример будет пройден. В противном случае это потерпит неудачу.
Стоит отметить, что синтаксис тестов Cypress очень похож на синтаксис, используемый в тестах Mocha, который принял Cypress.
Теперь опишите тест на пользователи маршрут. Тест должен убедиться, что ответ содержит пользовательские данные при отправке запросов к этой конечной точке. Для этого добавьте следующий код в файл описывать тестовый блок.
it('gets users data and the username matches test data', () => {
cy.fixture('example').then((expectedUserData) => {
cy.request({
method: 'GET',
url: `${baseUrl}/v1/api/users`,
}).then((response) => {
expect(response.status).to.eq(200);
const username = response.body[0].username;
expect(username).to.eq(expectedUserData.username);
});
});
});
Наконец, включите тестовый пример, который будет проверять конечную точку входа и утверждать, что статус ответа равен 200, что указывает на успешную попытку входа.
it('logs in a user', () => {
cy.fixture('example').then((loginData) => {
cy.request({
method: 'POST',
url: `${baseUrl}/v1/api/login`,
body: loginData,
}).then((response) => {
expect(response.status).to.eq(200);
});
});
});
});
Чтобы запустить тесты, вернитесь в версию браузера, управляемую Cypress, и выберите конкретный тестовый файл, который вы хотите запустить.
Средство запуска тестов Cypress запускает тесты и записывает их результаты, показывая статус прохождения или неудачи каждого тестового примера.
Приведенные выше примеры иллюстрируют, как можно протестировать различные маршруты и соответствующие им функции контроллера, чтобы убедиться в их функциональности и ожидаемом поведении. Хотя тестирование функциональности API крайне важно, не следует ограничивать объем тестирования исключительно этим аспектом.
Комплексная стратегия тестирования API должна также включать тесты производительности, нагрузки и интеграции с другими сервисами. Включив различные методы тестирования В своей стратегии вы можете добиться тщательного тестового покрытия и убедиться, что ваши API-интерфейсы функциональны и надежны, прежде чем развертывать свой код в рабочей среде.
Тестирование всего вашего веб-интерфейса с помощью Cypress
Cypress — фантастический инструмент для тестирования веб-приложений, легко охватывающий тесты как для внешнего, так и для внутреннего интерфейса.
Благодаря удобным функциям тестирования вы можете легко и быстро настроить среду тестирования на одной платформе. Затем вы можете использовать его для тщательного тестирования различных аспектов вашего приложения и обеспечения первоклассной производительности.