软件测试

祝衍军

目录

  • 1 软件测试概述
    • 1.1 软件测试概述
    • 1.2 软件缺陷(BUG)
    • 1.3 软件测试职业发展
    • 1.4 软件测试分类
    • 1.5 软件测试流程
    • 1.6 课程思政:秘书也疯狂的故事
  • 2 黑盒测试
    • 2.1 黑盒测试概述
    • 2.2 等价类划分法
    • 2.3 边界值分析法
    • 2.4 决策表法
    • 2.5 正交实验设计法
    • 2.6 场景测试法
    • 2.7 错误推测法
    • 2.8 功能需求分析
    • 2.9 测试用例设计
    • 2.10 课程思政:五笔输入法的故事
  • 3 测试执行
    • 3.1 测试计划
    • 3.2 测试执行BUG记录
  • 4 白盒测试
    • 4.1 白盒测试概述
    • 4.2 程序流程图设计
    • 4.3 白盒测试用例设计
    • 4.4 JUnit单元测试
    • 4.5 课程思政:WPS的故事
  • 5 Web应用软件自动化测试
    • 5.1 Python自动化测试基本框架
    • 5.2 登录页面测试脚本设计
    • 5.3 新增文章页面测试脚本设计
    • 5.4 基于Unitest的登录测试用例集脚本设计
    • 5.5 课程思政:大并发案例阿里云的小故事
  • 6 智能终端APP自动化测试
    • 6.1 企业案例
    • 6.2 Android智能终端设备连接
    • 6.3 Android APP应用自动化测试
    • 6.4 Monkey 压力测试
    • 6.5 课程思政:鸿蒙的故事
  • 7 JMeter性能测试
    • 7.1 性能测试需求分析
    • 7.2 文章新增脚本开发
    • 7.3 文章新增脚本完善
    • 7.4 场景设计与运行结果分析
    • 7.5 课程思政:12306网站的技术进步故事
  • 8 Postman接口测试
    • 8.1 Postman
    • 8.2 企业网站管理内容系统接口测试
  • 9 Loadrunner性能测试(1+x考证高级相关知识点)
    • 9.1 录制回放
    • 9.2 思考时间设置
    • 9.3 检查点设置
    • 9.4 参数化设置
    • 9.5 关联设置
    • 9.6 集合点设置
    • 9.7 场景设计与运行分析
  • 10 省技能大赛
    • 10.1 竞赛系统
    • 10.2 相关知识
  • 11 企业案例
    • 11.1 软件测试公司真实案例
文章新增脚本完善

【任务描述】:任务二只是设计和开发了最基本的文字新增功能测试脚本,如何模拟实际情况下多个用户同时新增文章的场景呢,如用户在操作时会有一个思考时间、每篇文章内容不同等? 

【任务目标】:通过完善文章新增功能的测试脚本,掌握JMeter性能测试工具的思考时间、检查点、参数化、关联、集合点、事务等元件的配置和使用。 

【任务储备】:

1、事务

在性能测试过程中如果希望获得用户一系列操作的响应时间就需要插入事务,所以事务也即是客户要实现的业务,如一次登录、一次筛选条件查询,一次支付等。JMeter中的事务是通过事务控制器实现的,添加事务的操作步骤为:右击“线程组”,选择“添加”→“逻辑控制器”→“事务控制器”。

一个事务下面有多个取样器,事务设置界面包含名称、注释、Generate parent sampleInclude duration of timer and pre-post processors in generated sample4个设置项,具体如下图所示。


名称:可以随意设置,一般取有业务意义的名字

Generate parent sample:如果事务控制器下有多个取样器(HTTP请求),勾选它,那么在察看结果树中不仅可以看到事务控制器,还可以看到每个取样器。

Include duration of timer and pre-post processors in generated sample:设置是否包括定时器、预处理和后期处理延迟的时间。

2、思考时间

