51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1080|回复: 0
打印 上一主题 下一主题

[转贴] “事务回滚测试”你知道吗?

[复制链接]
  • TA的每日心情
    擦汗
    前天 09:00
  • 签到天数: 1025 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-8-8 11:11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前些天有个朋友问测试事务的回滚有什么建议,当时结合自己的实际工作经验简单说了一下,之后就开始思量着写点什么作为经验总结和沉淀,于是就有了这篇博文。
      相信你对事务这个概念不会陌生,它是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。我们测试的目的就是为了确保在事务中某个点发生故障时,所有更新都可以回滚到事务开始之前的状态。
      通常事务回滚会以单元测试的方式进行覆盖,那如果不是单元测试,而是功能测试,要如何进行测试呢?在掌握了事务及事务回滚的概念后,我们可以想到,只要事务中最后一个节点发生故障,那事务回滚后,最后一个节点之前所有的更新都会不会成功被更新到数据库中。那么我们只要知道某个事务会依次对哪些表进行操作,并对最后一个表或最后一个表待更新的数据库“动动手脚”,人为的使事务提交失败而回滚,然后在程序执行完后查看这个事务将要操作的表是否有数据更新就可以了。知道怎么“动手脚”?你别告诉我你不知道怎么“动手脚”噢~~咳咳,最简单的就是删表、改表结构,或者从业务逻辑的角度将有效的数据改为无效。
      看到这儿,你是不是对从功能测试角度覆盖事务回滚胸有成竹了,而且觉得它非常的简单?上面说到的是在有多个数据表更新的前提下,用等价类划分方法再一想,那没有多个数据表的更新的事务怎么测试它是否成功回滚呢?以mysql数据库为例,如果这样的事务失败而没有回滚,数据库资源很有可能会被占用一段时间,因为没有程序告诉数据库要收回资源,直到mysql自己回收资源。所以理论上来说,第一次失败后,连续的执行第二次,即使不人为使事务回滚也会导致事务提交失败,因为你要访问的资源已经被占用了。你也可以通过“SHOW PROCESSLIST”来查看是否有有进程长期访问某个数据表或数据行,从之前测试的经验来看,SELECT语句会占用大概一分半钟不释放,这种情况可能不会导致数据库更新不一致或不完整,但是严重影响数据库的性能。之前我接触的开发中就有人以为没有数据更新的事务出现异常不需要回滚,而被测出来有问题。
      说了这么多,总结下来也就两点,一个是多个数据表有更新的事务回滚,另一个是没有多个数据不更新的事务回滚。一般涉及事务回滚测试,算是比较深层次的测试,在一些对业务数据准确度要求比较高的项目中,通常都会需要测试进行事务回滚测试。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-28 15:24 , Processed in 0.082109 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表