← Назад к вопросам

Как убрать дублирующиеся данные из ответа?

2.0 Middle🔥 161 комментариев
#Теория тестирования#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Удаление дублирующихся данных из ответа API: стратегии для QA Automation

При работе с API в автоматизированном тестировании часто возникают ситуации, когда ответ содержит дублирующиеся данные. Это может быть связано с ошибкой бэкенда, некорректными настройками пагинации или особенностями реализации. Удаление дубликатов — важная задача для обеспечения корректности проверок.

Основные подходы к дедупликации

1. Фильтрация на стороне тестового кода

Самый распространённый способ — обработка полученного ответа непосредственно в тестовом скрипте.

import json
from typing import List, Dict, Any

def remove_duplicates_by_key(data: List[Dict], key: str) -> List[Dict]:
    """Удаляет дубликаты по указанному ключу."""
    seen = set()
    unique_data = []
    for item in data:
        item_key = item.get(key)
        if item_key not in seen:
            seen.add(item_key)
            unique_data.append(item)
    return unique_data

# Пример использования
response_data = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"},  # Дубликат
    {"id": 3, "name": "Charlie"}
]

unique_data = remove_duplicates_by_key(response_data, "id")
print(f"Уникальные записи: {unique_data}")

2. Использование структур данных с уникальностью

В Python можно использовать возможности множеств (set) для примитивных типов или комбинаций.

def remove_duplicate_primitives(data_list: List[Any]) -> List[Any]:
    """Удаляет дубликаты примитивных значений."""
    return list(set(data_list))

def remove_duplicate_dicts(data: List[Dict]) -> List[Dict]:
    """Удаляет дубликаты словарей (если они хэшируемы)."""
    # Преобразуем словари в кортежи для хэширования
    tuple_data = [tuple(sorted(item.items())) for item in data]
    unique_tuples = set(tuple_data)
    return [dict(item) for item in unique_tuples]

Практические сценарии в тестировании

Валидация ответов API

Когда необходимо проверить, что элементы не повторяются в ответе:

// JavaScript пример для Node.js/Playwright
async function validateUniqueUsers(response) {
    const users = await response.json();
    const userIds = users.map(user => user.id);
    const uniqueIds = [...new Set(userIds)];
    
    if (userIds.length !== uniqueIds.length) {
        throw new Error(`Найдены дубликаты пользователей. 
                        Всего: ${userIds.length}, уникальных: ${uniqueIds.length}`);
    }
    return users.filter((user, index) => 
        userIds.indexOf(user.id) === index
    );
}

Обработка пагинированных данных

При сборе данных с нескольких страниц часто возникают дубликаты на границах:

def collect_paginated_data(api_client, endpoint):
    """Собирает данные со всех страниц с удалением дубликатов."""
    all_items = []
    page = 1
    
    while True:
        response = api_client.get(f"{endpoint}?page={page}")
        items = response.json().get("data", [])
        
        if not items:
            break
            
        all_items.extend(items)
        page += 1
    
    # Удаляем дубликаты по составному ключу
    seen = set()
    unique_items = []
    
    for item in all_items:
        # Создаем уникальный ключ из нескольких полей
        item_key = (item["id"], item.get("created_at", ""))
        if item_key not in seen:
            seen.add(item_key)
            unique_items.append(item)
    
    return unique_items

Рекомендации для QA Automation

  1. Определите критерий уникальности

    • Один поле (ID, email)
    • Комбинация полей (ID + timestamp)
    • Всё содержимое объекта
  2. Выберите уровень обработки

    • На стороне теста: когда нужно валидировать корректность API
    • В тестовых утилитах: для предобработки данных перед проверками
    • Через параметры API: если API поддерживает distinct или аналогичные флаги
  3. Учитывайте производительность Для больших объёмов данных используйте эффективные структуры:

from itertools import filterfalse

def efficient_deduplication(data, key_func):
    """Эффективная дедупликация для больших наборов данных."""
    seen = set()
    for item in data:
        key = key_func(item)
        if key not in seen:
            seen.add(key)
            yield item

# Использование генератора экономит память
unique_gen = efficient_deduplication(large_dataset, lambda x: x["id"])
unique_list = list(unique_gen)

Важные аспекты

  • Логирование: Всегда логируйте количество найденных и удалённых дубликатов
  • Валидация в asserts: Включайте проверку на дубликаты в assertions
  • Тестовые данные: Создавайте тесты специально с дубликатами для проверки обработки
  • Отчётность: Фиксируйте случаи дубликатов как потенциальные баги бэкенда

Дедупликация данных — не только техническая задача, но и важная часть обеспечения качества данных в системе. Автоматизированная обработка дубликатов помогает выявлять проблемы на ранних этапах и обеспечивает стабильность тестовых проверок.

Как убрать дублирующиеся данные из ответа? | PrepBro