思考时间模拟真实用户在操作过程中的等待时间,JMeter是通过定时器的方式来实现。定时器执行优先级高于取样器(如HTTP请求),是在取样器之前执行,而不是之后(无论定时器的位置在取样器前面还是后面);在同一作用域下有多个定时器存在时,每一个定时器都会执行;如果希望定时器仅应用于其中某一个取样器,则必须把定时器加在此取样器节点下;如果希望在取样器执行完之后再等等,可以通过使用取样器下面的测试活动来实现;如果需要每个步骤均延迟,则将定时器放在与请求持平的位置;若只针对一个请求延迟,则将定时器放在该请求子节点中。

1)固定定时器(Constant Timer

固定定时器的延时不会计入单个取样器的响应时间,但是会计入事务控制器的时间添加固定定时器步骤为:右击取样器,选择添加定时器固定定时器”.



(2)高斯随机定时器(Gaussian Random Timer

如果需要让线程在请求前按随机时间停顿,那么可以使用高斯随机定时器,它通过固定延迟偏移来设置一个固定的延迟时间,然后通过偏差来设置浮动范围。添加高斯随机定时器:右击取样器,选择“添加”→“定时器”→“高斯随机定时器”

3、参数化

为了模拟真实的用户场景,在HTTP请求中需要模拟不同的输入数据,这里就需要参数化的过程,将脚本中的某些输入使用参数来替代。JMeter提供了多种参数化的实现方式,常见的有CSV数据文件设置和函数助手两种参数化方法。

1CSV数据文件设置

CSV数据文件设置可以从指定的文件(一般是文本文件)中一行一行地提取文本内容,根据分隔符拆解每一行内容,并把内容与变量名对应上,这些变量就可以供取样器引用。添加CSV数据文件设置操作步骤为:右击线程组,选择“添加”→“配置元件”→“CSV数据文件设置”.



名称:可以随意设置,一般取有业务意义的名字

文件名:引用文件地址,可以是相对路径也可以是绝对路径。相对路径的根节点是JMeter目录下的bin文件夹。

文件编码:读取参数文件用到的编码格式,建议采用UTF-8格式保存参数文件,省去遇见乱码的情况。

变量名称(西文逗号间隔):定义的参数名称,用逗号隔开,将会与参数文件中的参数对应。如果这里的参数个数比参数文件中的参数列多,多余的参数将取不到值;反之,参数文件中部分列将没有参数对应。

忽略首行(只在设置了变量名称后才生效):忽略CSV文件的第一行,仅当变量名称不为空时才使用它,如果变量名称为空,则第一行必须包含标题。

分隔符(用'\t'代替制表符):用来分隔参数文件的分隔符,默认为逗号,也可以用Tab符来分隔,如果参数文件用Tab符分隔,在此应该填写“\t”。

是否允许带引号?:是非选项,如果选择是,那么可以允许拆分完成的参数里面有分隔符出现。

遇到文件结束符再次循环?:是非选项,是,参数文件循环遍历;否,参数文件遍历完成后不循环(JMeter在测试执行过程中每次迭代会从参数文件中新取一行数据,从头遍历到尾)。

遇到文件结束符停止线程?:与“遇到文件结束符再次循环”选项中的False选择一起用:True则停止测试;False否则不停止测试;当“遇到文件结束符再次循环”选择True时,“遇到文件结束符停止线程”选择TrueFalse无任何意义。

线程共享模式:参数文件共享模式,有以下三种:

 所有现场:参数文件对所有线程共享,假设有线程1到线程n(n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行;

 当前线程组:只对当前线程组中的线程共享;假设有线程组A、线程组B, A组内有线程A1到线程An,线程组B内有线程B1到线程Bn。取值情况是:线程A1取到了第1行,线程A2取第2行,B1取值是也取第1行,线程B2取第2行。

 当前线程:仅当前线程获取。假设测试计划内有线程1到线程n(n>1),则线程1取了第1行,线程2也取第1行。

2)函数助手

JMeter函数助手提供了随机数字、随机字符串、CSV文件读取等多种参数化方法,可以点击工具栏上的函数助手对话框或者单击“菜单选项函数助手”对话框,弹出“函数助手”对话框,具体操作如下图所示。

使用函数助手,首先需要从下拉列表中选择一个函数,并为其参数设定值。在函数参数设置表格中,表格的左边一列是函数参数的简要描述,右边一列是供用户填充参数的值,不同函数要求的参数也不同,当测试人员完成以上设置后,单击"生成"按钮,函数助手会自动生成对应的函数变量、本次函数产生的值(相当于预留功能)等信息,且函数变量名称已经自动复制,测试人员只需要将它复制到需要参数化的请求中去。

3Debug Sampler

HTTP请求的请求数据中设置了参数,如图要查看脚本运行时参数取值情况,可以添加Debug Sampler,就可以在察看结果树中就可以看到参数取值情况,添加Debug Sampler操作步骤为:右击“线程组”,选择“添加”→取样器→Debug Sampler

实例1:将任务二中“文章新增”的HTTP请求参数中的具体数据进行参数化。

1)创建“文章新增”HTTP请求中的参数化测试数据文件,具体如下图所示。


2)通过“CSV数据文件设置”参数化方法读取创建的测试数据文件,将变量名称设置成和表头字符一致。

