Трансакционное тестирование представляет собой метод проверки корректности работы системы в ходе выполнения различных бизнес-операций, которые могут включать несколько шагов или действий, объединённых в одну логическую единицу. В контексте автоматизации тестирования с использованием WebdriverIO, трансакционные тесты фокусируются на проверке всей цепочки действий, от начала до конца, гарантируя, что система правильно обрабатывает все этапы взаимодействия, даже если происходит сбой в каком-либо промежуточном шаге.
Трансакционное тестирование должно обеспечивать не только правильную работу каждого отдельного шага в тесте, но и их взаимодействие. Если один из этапов не проходит, тест должен откатиться, и система должна вернуться в исходное состояние, имитируя фактическую работу с системой.
При разработке таких тестов важно учитывать:
WebdriverIO предоставляет удобные средства для выполнения автоматизированных тестов на различных уровнях: от простых до сложных взаимодействий, включающих несколько шагов. Для трансакционного тестирования можно использовать встроенные возможности WebdriverIO, такие как обработка асинхронных операций, управление сессиями и интеграция с базами данных.
WebdriverIO использует промисы и асинхронные операции, что позволяет гибко работать с различными этапами тестирования. Для трансакционного тестирования это особенно важно, так как необходимо гарантировать, что все операции выполняются в правильном порядке и в нужное время. Использование асинхронных методов в WebdriverIO позволяет правильно синхронизировать шаги теста.
Пример:
describe('Трансакционный тест', () => {
it('Проверка добавления товара в корзину', async () => {
// Шаг 1: Переход на страницу товара
await browser.url('https://example.com/product');
// Шаг 2: Добавление товара в корзину
await $('#add-to-cart').click();
// Шаг 3: Проверка корзины
const cartItemCount = await $('#cart-item-count').getText();
assert.equal(cartItemCount, '1');
});
});
В этом примере все операции выполняются последовательно, а
WebdriverIO обрабатывает асинхронные взаимодействия через
await.
Один из ключевых аспектов трансакционного тестирования — это управление состоянием системы. Если на каком-то этапе теста происходит сбой, необходимо вернуть систему в исходное состояние. Для этого можно использовать методы WebdriverIO для очистки сессий или для работы с базой данных.
Пример использования сессий:
describe('Трансакционный тест с откатом', () => {
it('Добавление и удаление товара из корзины', async () => {
// Открытие страницы
await browser.url('https://example.com');
// Начальная проверка состояния корзины
let initialCartCount = await $('#cart-item-count').getText();
// Добавление товара в корзину
await $('#add-to-cart').click();
// Проверка количества товаров в корзине
let updatedCartCount = await $('#cart-item-count').getText();
assert.equal(updatedCartCount, parseInt(initialCartCount) + 1);
// Откат (удаление товара из корзины)
await $('#remove-from-cart').click();
// Проверка, что корзина пуста
updatedCartCount = await $('#cart-item-count').getText();
assert.equal(updatedCartCount, initialCartCount);
});
});
Иногда для эффективного трансакционного тестирования необходимо
работать с базой данных, чтобы откатить изменения в данных, сделанные в
ходе теста. В WebdriverIO можно использовать внешние библиотеки для
подключения к базе данных и работы с данными, такие как
mysql или pg.
Пример использования базы данных для отката:
const mysql = require('mysql');
describe('Тест с откатом базы данных', () => {
let connection;
before(async () => {
connection = mysql.createConnection({
host: 'localhost',
user: 'test_user',
password: 'test_password',
database: 'test_db'
});
connection.connect();
});
it('Добавление записи в базу данных', async () => {
// Добавление тестовой записи
const insertQuery = 'INSERT INTO products (name, price) VALUES ("Test Product", 100)';
connection.query(insertQuery);
// Проверка, что запись добавлена
const checkQuery = 'SELECT * FROM products WHERE name="Test Product"';
connection.query(checkQuery, (err, results) => {
assert.equal(results.length, 1);
});
});
after(async () => {
// Откат изменений в базе данных
const deleteQuery = 'DELETE FROM products WHERE name="Test Product"';
connection.query(deleteQuery);
connection.end();
});
});
В этом примере после выполнения теста данные, добавленные в базу,
удаляются в блоке after, что является частью отката
транзакции.
В реальных приложениях могут быть использованы сторонние API и сервисы для выполнения операций. Для таких сервисов также следует реализовать тесты с откатом. Например, для взаимодействия с платежными системами или другими внешними сервисами можно использовать WebdriverIO для имитации взаимодействия с этими сервисами, а затем в случае сбоя откатывать изменения.
Пример с имитацией внешнего API:
describe('Тест с внешним API', () => {
let response;
it('Платежная операция', async () => {
// Имитация запроса к API
response = await browser.call(() => {
return fetch('https://example.com/payment', {
method: 'POST',
body: JSON.stringify({ amount: 100, currency: 'USD' }),
headers: { 'Content-Type': 'application/json' }
}).then(res => res.json());
});
// Проверка успешного выполнения операции
assert.equal(response.status, 'success');
});
after(() => {
// Откат изменений в системе
if (response.status === 'success') {
// Имитация запроса для отката платежа
browser.call(() => {
return fetch('https://example.com/refund', {
method: 'POST',
body: JSON.stringify({ transactionId: response.transactionId }),
headers: { 'Content-Type': 'application/json' }
}).then(res => res.json());
});
}
});
});
В данном примере API платёжной системы имитируется для выполнения теста с откатом.
Управление ошибками: WebdriverIO позволяет
обрабатывать ошибки и исключения в процессе тестирования. Важно
предусматривать сценарии, при которых тест должен завершиться с ошибкой
и откатом изменений. Для этого можно использовать try-catch
блоки или асинхронные обработчики ошибок.
Откат данных: Каждый тест должен быть независимым, и откат всех изменений после теста является необходимостью для соблюдения целостности данных и предотвращения побочных эффектов для других тестов.
Тестирование целостности системы: Трансакционное тестирование должно проверять не только отдельные шаги, но и целостность всей системы после выполнения теста, учитывая состояние всех её частей — интерфейса, базы данных и внешних сервисов.
Параллельное тестирование: В некоторых случаях важно проверять поведение системы в условиях параллельных тестов. Для этого WebdriverIO предлагает средства для работы с параллельными сессиями и конфигурациями, что позволяет моделировать реальные условия работы системы.
Трансакционное тестирование помогает создавать надёжные и устойчивые автоматизированные тесты, которые обеспечивают не только правильность выполнения шагов, но и правильную работу всей системы в целом.