· 7 min read

Строки телефонных номеров при сериализации в API: сохранение каждой цифры

План тестирования для разработчиков по сохранению телефонных номеров в виде строк от момента ввода до массового экспорта.

План тестирования для разработчиков по сохранению телефонных номеров в виде строк от момента ввода до массового экспорта.

Строки телефонных номеров при сериализации в API должны оставаться текстом на всех этапах: от ввода через JSON и хранение до экспорта. Телефонный номер — это идентификатор, а не числовое значение для вычислений, поэтому приведение к числу может привести к потере ведущего нуля, знака «плюс» или значимых младших разрядов. Перед массовой отправкой используйте сквозной тестовый сценарий (round-trip fixture), который сравнивает исходный текст номера с итоговым машиночитаемым значением и отмечает любые необъяснимые изменения.

→ Познакомьтесь с CheckNumber.AI →

Почему строки телефонных номеров важны в рабочих процессах API

Разработчик может увидеть поле, состоящее только из цифр, и по привычке выбрать числовой тип данных. Это рискованно, поскольку такое поле является идентификатором. Арифметические операции над ним не имеют смысла, а преобразование в число способно удалить ведущий ноль или отбросить начальный знак «плюс». В JavaScript существует специфическое ограничение точности: MDN’s Number reference поясняет, что целые числа за пределами безопасного диапазона могут искажаться при синтаксическом анализе из JSON в значения Number. В документе Google libphonenumber FAQ описан случай парсинга телефонов, когда младшие разряды менялись из-за ограничений точности чисел в JavaScript.

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

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

Отслеживайте значение на каждом этапе передачи

Зафиксируйте весь путь телефонного значения: форма сбора лидов или исходный файл, запрос приложения, синтаксический анализ JSON, столбец базы данных, чтение приложением, преобразование для экспорта, итоговые байты CSV или TXT и массовая отправка. На каждом шаге определите тип данных и проверьте, не изменяет ли какая-либо функция форматирования исходные символы. Текстовой метки в пользовательском интерфейсе недостаточно: значение имеют именно сохраненный исходный текст и итоговый экспорт.

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

ITU-T E.164 recommendation описывает международный план нумерации. Бесплатный инструмент Number Cleaner в панели управления CheckNumber позволяет нормализовать телефонные номера по стандарту E.164, а также удалять дубликаты и недействительные записи перед платной проверкой. Такая подготовка отличается от обязанности разработчика сохранять исходный текст. Нормализацию с учетом страны следует сопоставлять с известным контекстом страны до формирования файла для массовой проверки.

Создайте сквозной тестовый сценарий для разработчиков без привязки к схеме продукта

Создайте тестовый сценарий (fixture) на стороне клиента со стабильным идентификатором тестовой записи, исходной строкой телефона, подтвержденной страной и ожидаемой подготовленной строкой. Подготовьте несколько синтетических примеров: значение со знаком «плюс» в начале, локальный номер с ведущим нулем, длинную последовательность цифр для выявления ошибок числовой точности, значение с разделителями и дублирующееся значение, связанное с двумя отдельными идентификаторами записей. Используйте зарезервированные или неконтактные тестовые значения в собственной среде команды и помечайте их как синтетические. Этот сценарий проверяет сериализацию и сопоставление; он не утверждает, что какое-либо тестовое значение является реальным, действительным или зарегистрированным номером.

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

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

Проверяйте итоговый экспорт как данные, а не как представление в таблицах

Файл CSV, открытый в табличном процессоре, может быть переформатирован для отображения. Перед отправкой итоговый файл следует проверять как машиночитаемый текст. Убедитесь в точном совпадении символов в каждой строке с номером, особенно знака «плюс», ведущих нулей, кода страны и последних цифр. Если экспорт формируется на основе запроса к базе данных, сравните выборку строк с исходными и подготовленными значениями, сохраненными под теми же тестовыми идентификаторами.

При загрузке списков номеров в CheckNumber используйте одну страну на файл и один номер на строку с кодом страны; начальный знак «плюс» необязателен. Поддерживается загрузка файлов в формате CSV или TXT. Эти правила загрузки не следует механически переносить в недокументированную структуру REST-запроса. Разработчикам следует обращаться к актуальной документации API для выбранного поддерживаемого продукта и уточнять его фактический интерфейс и ограничения перед реализацией.

Записи с отсутствующими данными о стране или необъяснимыми изменениями цифр следует помещать в очередь на проверку, управляемую клиентом. «Чистый» экспорт, содержащий неверный номер, опаснее явного исключения: проверка может завершиться успешно, но ее результат будет привязан к неверной исходной записи. Сохраняйте причину исключения и идентификатор источника, чтобы владелец исходных данных мог внести исправления.

Сделайте сохранение данных обязательным условием релиза

Запускайте сквозной тестовый сценарий каждый раз, когда изменения в коде затрагивают парсер, модель JSON, тип данных в базе данных, правила импорта или модуль экспорта файлов. Сравнивайте исходные и подготовленные значения на фиксированных контрольных точках, а не просто проверяйте, что приложение завершило работу без ошибок. Тест должен завершаться сбоем, если какой-либо символ необъяснимо исчезает, появляется или меняет позицию. Он также должен завершаться ошибкой, если итоговую экспортированную строку невозможно связать с соответствующей исходной записью.

Для рабочих списков выполняйте сверку исходных строк, уникальных подготовленных номеров, отложенных исключений, отправленных строк и последующих сопоставленных результатов. Это показатели внутреннего аудита на стороне клиента, а не ожидаемые параметры производительности сервиса проверки. Несоответствие может указывать на пропущенные строки или дедупликацию, приведшую к утрате сопоставления. Если на последующем этапе требуется сигнал о валидности, ознакомьтесь с Phone Number Checker в качестве отдельного шага. Результаты конкретного инструмента проверки могут экспортироваться для анализа и сегментации под контролем клиента, однако их интерпретация зависит от конкретного продукта, выбранного после подготовки входных данных.

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

FAQ

Как разработчики могут предотвратить изменение цифр телефона в JSON?

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

Позволяет ли обратное преобразование округленного числа в текст восстановить утраченные цифры?

Нет. Если значение было изменено еще до поступления в приложение, необходимо обратиться к первоисточнику данных.

Что должен включать тестовый сценарий для строк телефонных номеров?

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

Где разработчикам найти формат входных данных для API CheckNumber?

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