3)将文章新增中的“自定义顺序”字段通过函数助手设置为0-100以内的随机数字。

4)修改“文章新增”HTTP请求,将前面设置的参数(参数格式为:${参数名})替换具体的值。

5)添加Debug Sampler。

6)运行脚本,在察看结果树和系统中查看运行结果。

完整操作视频如下所示。

4、集合点

集合点用以同步虚拟用户,以便恰好在同一时刻执行任务,如企业网站内容管理系统要求10个用户同时登录。JMeter集合点是通过Synchronizing Timer(同步定时器)来实现的,如果要设置某个事务为并发操作,则可以在对应的事务节点下面添加集合点。添加Synchronizing Timer操作步骤为:右击取样器,选择“添加”→“定时器”→“Synchronizing Timer”.

同步定时器可以设置并发用户到达的各种情况,具体设置图如下所示。

名称:可以随意设置,一般取有业务意义的名字

模拟用户组的数量(Number of Simulated Users to Group by:每集合够多少线程(用户)后发送一次测试请求。如果设置为0,等同于设置为线程组中的线程数;确保设置的值不大于它所在线程组包含的线程数,否则一直集结线程而不发出测试请求,直到超时(如果设置了的话)。

超时时间以毫秒为单位(Timeout in milliseconds:超时时间,即多少毫秒后同时释放已集结的线程,发送测试请求;如果设置为0,则表示默认未设置超时时间,如果线程数无法达到模拟用户组的数量,则会无限等待;如果设置大于0,则超过设置的最大值,不再等待,释放已达到的线程进行操作。

小贴士:初次使用同步定时器的时候,会犯一个错误,就是将集合点放在一个事务外层,即放在某一个线程组下方,这就意味着这个同步定时器会对一整个线程组中的所有请求生效。

5、检查点

JMeter脚本中,检查点是通过断言组件来实现的。断言组件通过获取服务器响应数据,然后根据断言规则去匹配这些响应数据,匹配到看不到任何提醒,如果匹配不到则会有提示信息,此时JMeter就会断定这个请求失败,在察看结果树中看到的请求吗就是红色字体。JMeter提供了多种断言方式,但在实际测试过程中响应断言为最常用的断言方式。

(1)响应断言

添加响应断言操作步骤:右击取样器,选择添加”→“断言”→“响应断言”,响应断言提供了多种断言规则来匹配服务器返回的响应数据,具体设置图如下图所示。


名称:可以随意设置,一般取有业务意义的名字

Apply to:表示应用范围,给谁用。

    ü Main sample and sub-samples:匹配范围包括当前的父取样器并覆盖至子取样器。

    ü Main sample only:匹配范围是当前父取样器。

    ü Sub-samples only:仅匹配子取样器。

    ü JMeter Variable Name to use:支持对JMeter变量值进行匹配

响应字段:针对响应数据的不同部分进行匹配。表示从哪里去找需要匹配的基本信息,最常用的是响应文本,响应头(Response Headers)和请求头(Request Headers)。

    ü 响应文本:响应服务器返回的文本内容,HTTP协议排除Header部分。

    ü 响应代码:匹配响应代码,比如HTTP协议返回代码200代表成功。

    ü 响应信息:匹配响应信息,比如处理成功返回成功字样,或者OK字样。

    ü 响应头:匹配响应中的头信息。

    ü 请求头:匹配请求中的头信息。

    ü URL样本:匹配URL链接。

    ü 文档(文本):对文档内容进行匹配。

    ü 忽略状态:若一个请求有多个响应断言,其中第一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言,如果下一个断言成功则还是可以判定请求成功。

    ü 请求数据:匹配请求数据。

模式匹配规则:

    ü 包括:响应内容包括需要匹配的内容即代表响应成功,支持正则表达式。

    ü 匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。

    ü 相等:响应内容要完全等于需要匹配的内容才代表响应成功,大小写敏感,需要匹配的内容是字符串非正则表达式。

    ü 字符串:响应内容包含需要匹配的内容才代表响应成功,大小写敏感,需要匹配的内容是字符串非正则表达式。

    ü 否:相当于取反。如果断言结果为true,勾选后,则最终断言结果为false;如果断言结果为false,勾选后,则最终断言结果为true

    ü 或者:如果有多个模式组合,其中一个模式匹配成功了,断言结果就是成功的。如果不选择或者,必须所有模式匹配成功了,断言结果才成功。

测试模式:填入需要匹配的字符串或者正则表达式,注意要与模式匹配规则搭配好。

自定义失败消息:自定义断言失败时输出的信息。

(2)断言结果

断言和断言结果是成对出现的,是为了检查添加的断言是否验证成功,对于一次请求,如果通过,断言结果中只会打印一行请求的名称;如果失败,则除了请求的名称外,还会打印一行失败的原因(不同类型的断言结果不同),添加断言结果操作步骤为:需要添加监听器-断言结果。

实例2:将任务二中“登录”的HTTP请求添加检查点,判断其是否登录成功。

1)在“登录”节点下添加检查点,根据“登录”请求的返回消息设置检查内容。

2)在线程组“企业网站内容管理系统”下面添加断言结果

