Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!27.06.2023
Генерація тестових даних зі справжніх
Почну ось з чого: нагенерувати дані, що виглядають, як справжній результат роботи проєкту — за моїм досвідом — в загальному нереально. А це буває потрібно — може, щоб мати гарні дані для стейджингу; або щоб правильно навантажити системний стрес-тест.
Просто створити записи з синтетичними даними відносно нескладно; для цього є бібліотеки на Ruby чи JavaScript, чи Go. Але це вже на рівні одного обʼєкта може викликати нереальні комбінації даних, а з групами обʼєктів взагалі виникає стільки різних нюансів, що продумати їх вручну стає неможливо. (Скільки коментарів має блог-пост, в середньому? А до скількох коментарів мають бути відповіді? А якщо блог-пост не опублікований? І так далі.) Такі дані підійдуть для автотестів, де відомо, що очікувати, але не допоможуть оцінити роботу продукту до потрапляння в продакшн.
Є інший підхід — взяти дані з продакшна. Там вони за означенням “справжні”. Проте на продакшні містяться дані користувачів, які ми абсолютно не можемо поширювати на стейджинг та інші незахищені середовища. Тоді нам залишається змінити дані з продакшна таким чином, щоб вони втратили привʼязку до користувачів, але зберегли свою топологію, тобто відношення та статистичні властивості.
Я знайшов такий спосіб: використати ті самі бібліотеки фальшивих даних, але передавати їм зерно, обчислене з оригінального значення. З однаковим зерном будь-яка випадкова функція матиме однакове значення, тобто ми будемо впевнені, що структура даних залишається, без того, щоб будувати словник для кожного наявного поля. Де взяти зерно? Пропоную обчислити простий хеш, наприклад, MD5 або SHA1 (простий — бо швидкий!), взяти від нього перші 8 байтів та зліпити з них int64
. Далі можна генерувати по зерну хоч імʼя, хоч імейл, хоч ціле оповідання. Вони будуть як правдоподібні (завдяки відповідній бібліотечній функції), так і зберігатимуть статистичні властивості.
Можна навіть зробити копію бази, де кожне поле замінене на своє зерно, а потім використати цю копію як “зерно” для генерації, скажімо, великого масиву даних для стрес-тесту.
(До речі, це може бути хороша задача для нейронної мережі, якщо придумати що робити з приватною інформацією, щоб вона не могла вилізти назовні.)