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

Что будет если передать строку вместо чисел?

1.8 Middle🔥 171 комментариев
#Теория тестирования

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

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

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

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

Основные последствия

Если функция или операция ожидает числа (целые, с плавающей точкой), а получает строку (например, "123" или "hello"), возможны следующие исходы:

1. Неявное преобразование (Type Coercion) или Ошибка времени выполнения (Runtime Error)

  • В языках со строгой типизацией (Java, C#, Go, Rust) это почти всегда приведет к ошибке компиляции или исключению (exception) на этапе выполнения. Компилятор или рантайм не может безопасно преобразовать строку в число без явного указания.

    // Java: NumberFormatException
    int number = Integer.parseInt("abc"); // Выбросит исключение
    
  • В языках с динамической и слабой типизацией (JavaScript, PHP, Python в некоторых случаях) интерпретатор попытается выполнить неявное преобразование типа. Это источник коварных багов.

    // JavaScript: Неявное преобразование
    console.log("5" - 2); // 3 (строка "5" преобразуется в число 5)
    console.log("5" + 2); // "52" (оператор + конкатенирует строки, число 2 преобразуется в "2")
    console.log("abc" * 2); // NaN (Not a Number - специальное значение)
    

2. Неправильные результаты вычислений или логики

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

function calculateTotal(price, quantity) {
    return price * quantity;
}
// Если quantity пришло из формы ввода как строка "2"
calculateTotal(10, "2"); // Вернет 20 (неявное преобразование сработало)
calculateTotal(10, "два"); // Вернет NaN (сбой)

3. Сравнения дают неожиданный результат

Сравнение строк и чисел — классическая ловушка, особенно в JavaScript.

console.log("123" == 123);  // true (нестрогое равенство, тип игнорируется)
console.log("123" === 123); // false (строгое равенство, проверяется и тип)
console.log("25" > "100");  // true (лексикографическое сравнение строк! Сравниваются символы '2' и '1')
console.log(25 > "100");    // false (строка "100" преобразована в число 100)

4. Остановка программы (Крах)

В низкоуровневых языках (C, C++) отсутствие проверки типов может привести к неопределенному поведению (undefined behavior) или сегментационному нарушению (segmentation fault), если интерпретация байтов строки как числа приведет к доступу в недопустимую область памяти.

Что происходит внутри?

  • Числа хранятся в памяти в бинарном виде (целые как двоичные числа, с плавающей точкой по стандарту IEEE 754).
  • Строки хранятся как последовательность байтов (кодовых точек).
  • Попытка интерпретировать байты строки "abc" как целое число не имеет смысла. Функция преобразования (например, parseInt) должна проанализировать строку, распознать символы цифр, игнорировать пробелы и преобразовать их в соответствующее числовое значение. Если это невозможно — возникает ошибка.

Ответственность QA Automation Engineer

Как автоинженер, я должен:

  1. Проверять валидацию входных данных: Написать тесты, которые передают строки в поля, ожидающие числа.
  2. Обрабатывать исключения: Убедиться, что код приложения корректно обрабатывает такие ошибки (выводит понятное сообщение, не падает).
  3. Использовать строгие проверки: В своих автотестах на языках вроде JavaScript использовать === и явные преобразования Number() или parseInt() с проверкой на isNaN().
  4. Тестировать граничные и некорректные значения: Строки, содержащие:
    *   Числа с пробелами (`" 123 "`)
    *   Числа с буквами (`"123abc"`)
    *   Пустую строку (`""`)
    *   Спецсимволы (`"12.34"`, `"1,000"`)
    *   Очень большие числа, выходящие за диапазон (`"99999999999999999999"`)

Пример теста на Python (pytest):

import pytest

def string_to_int(value):
    """Функция, которую мы тестируем."""
    try:
        return int(value)
    except (ValueError, TypeError):
        return None

# Параметризованный тест для проверки разных входных данных
@pytest.mark.parametrize("input_str, expected", [
    ("123", 123),           # Корректная строка-число
    ("-456", -456),         # Отрицательное число
    ("  789  ", 789),       # Число с пробелами
    ("abc", None),          # Нечисловая строка -> ожидаем None
    ("123abc", None),       # Частично число
    ("", None),             # Пустая строка
    (None, None),           # None
])
def test_string_to_int_conversion(input_str, expected):
    assert string_to_int(input_str) == expected

Вывод

Передача строки вместо чисел — это ошибка входящих данных или логики приложения. Хорошо спроектированная система должна:

  • Либо предотвращать ее на уровне UI/валидации форм.
  • Либо явно и безопасно обрабатывать на уровне бизнес-логики (парсинг с проверкой).
  • Либо корректно сообщать об ошибке пользователю или логировать для разработчика.

Задача автотестов — смоделировать такое некорректное поведение и убедиться, что система ведет себя предсказуемо и безопасно, а не молча выдает неверный результат или полностью прекращает работу.