3)运行脚本,在察看结果树和断言结果里面察看运行结果。

4)修改请求参数,修改用户名和密码请求数据,使其登录不成功,再次运行,在察看结果树和断言结果里面察看运行结果。

完整操作视频如下所示。

6、关联

当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。JMeter通过后置处理器中的一些元件来处理关联,其中正则表达式提取器是比较常用的元件。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。添加正则表达式提取器操作步骤为:右击取样器,选择添加”→“后置处理器”→“正则表达式提取器”。

正则表达式提取器的配置界面如图8-3-23所示,其主要的配置信息描述如下所示。

要检查的响应字段:针对响应数据的不同部分进行匹配。

    ü 主体:响应数据的主体部分,排除Header部分;HTTP协议返回请求的主体部分就是Body

    ü Bodyunescaped):针对替换了转移码的Body部分。

    ü Body as a Document:返回内容作为一个文档进行匹配。

    ü 信息头:只匹配信息头部分的内容。

    ü Request Headers:匹配请求头部分的内容。

    ü URL:只匹配URL链接。

    ü 响应代码:匹配响应代码,比如HTTP协议返回码200代表成功。

    ü 响应信息:匹配响应信息,比如处理成功返回“成功”字样,或者OK字样。

引用名称:匹配出来的信息通过此名称进行访问,和参数化类似,使用${引用名称}进行访问。

正则表达式:正则表达式提取器使用此串进行信息匹配。

