Sensitive data в тестах

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


Хранение чувствительных данных

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

  • cypress.env.json — файл, который может содержать ключи и значения, доступные во всех тестах:
{
  "apiKey": "your_api_key_here",
  "userPassword": "secure_password"
}
  • Переменные окружения через командную строку:
npx cypress open --env apiKey=your_api_key_here,userPassword=secure_password
  • Файл .env совместно с библиотекой dotenv для загрузки данных:
require('dotenv').config();

Cypress.env('apiKey', process.env.API_KEY);
Cypress.env('userPassword', process.env.USER_PASSWORD);

Файл cypress.env.json и .env не должны попадать в систему контроля версий (.gitignore).


Использование чувствительных данных в тестах

Cypress предоставляет метод Cypress.env() для безопасного доступа к данным:

describe('Авторизация пользователя', () => {
  it('Вводит правильный пароль и логин', () => {
    cy.visit('/login');
    cy.get('#username').type('testuser');
    cy.get('#password').type(Cypress.env('userPassword'), { log: false });
    cy.get('button[type="submit"]').click();
    cy.contains('Добро пожаловать').should('be.visible');
  });
});

Ключевой момент: параметр { log: false } предотвращает отображение введенного значения в логах Cypress. Это критично при работе с паролями и токенами.


Разделение данных по средам

Для разных сред (development, staging, production) можно создавать отдельные файлы окружения:

cypress.env.development.json
cypress.env.staging.json
cypress.env.production.json

Загрузка данных конкретной среды выполняется через команду:

npx cypress run --env-file cypress.env.staging.json

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


Шифрование и безопасное хранение

Для особо критичных данных можно применять шифрование:

  1. Хранить зашифрованные значения в cypress.env.json.
  2. Расшифровывать их перед использованием в тесте:
const crypto = require('crypto');

function decrypt(value) {
  const decipher = crypto.createDecipher('aes256', process.env.ENCRYPTION_KEY);
  let decrypted = decipher.update(value, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const password = decrypt(Cypress.env('encryptedPassword'));

Это снижает риск компрометации данных в случае утечки файлов конфигурации.


Работа с API-токенами

API-токены можно хранить как переменные окружения и использовать в запросах через cy.request:

cy.request({
  method: 'GET',
  url: '/api/user',
  headers: {
    Authorization: `Bearer ${Cypress.env('apiToken')}`
  }
}).then((response) => {
  expect(response.status).to.eq(200);
});

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


Скрытие чувствительных данных в отчетах

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

  • Использовать { log: false } при вводе данных.
  • Для cy.request можно скрыть тело запроса, если оно содержит пароли или токены.

Пример с cy.request:

cy.request({
  method: 'POST',
  url: '/login',
  body: { username: 'testuser', password: Cypress.env('userPassword') },
  log: false
});

Автоматизация и CI/CD

В CI/CD пайплайнах чувствительные данные хранятся в секретах среды. Например, GitHub Actions, GitLab CI и Jenkins позволяют задать переменные окружения, доступные только на этапе запуска тестов.

Пример для GitHub Actions:

env:
  USER_PASSWORD: ${{ secrets.USER_PASSWORD }}
  API_KEY: ${{ secrets.API_KEY }}

steps:
  - name: Run Cypress tests
    run: npx cypress run

В тестах эти значения извлекаются через Cypress.env() или process.env.


Рекомендации по безопасности

  • Никогда не хранить реальные пароли и токены в коде.
  • Файлы с чувствительными данными не включать в Git.
  • Для логирования использовать опцию { log: false }.
  • Для разных сред использовать отдельные конфигурационные файлы.
  • Рассматривать шифрование при хранении особо критичных данных.
  • Использовать секреты CI/CD вместо хранения данных в проекте.

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