How do you create a database for testing that is like your production database? It depends on how you want the test database to be "like" the production one.
Replacing Sensitive Data
Companies often use an old version of their production database for testing. But what if the production database has sensitive information that software developers and testers should not have access to?
You can't completely remove customer phone numbers from the database, for example, if your software handles customer phone numbers. You have to replace in sensitive data with modified data. The question becomes how to modify it. Three approaches would be:
- Use the original data.
- Generate completely new artificial data.
- Use the real data as a guide to generating new data.
We'll assume the first option is off the table and consider the pros and cons of the other two options.
For example, suppose you collect customer ages. You could replace customer age with a random two-digit number. That's fine as far as making sure that forms can display two-digit numbers. But maybe the age values matter. Maybe you want your fictional customers in the test database to have the same age distribution as your real customers. Or maybe you want your fictional customer ages to be correlated with other attributes so that you don't have 11-year-old retirees or 98-year-old clients who can't legally purchase alcohol.
Random vs. Realistic
There are pros and cons to having a realistic test database. A database filled with randomly generated data is likely to find more bugs, but a realistic database is likely to find more important bugs.
Randomly generated data may contain combinations that have yet to occur in the production data, combinations that will cause an error when they do come up in production. Maybe you've never sold your product to someone in Louisiana, and there's a latent bug that will show up the first time someone from Louisiana does order. (For example, Louisiana retains vestiges of French law that make it different from all other states.)
On the other hand, randomly generated data may not find the bugs that affect the most customers. You might want the values in your test database to be distributed similarly to the values in real data so that bugs come up in testing with roughly the same frequency as in production. In that case, you probably want the joint distributions to match and not just the unconditional distributions. If you just match the latter, you could run into oddities such as a large number of teenage retirees as mentioned above.
So do you want a random test database or a realistic test database? Maybe both! It depends on your purposes and priorities. You might want to start by testing against a realistic database so that you first find the bugs that are likely to affect the most number of customers. Then maybe you switch to a randomized database that is more effective at flushing out problems with edge cases.
How to Make a Realistic Test Database
So how would you go about creating a realistic test database that protects customer privacy? The answer depends on several factors. First of all, it depends on what aspects of the real data you want to preserve. Maybe verisimilitude is more important for some fields than others. Once you decide what aspects you want your test database to approximate, how well do you need to approximate them? If you want to do valid statistical analysis on the test database, you may need something sophisticated like differential privacy. But if you just want moderately realistic test cases, you can do something much simpler.
Finally, you have to address your privacy-utility trade-off. What kinds of privacy protection are you ethically and legally obligated to provide? For example, is your data consider PHI under HIPAA regulation? Once your privacy obligations are clear, you look for ways to maximize your utility subject to these privacy constraints.
If you'd like help with this process, let's talk. I can help you determine what your obligations are and how best to meet them while meeting your business objectives.