模板:正则表达式可以设置多个模板进行匹配,在此可指定运用哪个模板,模板自动编号,$1$指第一个模板,$2$指第二个模板,依此类推,$0$指全文匹配。

匹配数字(0代表随机):在匹配时往往会出现多个值匹配的情况,如果匹配数为0则代表随机取匹配值;不同模板可能会匹配一组值,那么可以用匹配数字来确定取这一组值中的哪一个;-1代表取所有值,可以与For Each Controller一起使用进行遍历。

缺省值:如果没有匹配到可以指定一个默认值。

提取单个字符串:假如想匹配Web页面的name = "file" value = "readme.txt">部分并提取readme.txt。一个合适的正则表达式是name = "file" value = "(.+?)">;模板为$1$;如引用名称是filename,则在需要引用的地方可以通过${filename}进行引用。

提取多个字符串:假如想匹配Web页面的:name = "file" value = "readme.txt">部分并提取filereadme.txt。一个合适的正则表达式是name = "(.+?)" value = "(.+?)"。这样就会创建两个组,分别用于$1$$2$。模板为$1$$2$;如果引用名称是filename,则变量值将如下:

filenamefilereadme.txt

filename_g0name = "file"value = "readme.txt"

filename_g1file

filename_g2readme.txt

在需要引用的地方可以通过${filename_g1}${filename_g2}进行引用。

小贴士:和参数化一样,要查看正则表达式提取的值是否正确,可以添加Debug Sampler,这样在察看结果树中就可以看到正则表达式的取值。如果需要查看表达式写的是否有问题,可以在查看结果树中选择“RegExp Tester”进行现场调试,在“Regular expression”输入需要调试的正则表达式,然后点击“test”按钮就可以对返回数据进行正则表达式的提取

实例3:将任务二中“文章新增”HTTP请求添加的文章缩略图内容为写死的服务器图片,将其完善为可以提交本地电脑的图片。

1、通过页面操作和Fiddler抓包分析,“文章新增”的HTTP请求添加的文章缩略图是通过AJAX异步提交到服务器,然后保存的时候将服务器图片绑定为对应的文章,在“文章新增”节点前新增一个“图片上传”的HTTP请求。

2、根据Fiddler抓包返回的消息在“图片上传”节点中添加“正则表达式提取器”的后置处理器。

3、在“文章新增”HTTP请求中,将“contentImg”输入项值里面详细的path值改成第2步设置的引用名称

4、运行脚本,在察看结果树和系统里面察看运行结果。

完整操作视频如下所示。


【任务实施】

为任务二添加的脚本只有登录和文章新增2个步骤,与实际操作步骤不符合,且没有考虑用户并发、检查点、每次文章新增内部不一致等问题,完善任务二的脚本。

1、根据系统操作步骤完善脚本,系统操作步骤为:登录点击内容管理菜单点击文章管理(有文章栏目和文章列表2HTTP请求)点击文章新增(打开文章新增页面有文章列表表单请求、所属栏目下拉列表值获取、文章属性下拉列表值获取3HTTP请求)新增文章内容保存。

2、根据实际业务添加事务,文章管理事务包含:文章栏目请求和文章列表;打开文章新增页面包含:新增页面打开有文章列表表单请求、文章所属栏目下拉列表值获取请求、文章属性下拉列表值获取请求;文章新增包含:文件上传、文章新增。

3、在“文章上传”HTTP请求增加思考时间2s,给“文章新增”HTTP请求增加思考时间10s+5s偏差。

4、将“文章上传”HTTP请求数据中的文章标题、关键字、描述、自定义顺序实现参数化实现参数(数据文件使用教材素材“csv参数化数据.csv”),其中文章标题、关键字、描述从csv文件中获取,自定义顺序采用0-100的随机数字。

5、给“文章新增”添加检查点,判断csv文件里面读取的文章标题内容是否在服务器返回的响应文本中,判断“文章新增”操作是否成功。

6、给登录添加集合点(数量10,超时时间5s

完整操作视频如下所示。