Как вы подходите к тестированию интеграции с платёжными системами?

«Как вы подходите к тестированию интеграции с платёжными системами?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Тестирование платежных систем требует комплексного подхода, фокусирующегося на безопасности, надежности и корректности финансовых операций.

Ключевые аспекты тестирования:

  1. Функциональное тестирование:
    • Успешные платежи (разные суммы, валюты, способы оплаты).
    • Неуспешные сценарии (недостаточно средств, отклоненная карта, истекший срок).
    • Возвраты (refunds) и отмена платежей (void).
    • Валидация входных данных (номера карт, CVV, срок действия).
  2. Тестирование безопасности (критически важно):
    • Соблюдение стандарта PCI DSS (данные карт не должны логироваться или храниться без токенизации).
    • Защита от уязвимостей: инъекции, подмена запросов (CSRF), недостаточная аутентификация.
    • Проверка передачи данных по HTTPS, валидность SSL-сертификатов.
  3. Интеграционное тестирование API:
    • Взаимодействие с платежными шлюзами (Stripe, PayPal, Adyen) через их Sandbox/Test API.
    • Проверка корректности HTTP-кодов ответов, форматов запросов/ответов (JSON/XML).
    • Обработка таймаутов и ошибок сети.

Пример автотеста на Python (используя sandbox Stripe):

import stripe
import pytest

stripe.api_key = "sk_test_..."  # Test secret key

def test_successful_card_payment():
    # Создаем тестовый платежный метод (токенизированная карта)
    payment_method = stripe.PaymentMethod.create(
        type="card",
        card={
            "number": "4242424242424242",  # Стандартный тестовый номер для успеха
            "exp_month": 12,
            "exp_year": 2034,
            "cvc": "123",
        },
    )
    # Создаем платежное намерение (Payment Intent)
    intent = stripe.PaymentIntent.create(
        amount=1000,  # 10.00 USD
        currency="usd",
        payment_method=payment_method.id,
        confirmation_method="manual",
        confirm=True,
    )
    assert intent.status == "succeeded"

def test_insufficient_funds():
    # Карта, которая вернет ошибку недостатка средств
    payment_method = stripe.PaymentMethod.create(
        type="card",
        card={"number": "4000000000009995"}  # Специальный тестовый номер
    )
    with pytest.raises(stripe.error.CardError) as e:
        stripe.PaymentIntent.create(
            amount=1000,
            currency="usd",
            payment_method=payment_method.id,
            confirm=True,
        )
    assert e.value.code == "card_declined"
    assert "insufficient_funds" in e.value.error.message

Инструменты: Postman/Newman для коллекций API-тестов, Charles/Fiddler для анализа трафика, OWASP ZAP для security-сканирования.