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

Какие используешь структуры данных?

2.0 Middle🔥 231 комментариев
#Java#Python

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

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

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

Использование структур данных в автоматизации тестирования

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

Основные структуры данных и их применение

1. Коллекции (Массивы, Списки, Множества)

Наиболее часто используются для хранения наборов объектов: элементов DOM, результатов поиска, тестовых данных.

# Пример: использование списка для хранения ожидаемых результатов
expected_titles = ["Главная", "Каталог", "О нас"]
actual_titles = [page.get_title() for page in pages]

# Пример: использование множества для уникальных значений
unique_user_ids = set(user["id"] for user in test_users)

2. Словари (Хеш-таблицы, Map)

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

// Пример: конфигурация браузера в виде словаря
Map<String, Object> browserConfig = new HashMap<>();
browserConfig.put("browserName", "chrome");
browserConfig.put("version", "latest");
browserConfig.put("headless", true);

// Пример: тестовые данные пользователя
Map<String, String> testUser = Map.of(
    "username", "test_user",
    "email", "test@example.com",
    "password", "SecurePass123!"
);

3. Очереди и Стеки

Полезны для управления порядком выполнения операций, обработки событий, реализации retry-логики.

from collections import deque

# Пример: очередь для обработки задач
task_queue = deque()
task_queue.append("login")
task_queue.append("create_order")
task_queue.append("logout")

# Обработка в порядке FIFO
while task_queue:
    current_task = task_queue.popleft()
    execute_task(current_task)

Специализированные применения в автоматизации

Управление тестовыми данными

Словари и JSON-подобные структуры отлично подходят для хранения сложных тестовых сценариев:

// Пример: структура для data-driven тестирования
const testScenarios = [
    {
        name: "Валидный логин",
        credentials: { login: "valid_user", password: "correct_pass" },
        expected: { success: true, redirect: "/dashboard" }
    },
    {
        name: "Неверный пароль",
        credentials: { login: "valid_user", password: "wrong_pass" },
        expected: { success: false, error: "Invalid credentials" }
    }
];

Сравнение и валидация данных

Множества эффективны для сравнения коллекций без учета порядка:

# Сравнение списков продуктов без учета порядка
expected_products = {"Laptop", "Phone", "Tablet"}
actual_products = set(get_displayed_products())

assert expected_products == actual_products, f"Разница: {expected_products.symmetric_difference(actual_products)}"

Кэширование результатов

Словари для мемоизации дорогостоящих операций (например, загрузки конфигурации):

class TestDataCache:
    def __init__(self):
        self._cache = {}
    
    def get_test_data(self, data_key):
        if data_key not in self._cache:
            # Загрузка из БД или API
            self._cache[data_key] = self._load_from_external_source(data_key)
        return self._cache[data_key]

Критерии выбора структур данных

При выборе структуры данных я руководствуюсь следующими принципами:

  • Частота операций: если нужен частый поиск по ключу — словарь, если важен порядок — список
  • Требования к уникальности: для уникальных значений — множество
  • Сложность данных: для вложенных структур — комбинации словарей и списков
  • Производительность: выбор между временем доступа O(1) у словарей и O(n) у списков
  • Потокобезопасность: в многопоточных сценариях — ConcurrentHashMap в Java или threading-safe коллекции

Пример комплексного использования

from dataclasses import dataclass
from typing import List, Dict, Optional
from enum import Enum

class Status(Enum):
    PASSED = "passed"
    FAILED = "failed"
    SKIPPED = "skipped"

@dataclass
class TestResult:
    test_name: str
    status: Status
    duration: float
    errors: List[str]

class TestReport:
    def __init__(self):
        self.results: Dict[str, TestResult] = {}
        self.stats = {"total": 0, "passed": 0, "failed": 0}
    
    def add_result(self, result: TestResult):
        self.results[result.test_name] = result
        self.stats["total"] += 1
        self.stats[result.status.value] += 1
    
    def get_failed_tests(self) -> List[str]:
        return [
            name for name, result in self.results.items()
            if result.status == Status.FAILED
        ]

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

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