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

Какие знаешь виды переменных?

2.3 Middle🔥 121 комментариев
#Автоматизация тестирования

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

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

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

Виды переменных в программировании и тестировании

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

Вот основные виды переменных, с которыми я работаю:

1. По области видимости (Scope)

Это ключевая классификация, напрямую влияющая на архитектуру тестов.

  • Глобальные переменные: Объявляются вне всех функций/классов/блоков. Доступны в любой части программы (или модуля). В тестировании их используют с крайней осторожностью, так как они могут приводить к нежелательным побочным эффектам и усложнять параллельный запуск тестов. Пример использования: глобальный объект драйвера браузера (в некоторых подходах) или конфигурация среды.

    # Пример (Python): Глобальная переменная для хранения базового URL API
    BASE_API_URL = "https://api.test.env.com/v1"
    def test_get_users():
        # Используем BASE_API_URL внутри функции
        response = requests.get(f"{BASE_API_URL}/users")
        assert response.status_code ==16 200
    
  • Локальные переменные: Объявляются внутри функции, метода или блока кода (например, внутри цикла for). Существуют только на время выполнения этого блока. Это наиболее безопасный и предпочтительный вид для хранения промежуточных данных в тестах (результаты запросов, вычисленные ожидаемые значения).

    // Пример (Java): Локальная переменная в тестовом методе
    @Test
    public void testCalculateTotal() {
        // Локальная переменная, существующая только в рамках этого метода
        ShoppingCart cart = new ShoppingCart();
        cart.addItem(new Item("Book", 25.50));
        double total = cart.calculateTotal(); // 'total' - локальная переменная
        assertEquals(25.50, total, 0.01);
    }
    
  • Переменные экземпляра (поля класса): Принадлежат конкретному объекту (экземпляру класса). В контексте Page Object Model (POM) или других объектных моделей для тестирования, мы активно используем такие переменные для хранения локаторов элементов или состояния страницы.

    # Пример (Python): Переменные экземпляра в Page Object
    class LoginPage:
        def __init__(self, driver):
            self.driver = driver  # Переменная экземпляра
            self.username_field = (By.ID, "username")  # Еще одна переменная экземпляра (локатор)
            self.password_field = (By.ID, "password")
    
        def enter_credentials(self, user, pwd):
            # Обращаемся к переменным экземпляра через self
            self.driver.find_element(*self.username_field).send_keys(user)
            self.driver.find_element(*self.password_field).send_keys(pwd)
    

2. По времени жизни

  • Статические переменные (классовые): Принадлежат классу, а не объекту. Все экземпляры класса разделяют одну копию такой переменной. В тестовых фреймворках могут использоваться для счетчиков, общего состояния или кеширования дорогостоящих ресурсов (например, подключения к БД), но требуют осторожности при параллельном выполнении.
    // Пример (Java): Статическая переменная для счетчика выполненных тестов
    public class TestCounter {
        public static int testsExecuted = 0; // Статическая переменная класса
    }
    

3. По типу изменяемости (Mutability)

  • Изменяемые (mutable): Объекты, состояние которых можно изменить после создания (списки, словари, большинство объектов). При передаче между функциями/тестами важно понимать, что изменяется оригинал.
  • Неизменяемые (immutable): Объекты, которые нельзя изменить после создания (строки, числа, кортежи в Python). Их безопасно передавать, они гарантируют целостность данных. В тестировании часто используются для констант.

4. По источнику и назначению (Специфично для тестирования)

Здесь проявляется экспертиза QA Engineer. Мы манипулируем переменными для управления тестовой средой и данными.

  • Конфигурационные переменные (Environment Variables): Критически важный вид. Позволяют отделить код тестов от параметров среды (URL, учетные данные, флаги). Это основа для тестирования на разных окружениях (dev, staging, prod) без изменения кода. Часто хранятся в .env файлах или задаются в CI/CD пайплайне (Jenkins, GitLab CI).

    # Пример (.env файл)
    APP_URL=https://staging.app.com
    DB_HOST=localhost
    TEST_USER_LOGIN=test_user
    # В коде теста (Python с библиотекой python-dotenv)
    import os
    from dotenv import load_dotenv
    load_dotenv()
    base_url = os.getenv("APP_URL")  # Чтение переменной окружения
    
  • Тестовые данные: Данные, специфичные для конкретного тестового случая. Их можно хранить в переменных, файлах (JSON, XML, CSV), базах данных. Параметризация тестов (например, в pytest или TestNG) напрямую оперирует этим видом переменных.

    # Пример параметризации в pytest
    import pytest
    @pytest.mark.parametrize("username, password, expected_result", [
        ("valid_user", "correct_pwd", "success"),
        ("invalid_user", "wrong_pwd", "failure"),
    ])
    def test_login(username, password, expected_result):
        # 'username', 'password', 'expected_result' здесь являются параметризованными переменными
        result = login(username, password)
        assert result == expected_result
    
  • Переменные для отчетности и логирования: Хранят ID тест.

  • Сессионные переменные: В веб-тестировании (особенно с Selenium) могут эмулировать переменные сессии браузера или приложения.

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

Понимание видов переменных позволяет:

  1. Изолировать тесты: Использовать локальные переменные и чистые фикстуры, чтобы тесты не влияли друг на друга.
  2. Повышать поддерживаемость: Выносить изменяемые параметры в конфигурационные переменные или файлы.
  3. Упрощать отладку: Четко отслеживать, где и как изменяется состояние системы.
  4. Реализовывать Data-Driven Testing: Эффективно параметризовать тесты, отделяя логику от данных.
  5. Безопасно работать с credentials: Никогда не хранить пароли и ключи в коде, используя переменные окружения или секреты в CI/CD.

Таким образом, для QA Engineer переменные — это не просто синтаксическая конструкция, а инструмент для построения гибкого, безопасного и эффективного автоматизированного тестирования.