浅谈并发性模型的测试策略

目前市面上的不少软件都会用到多方登录或者编辑的并发性问题,针对并发性问题有若干种方法,主要有以下几种:

  • 保守方式:这种并发性模型在数据上加了锁。如果一个用户已经打开了一条记录,那么在允许编辑的环境中,系统就会拒绝来自其他用户的读取数据请求。适用于出现一个以上用户同时编辑相同数据的情况。(缺点:当一个用户已经打开某个数据时,其他用户就不能访问它了,这样导致了系统在使用上有些不方便。由于系统需要管理这些记录锁,所以模型在实现上也会有一定的复杂度。)
  • 开放方式:总是允许用户读取数据,甚至还可能允许更新数据。但是用户试图保存数据时,系统会检查自从这个用户检索数据以后是否有其他人更新过数据。如果有,那么更新就失败了。适用于不太可能出现多人同时修改同一数据的情况。(缺点:使用不便,用户花费了大量时间来更新一条数据却发现根本不能保存。此时必须要重新检索记录并重新完成修改。)
  • 没有并发保护:胜利属于最后一个用户。这种方法并不对多个用户编辑湘潭的数据提供保护。(缺点:第一个用户的修改结果将会丢失,此外,当两个用户试图同时保存数据时,这种方法可能会导致数据损坏。)

对于不同的并发性模型,测试过程中应该关注的要点:

  • 保守方式:主要关心的是验证能否正确地取得、释放加在记录上的锁,并且能正确处理应用程序中所有可能更新这条记录的部分。这里主要关心的是以下三个方面:

1)  锁的获得。关键是系统必须把锁正确地分配给第一个请求的用户。获得锁的操作是可以测试的:让两个用户试图同时进入编辑状态,或者使用脚本来产生比如1000个或者更多的编辑数据请求,这些请求是几乎同时的,以此来验证只有一个请求获得成功。

2)  锁的效用。如果一个用户获得了锁,那么系统必须保证其他任何用户不能用任何方法修改这个数据,其中包括对数据的更新和删除。具体的验证方法是:让一个用户打开一条记录(进入编辑模式并且保持这个状态),同时其他用户在应用程序的所有地方试图编辑、删除或者以其他方式更新数据。系统应该拒绝所有其他用户更新数据的企图。

3)  锁的释放。测试人员必须验证:当编辑数据的用户释放了这条记录以后(无论是更新完毕还是取消操作),系统能够成功地让其他用户使用这条记录。释放锁需要注意的一个重要方面是错误处理,也就是持有锁的用户遇到错误(如客户端系统崩溃了)的情况下,系统应该完成什么样的操作。锁是否就失去了控制(处于无法释放的状态)?系统从释放锁的故障中重新恢复的能力需要重点考虑。

  • 开放方式。更新是唯一需要关注的要点。测试开放的并发性的最佳方式是综合使用手动和自动测试技术。

1)  在手动的方法中,两个测试人员编辑数据,然后试图同时保存数据。第一个用户更新操作应该是成功的,但是第二个用户应该得到一条消息,其内容是另一个人已经更新了数据,此时,他需要重新装载数据并且重新完成修改操作。

2)  除了手动测试以外,还应该使用自动和海量的测试方法。为了保证开放的加锁机制能够使得同一时刻只有一个用户更新了记录,我们可以利用脚本发起成百上千的、几乎同时发生的更新请求进行测试。其余的用户都应该收到错误消息,消息内容类似于:因为另一个用户已经更新了记录,所以记录不能保存。

3) 与保守并发模型一样,测试人员必须保证对所有可能修改数据的地方,开放的并发性得到验证。其中包括来自用户界面的不同部分的记录操作。

  • 没有并发控制。最简单的也是最容易出错的方法是系统不具备任何并发性控制。测试这样的系统和测试开放的并发模型非常相似,区别只是:无论更新请求的顺序如何,所有用户都应该成功完成更新操作。在这里也应该综合使用手动和自动测试技术,但是在没有并发控制的情况下,应该关注的是数据的完整性。测试人员还应该验证是否正确地处理了更新错误,例如:当一个用户试图更新某条记录时,它却被删除了。

原文地址:https://www.cnblogs.com/CarolSpace/p/9753635.html

时间: 2024-09-29 01:24:17

