草庐IT

关于数据迁移,测试应该做什么?

测试界的飘柔 2023-06-02 原文

数据迁移的需求背景

公司内部出现业务先合并、新旧系统替换、业务扩大需要进行数据库分表等情况下,就需要涉及到数据迁移。对应的常见的迁移场景有:

1、需要将两个系统的部分数据统一从A数据库读取,a数据库和b数据库通过指定字段进行关联的情况。

2、直接废弃旧的系统,将旧系统的数据迁移到新系统,后续仅维护新系统

本文主要总结分享比较场景的数据迁移场景,业务线合并,2个系统的用户数据进行关联的场景。

测试分析

正式环境用户数据分析

在进行数据正式迁移之前,产品/开发/测试均需要参与对线上已有的用户数据进行分析,分析线上大量用户的数据特征,从而进行归纳分类,对不同的分类数据进行迁移策略设计。

以用户账号为例,可能存在:用户使用手机号注册、用户未使用手机号注册等情况,在进行分析时需要考虑到对这两种的用户数据进行迁移的策略。

假设迁移的目标库存在该用户数据,则根据基础信息以目标库为准,并建立源库和目标库的关联关系;

假设迁移的目标库内不存在该用户数据,则直接将源库的用户信息同步在目标库内进行创建。

数据迁移测试分析

数据迁移目标是什么

在进行数据迁移测试之前,需要了解到对应的迁移策略,了解两个系统的数据如何关联,以及对应的目标数据库和源数据库,通过两个数据库数据创建关联:以源数据库b为基础在目标数据库a中创建关联,且将b中的相同的基础字段数据直接选择性的覆盖填充到目标库a中。

在迁移过程中,关联数据部分基础字段冲突的处理逻辑

若两个数据库相同字段同时存在数据:

选择行覆盖:b内的数据覆盖a内的数据;

选择性丢弃:按照优先级,直接丢弃b内的数据,以a的数据为准(或者丢弃a数据,以b数据为准)。

源数据库和目标数据库的同一个字段的规则差异

除了数据兼容冲突兼容外,还需要考虑数据库兼容,所谓的数据库兼容就是字段的长度、类型等。例如:

1、字段长度限制。

2、字段区分大小写:例如:用户邮箱,在源数据库内支持大小区分,但是在目标库内不支持。

3、字段支持特殊字符:例如用户昵称在目标数据库内不支持特殊字符,但是在源数据库内支持。

4、字段格式不合法:例如手机号格式、邮箱格式。

迁移方案

在评审阶段,与开发产品确认对应的迁移方案:

1、正式迁移时,是否需要停机。

2、评估迁移失败产生的风险以及对应的解决措施。

3、在测试阶段进行迁移:

a)是否允许针对指定的数据进行迁移测试

b)测试期间未停机导致的脏数据如何处理

c)评估迁移失败可能产生的风险,是否可进行数据恢复

4、迁移准备:提前根据测试分析的各个迁移场景,准备对应的“待迁移”数据,数据要尽可能的模拟线上用户真实数据。

迁移验收

数据迁移成功后验收,需要基于业务场景的角度进行数据对应的功能场景验收,必须要覆盖「增」、「删」、「改」、「查」。

【新增】:迁移后往新的数据库内添加数据后,在软件内访问个人中心查看用户信息获取正确。

【查询】:对用户的基本信息进行迁移后,需要在软件内访问个人中心查看用户的信息是否获取成功,是否有异常报错。

【修改】:对用户的基本信息进行修改,修改后数据存储成功,再次访问个人中心可展示最新的用户数据。

【删除】:删除用户数据后,该用户无法访问。

发布留观

由于迁移数据版本发布后,势必会影响到用户的数据,所以在分析阶段对用户可能出现的反馈制定出对应的应答策略,提前进行人员分工。同时关注由于发布后的功能使用情况。

用户反馈

发布后对用户反馈及时响应,快速定位用户的数据出现变更是否由数据迁移引起,以及如何引导用户正常继续使用,提高用户的满意度。

留观数据

重点梳理关于迁移数据涉及到的相关的核心接口数据,在发布后进行定时监测:

1、相关接口调用量:关注数据迁移后,接口的调用量是否暴涨。

2、相关接口错误率:关注数据迁移后,接口的错误率是否异常上涨。

3、相关接口告警率:关注数据迁移后,接口的告警率是否异常上涨。

小案例

以上是个人对于小部分数据迁移测试后的总结反思。一个人必须不停地总结归纳,才能不被茫茫人海淹没~

现在我邀请你进入我们的软件测试学习交流群:746506216】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!

有关关于数据迁移,测试应该做什么?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  10. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

随机推荐