使用 SQL Provision 构建更好的测试数据





5.00/5 (1投票)
本文介绍了一种使用 SQL Provision 按需构建一致、合规、有用的数据库的方法,用于开发和测试环境。
开发团队在有信心软件能够按照设计一致地运行时,才会将其提供给发布。他们会测试尽可能多的不同用户工作流。不幸的是,他们的测试环境通常无法反映生产环境中更严酷的现实,那里他们的软件会遇到大量真实数据,以及一些“意外”的数据值。
不可避免地,这会导致在将更改部署到生产环境时出现意外问题。要最大限度地减少这种情况的一个好方法是,使用模拟生产环境中预期的真实数据的早期构建和测试,以便测试结果能更可靠地指示发布时的行为。不幸的是,数据隐私和保护法规通常会限制这些数据的移动和使用。那么,如何创建符合禁止共享敏感或个人数据的法规,但又看起来和行为都像真实数据的测试数据呢?
如果您需要手动使用脚本来完成此操作,并且需要为许多开发和测试环境进行数据准备,那么您会发现这很困难。本文将解释如何使用 SQL Provision 以自动化方式解决此问题。它使用 SQL Provision 的 **数据掩码工具** 创建 SQL Server 测试数据,其中任何敏感或个人信息都经过混淆,但保留了预测的生产负载的数量和特征。然后,文章将介绍如何使用 **SQL Clone** 自动化准备开发和测试环境,提供逼真但合规的测试数据。
这些技术的结合对于确保我们在用户遇到应用程序之前能够评估软件的真实行为非常有价值。
安全至关重要
在开发数据库软件时,生产环境中实际存在的数据通常是无可替代的。然而,这些数据的安全性至关重要,我们大多数的测试和开发系统都具有较低的安全配置,以适应软件开发过程的灵活性。
虽然在数据安全、数据隐私和数据主体权利方面存在许多复杂的问题,但大多数组织都认识到在安全性较低的环境中使用实际数据是一种糟糕的做法。事实上,世界许多国家都在引入惩罚组织丢失数据的立法。像 GDPR 这样的法律明确要求在测试和开发环境中匿名或假名化数据。
提供数据掩码以随机化和保护敏感数据的工具,有助于确保开发团队仍然可以使用在特征、数量和分布上尽可能接近生产数据的数据来评估软件的功能和性能。
随机数据不足以应对
如果安全法规不允许您使用生产数据,那么您可能会决定简单地使用“随机生成”的测试数据。虽然这从安全角度很有帮助,但它会在开发过程中引入其他问题。
首先,它不会反映真实数据的特征和分布,因此我们应用程序中使用这些数据的进程可能不会像遇到真实数据时那样运行或执行。我们需要“随机化”数据来保护它,但我们需要以一种使其看起来和行为都像真实的方式来做。
其次,编写功能并评估其正确性的开发人员和测试人员会习惯于特定的数据集,当他们在结果中看到熟悉的数据时,他们可以快速评估系统是否按预期工作。例如,可能需要存在特定数据值,以模仿电子商务系统中的一系列订单,并确保所有不同的订单排列都经过测试并正常工作。同样,数据越逼真,参与 UAT 的用户就越容易决定开发人员交付的内容是否满足他们的需求。例如,如果用户期望在注册系统中看到特定的时间表,那么看到随机值可能会被误解为软件故障。
简而言之,使用随机数据可以保护我们免于意外泄露敏感或个人数据,并且可能还会带来引入我们可能未曾考虑过的“边缘情况”的好处。然而,它本身是不够的。测试数据还必须包含一套精心策划的值,以测试我们软件的已知情况和边界。这可能是我们会计软件的一系列总账交易,或者注册系统的已知时间表。这套精心策划的数据集将不包含任何敏感数据,并且在我们所有的开发和测试数据库中保持一致。
使用 SQL Provision 生成逼真但合规的测试数据
我们的目标是一个轻量级、适应性强且自动化的流程,能够为开发人员和测试人员提供一致且安全的数据集,因为敏感和个人数据已被随机值替换,但同时也能代表生产系统中存在的值,并包含对他们日常工作有用的已知值。
然而,任何依赖于使用数据库备份和还原在系统之间移动大量数据,并运行手动“数据清理”脚本的技术,都会很慢、很麻烦且难以维护。相比之下,本文中的工具使用现代数据掩码和数据虚拟化技术,使我们能够在整个软件开发生命周期中一致地准备多个环境。我将展示如何使用 SQL Provision(SQL Clone 和 Data Masker for SQL Server 的组合)来自动化以下流程步骤:
- 复制生产数据
- 对包含敏感或个人数据的任何列执行随机掩码,以防止这些数据“泄露”到安全性较低的环境中。
- 将精心策划的数据集注入数据库——已知的数据集,包含足够的值来充分测试软件,但没有任何敏感信息。
- 使用数据虚拟化按需快速准备一致的数据库。
我之前的 文章 已经演示了一种实现步骤 1、2 和 4 的简单方法。它使用了清单 1 中的 PowerShell 脚本,通过 SQL Clone 自动化数据映像的创建,通过 Data Masker 替换任何敏感或个人数据为随机生成的值,然后通过 SQL Clone 将经过清理的数据库克隆部署到开发和测试服务器。
# Connect to SQL Clone Server Connect-SqlClone -ServerUrl 'YOUR CLONE SERVER URL HERE' # Set variables for Image and Clone Location $SqlServerName = 'Plato' $SqlInstanceName = 'SQL2016' $SqlDevInstanceName = 'SQL2016_qa' $ImageName = 'DataMaskerBase' $Devs = @("Steve", "Grant", "Kathi") # Get the Clone instance for the source and dev environments $SqlServerInstance = Get-SqlCloneSqlServerInstance -MachineName $SqlServerName -InstanceName $SqlInstanceName $SqlServerDevInstance = Get-SqlCloneSqlServerInstance -MachineName $SqlServerName -InstanceName $SqlDevInstanceName $ImageDestination = Get-SqlCloneImageLocation -Path 'E:\SQLCloneImages' $ImageScript = 'e:\Documents\Data Masker(SqlServer)\Masking Sets\redgatedemo.DMSMaskSet' # connect and create new image $NewImage = New-SqlCloneImage -Name $ImageName -SqlServerInstance $SqlServerInstance -DatabaseName DataMaskerDemo -Destination $ImageDestination -Modifications @(New-SqlCloneMask -Path $ImageScript) | Wait-SqlCloneOperation $DevImage = Get-SqlCloneImage -Name $ImageName # Create New Clones for Devs $Devs | ForEach-Object { # note - '{' needs to be on same line as 'foreach' ! $Image | New-SqlClone -Name "DataMasker_Dev_$_" -Location $SqlServerInstance | Wait-SqlCloneOperation }
本文将在该工作的基础上进行扩展,将该解决方案扩展到包括步骤 3,即注入一套精心策划的数据。
创建精心策划的数据集
精心策划的数据集必须包含用于测试我们软件所有已知行为(包括边缘情况)的值。这是一个重要步骤,难以自动化,因为每个数据库都包含自己独特的事务元素集,必须对每个元素进行测试,以确保软件能够正确处理它们。但是,一旦创建了数据集,添加数据以表示新情况的持续维护将是最小的。
在上一篇文章中,作为映像创建过程的一部分,我们使用 Data Masker 为 dbo.dm_Customers
和 dbo.dm_Employees
表生成了一个数据掩码集,用随机化数据替换了任何敏感值。
我们通过使用 New-SqlCloneImage
cmdlet 的 -Modifications
参数来实施掩码,以指定使用数据掩码集。我们将掩码文件提供给 New-SqlCloneMask
cmdlet,后者接收它并生成一个数据修改脚本,该脚本可以在映像创建过程中运行。
清单 2 显示了两行相关的代码。
$ImageScript = 'e:\Documents\Data Masker(SqlServer)\Masking Sets\redgatedemo.DMSMaskSet' # connect and create new image $NewImage = New-SqlCloneImage -Name $ImageName -SqlServerInstance $SqlServerInstance -DatabaseName DataMaskerDemo -Destination $ImageDestination -Modifications @(New-SqlCloneMask -Path $ImageScript) | Wait-SqlCloneOperation
我们将修改代码的这一部分,稍后使用两个脚本文件将精心策划的数据集注入到每个表中。虽然这可以是一个脚本,但在团队环境中,将数据集抽象到单独的文件中更有利于持续维护。每个文件都应手动创建,可能使用生产数据库的信息,但敏感值已被更改,但方式保留了正确的特征。
清单 3 显示了 dm_customer_testdata.sql
文件内容的一个示例,该文件将精心策划的数据添加到 dbo.dm_Customers
,更改了客户姓名、地址和信用卡值等,以生成逼真的值,但与实际人员无关。
/* Test data set for dm_customer Created: 2018-05-03 Last Modified: 2018-05-31 */ INSERT dbo.DM_CUSTOMER (customer_id, customer_firstname, customer_lastname, customer_gender, customer_company_name, customer_street_address, customer_region, customer_country, customer_email, customer_telephone, customer_zipcode, credit_card_type_id, customer_credit_card_number) VALUES ( '9900000', 'Joe', 'Fanatic', 'M', '', '123 My St', 'Colorado', 'USA', 'jfanatic@gmail.redgate', '303-555-1212', '80237', '4', '1234 5678 9012 3456'), ( '9900001', 'Sarah', 'Jones', 'F', 'Acme, Inc', '69958 Elm Ave', 'Virginia', 'USA', 'sarahj@acme.nowhere', '757-555-1234', '23455', '4', '12334 543 23546'), ( '9900002', 'Amanda', 'Smith', 'F', '', '401 W 5th St #234', 'New York', 'USA', 'amanda455@gmail.nowhere', '212-555-4321', '20334', '3', '9876 4322 5747 5555'), ( '9900003', 'Ian', 'Frank', 'M', 'British Stuff', '54 Old Oak Way', 'Cambridgeshire', 'UK', 'ifrank@bs.example', '+44-564-123123', 'CB4 0WZ', '2', '5454 3423 5445 4545')
清单 4 显示了 dm_employee_testdata.sql
脚本文件中的示例内容,该文件使用了一些著名人物的名字(来自公共数据)以及一些生成的值来代表特定情况。
/* Test data set for dm_employee Created: 2018-05-3 Last Modified: 2018-05-31 */ INSERT dbo.DM_EMPLOYEE (person_id, assignment_id, emp_id, first_name, last_name, full_name, birth_date, gender, title, emp_data) VALUES ( 1018, 56, 'MAN1018B', 'Peyton', 'Manning', 'Peyton Manning', '1976-05-01', 'M', 'Mr.', NULL), ( 1007, 98, 'ELW1007D', 'John', 'Elway', 'John Elway', '1968-03-21', 'M', 'Mr.', NULL), ( 1012, 16, 'STA500V', 'Roger', 'Staubach', 'Roger Staubach', '1958-11-09', 'M', 'Mr.', NULL), ( 1014, 23, 'WIL855T', 'Serena', 'Williams', 'Serena Williams', '1984-02-22', 'F', 'Mrs.', NULL),
在任何实时系统中,都会有额外的规则来覆盖其他实体,但为了简单起见,本文仅包含这两个表的(示例)数据。如果需要,可以将此概念扩展到更多对象。
注入精心策划的数据
现在我们有了包含精心策划数据的两个文件,让我们将这些数据注入数据库。SQL Clone 使此操作变得容易,因为除了使用 Data Masker 创建的数据掩码集之外,我们还可以指定一个常规 SQL 文件。
我们使用 New-SqlCloneSqlScript
cmdlet 来创建一个指定文件的对象,如清单 5 所示。我们使用两个变量,每个对象一个。
$EmployeeScript = New-SqlCloneSqlScript -Path 'C:\Users\way0u\Documents\SQL Server Management Studio\Dm_Employee_testdata.sql' $CustomerScript = New-SqlCloneSqlScript -Path 'C:\Users\way0u\Documents\SQL Server Management Studio\Dm_customer_testdata.sql'
然后,我们只需修改 New-SqlCloneImage
行以添加精心策划的数据脚本。将这些对象放在数据掩码脚本之后,以便它们最后执行。
$ImageOperation = New-SqlCloneImage -Name $ImageName -SqlServerInstance $SqlServerInstance -DatabaseName 'DataMaskerDemo' -Destination $ImageDestination -Modifications @($Mask, $EmployeeScript, $CustomerScript)
当我们将其作为自动化的一部分运行时,我们将看到掩码集和 SQL 脚本都作为过程的一部分执行。当我们查询从此脚本创建的任何克隆时,我们将看到包含我们的精心策划的数据集以及其他掩码数据。
结论
然而,在实际运行应用程序的世界中,我们经常发现用户会用我们未在测试和开发环境中使用的其他数据来给我们的系统带来压力。这迫使团队留出“计划外”的维护时间,以在部署后修复 bug 和性能问题。
DevOps 文化中根深蒂固的一个理念是,为了最大限度地减少这种计划外的工作,我们需要确保我们的软件即使在处理边缘情况时也能正确运行,性能足够,并且能够顺畅集成,*作为日常开发的一部分*。这意味着需要能够构建数据库并在尽可能模拟生产环境的条件下进行测试。
本文介绍了一种使用 SQL Provision 按需构建一致、合规、有用的数据库的方法,用于开发和测试环境。通过结合 SQL Server Data Masker 的强大功能来随机化任何敏感数据,以及使用自定义 SQL 脚本来表示一组精心策划的数据,我们确保生成的数据库可用于有效可靠的测试,并且在检查数据时,人类用户也易于使用。