浅谈并发性模型的测试策略的相关文章

浅谈CSS盒子模型

[摘要]盒子模型是CSS中的一个重要概念,虽然CSS中没有盒子这个单独的属性对象,但它却是CSS中无处不在的一个重要组成部分.掌握盒子模型的原理和使用方法可以极大地丰富HTML元素的表现效果,同时对于整个HTML文档的布局也会产生很大的帮助和促进.本文尝试在介绍CSS盒子模型基本概念和组成元素属性的基础上,结合个人学习经验对其在网页制作中的实际应用谈一谈自己浅显的观点和看法.[关键词]盒子模型:表现效果:网页布局: CSS是Cascading Style Sheets的缩写,中文意思是层叠样式表

浅谈Java内存模型

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自己也要好好的去理解,去消化.今天我也来班门弄斧,说下Java内存模型. 说到Java内存模型,不得不说到 计算机硬件方面的知识. 计算机硬件体系 我们都知道CPU 和 内存是计算机中比较核心的两个东西,它们之间会频繁的交互,随着CPU发展越来越快,内存的读写的速度远远不如CPU的处理速度,所以CPU

Java NIO1:浅谈I/O模型

一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多.以下是我个人的理解: 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行: 异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待. 这就是同步和异步.举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直

浅谈css盒模型

在我们网页上的每一个元素,一个按钮,一段文本,一张图片等等,浏览器都将它们当做一个“盒子”看待,并把这样的盒子称为盒模型(box model).使用Chrome的右键>审查元素对某个网页上的元素,就可得到类似这样一张图,这就是盒模型的缩影了. 组成盒模型主要是这几个要素:外边的外边距margin.中间的边框border.里边的内边距padding,再往里就是包围元素实体的宽.高.在padding这个块里面,包括实体元素的宽高,就是背景background横行的地方,一般我们所添加的背景图片.背景

浅谈生产者消费者模型与读写者模型的区别

多线程编程在操作系统中是十分重要的. 而在线程中处理同步与互斥问题又是至关重要的.生产者-消费者模型,(也称有限缓冲问题)是一个多线程同步问题的经典例子.下来我们对其进行简单分析. 生产者-->生成一定量的数据放到缓冲区中,然后重复此过程: 消费者-->在缓冲区消耗这些数据. 而生产者-消费者之间存在三种关系,即 生产者与生产者之间是互斥关系: 消费者与消费者之间是互斥关系: 生产者与消费者之间是同步与互斥关系. 下面的程序演示了一个生产者-消费者的例子,生产者生产一个结构体串在链表的表头上,

[JS学习笔记]浅谈Javascript事件模型

DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持 lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持taget属性,使用e.srcElement代替] e.srcElement:直接触发事件的元素[FF不支持srcElement属性,使用e.target代替] e.currentTarget:被间接触发的元素[IE8及以下不支持currentTarget属性,使用this代替] this:同e.current

浅谈并发和并行的区别

我们就拿电脑的cpu举例吧,我想大家都不陌生吧^-^ 单处理器(cpu)仅支持并发,即运行多个程序的时候并不是一起执行的,中间存在“时间切点”,单对多 双处理器(cpu)同时支持并发和并行,每个线程各自执行自己的程序,多对多 原文地址:https://www.cnblogs.com/xiuxiu1105/p/9917803.html

浅谈双亲委派模型

类加载器:根据指定全限定名称将class文件加载到JVM内存,转为Class对象. 站在JVM的角度来看,只存在两种类加载器: 1.启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-Xbootclasspath参数指定的路径中的类库加载到内存中. 2.其他类加载器:由Java语言实现,继承自抽象类ClassLoader.如: 一.扩展类加载器(Extension ClassLoader):负责加

浅谈MapReduce编程模型

以Wordcount程序为例,简单描述MapReduce程序的编程模型. MapReduce程序组成 MapReduce程序一般分成三个部分: 一个程序主引导部分: 一个Map程序部分: 一个Reduce部分. 主引导部分用来设置MapReduce(以下简称 “ MR” )程序的一些非业务逻辑属性,例如最终生成jar包时指定MR框架执行该程序的入口.MR程序的map和reduce部分是哪个(一个jar包中可能封装了多个程序).map和reduce部分的输出参数类型.输入数据的来源(路径)和输出数