Меню

Проверка возраста: пороги, пограничные даты и 29 февраля

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

Опубликовано

  • проверка возраста
  • дата рождения
  • тестовые данные

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

Пороги возраста берутся из разных правил

Четыре значения, которые встречаются чаще всего, происходят из разных источников:

  • Тринадцать лет — возраст, с которого в Соединённых Штатах обычно допускается самостоятельное согласие на сбор данных о ребёнке в интернете.
  • Шестнадцать лет — возраст по умолчанию для согласия на обработку персональных данных в Европейском союзе, при этом отдельные страны устанавливают свои значения в диапазоне от тринадцати до шестнадцати лет.
  • Восемнадцать лет — возраст наступления полной дееспособности в большинстве стран.
  • Двадцать один год — возраст, с которого в некоторых странах разрешена продажа алкоголя.

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

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

Возраст считается на дату, а не по году рождения

Распространённая и незаметная ошибка — вычитать год рождения из текущего года. Такой расчёт ошибается у всех, кто ещё не отметил день рождения в этом году: человек, родившийся в декабре, всё лето считается на год старше, чем он есть.

Правило простое: возраст — это число полных лет, и день рождения в текущую дату уже засчитывается. Человек, которому исполняется восемнадцать сегодня, сегодня уже достиг порога, а не завтра. Ошибка на один день выглядит мелочью, но именно она открывает или закрывает доступ не тем людям, и в пограничных сценариях её замечают сразу.

Как проверить граничный день?

Для каждого порога нужны как минимум три образца: человек, которому порог исполнится завтра, человек, которому он исполнился сегодня, и человек, которому он исполнился вчера. Первый должен быть отклонён, второй и третий — пройти. Если проверка различает только «давно достиг» и «давно не достиг», она не проверена вовсе.

Полезно добавить и образцы с датой, вычисляемой относительно текущего дня. Именно они ломаются тише всего: тест написан в прошлом году, дата в нём указана конкретным числом, и через год он перестаёт проверять границу, хотя по-прежнему считается успешным.

Стоит проверять не только сам ответ, но и то, откуда он взят. Если логика доступа опирается на отдельное поле возраста, тест может пройти при верном числе и всё равно разойтись с датой рождения, сохранённой в записи. Для граничных образцов убедитесь дополнительно, что проверка смотрит на дату, а не на заранее вычисленное значение. Как такие образцы уживаются с остальными полями записи, разобрано в статье про дату рождения и её границы.

Что делать с днём рождения 29 февраля?

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

С расчётом возраста в невисокосный год нужно определиться сознательно. На практике часто берут первое марта как день, когда человек «достигает» возраста, но выбор должен быть одинаковым во всех местах системы: если проверка доступа и расчёт возраста в отчёте используют разные правила, расхождение обнаружится как раз на этих людях. Високосный год определяется делимостью на четыре, но у веков правило другое: год, делящийся на сто, високосным не считается, если не делится на четыреста. Поэтому 1900 год не был високосным, а 2000 был.

Где взять данные для проверок возраста

В генераторе данных личности дата рождения выводится из выбранной страны вместе с остальными полями записи. Это удобно для проверок возраста: можно взять запись, где дата рождения согласована с регионом и остальными данными, и закрепить её ключом личности, чтобы тест не зависел от случая. Тогда граничный образец остаётся тем же при каждом запуске, и изменение поведения видно сразу. Посмотреть, как различаются данные по странам, можно, например, в описании данных для Соединённых Штатов.

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

Что важно разработчику: часовые пояса и настраиваемые пороги

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

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

Третье — не храните возраст отдельным полем, если его можно вычислить. Возраст устаревает каждый год, и запись, сохранённая как число, со временем начинает противоречить собственной дате рождения. Храните дату, а возраст считайте в момент проверки.

Четвёртое — проверьте, что делает система, когда даты нет вовсе. Отсутствие даты рождения — это не «ноль лет» и не «взрослый по умолчанию»: это отдельный случай, и решение по нему лучше принять осознанно.

Пятое — подумайте, что сообщает система. Отказ по возрасту не должен раскрывать ничего лишнего и не должен позволять перебором выяснить, какая именно дата была введена. Формулировка отказа для человека и подробность записи в журнале — две разные строки текста, и смешивать их не стоит. Как связаны между собой дата рождения, возраст и остальные поля, описано в статье про согласованность полей.

Что делать дальше

Выпишите пороги, которые действуют в вашем продукте, и для каждого заведите три образца: завтра, сегодня, вчера. Добавьте к ним человека, родившегося 29 февраля, и запись без даты рождения. Затем прогоните проверки и убедитесь, что границы ведут себя так, как вы ожидаете. Готовые записи для такого набора можно закрепить ключом в генераторе.

Читать дальше

Статьи: Генератор данных личности и тестовых данных онлайн