七分钟教会你如何编写一个合格的测试用例

Posted 测试界的飘柔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七分钟教会你如何编写一个合格的测试用例相关的知识,希望对你有一定的参考价值。

1、测试用例编写依据

测试用例编写应严格根据PRD(产品说明书)

没有PRD应根据与客户的沟通和确认结果编写

开发的技术文档和流程图

2、测试用例的组成元素

【用例编号】测试用例的编号。

【用例等级】测试用例的重要级别,一般核心功能的用例登录即冒烟用例,非核心功能的测试用例但是使用频率高的级别是高,其次是中,使用频率不高功能要求低的级别是低。

【测试模块】一般可以分成功能,性能,安全,兼容,稳定性等。

【测试项目】用例的测试相关的主要功能名称。

【测试点】能够清晰表达测试用例的测试目的和关键测试要素。

【前提条件】需要描述测试所需要处于的外部环境和测试前测试对象及辅助对象所需要处于的状态和配置。需要保证在完成预置条件中所描述的状态和配置以及外部环境后,测试执行的正确性、一致性。

【操作步骤】为了达到测试用例的测试目的,所需要执行的操作;每个操作步骤对应一个预期结果。

【预期结果】针对测试用例的测试目的,测试步骤中操作后对应的预期输出状态。

【实际输出】根据测试用例操作的实际结果。

【结论】测试用例的测试结果,一般分为Pass,Fail,Block(暂时阻塞的功能),N/A(不需要的功能)。

【执行方式】选手动或者自动。

3、测试用例编写规则

1、用例名称要求

(1)包含测试模块和功能点,体现测试要点

(2)不要包括具体操作步骤

(3)简洁明了,一句话能描述出测试点,一般不超出15个字

2、用例重要性要求

(1)高,产品基本的核心功能验证,即关键路径的测试用例,包括最常执行的功能、基本流程的输入(正向流程+正向数据)

(2)中,产品非核心功能验证,包括界面数据有效性校验、默认值、边界值

(3)低,建议执行的测试用例,包括不常执行的功能、异常流程的输入以及异常数据的输入

3、前置条件

测试执行前需准备的相关操作,如测试数据、角色权限,或登入系统某页面等

4、测试步骤要求

(1)用例描述中不允许出现二义性语句

(2)操作和结果是一一对应的,但操作中不要包含结果的检查

(3)用例描述中不允许出现假设性词汇,比如:假如,或许,可能,…的时候等

(4)用例描述中不允许存在连词、介词,比如:而且,和,还(这种情况可以拆分为多个点)

(5)操作步骤描述清晰。如:在什么页面,点击什么链接或按钮;页面入口、链接、按钮名称都要写清楚

5、预期结果要求

(1)结果中只能包含结果,不能有步骤

(2)一个结果有多个检查点时,确保检查点完整

(3)原则上每个用例必需要有预期结果,结果不能为空

(4)结果涉及消息:需明确关键查看内容

(5)结果涉及页面,需明确页面提示结果、数据变化

(6)结果对应不同输入数据有差别时需分别对应描述清晰

(7)结果含需要验证的所有结果输出,如页面检查、存储检查、消息检查等

(8)结果涉及存储:需明确关键值变化、数据库具体的表和关键字字段值变化

4、测试用例设计方法

1、等价类

等价类划分法是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。

例如:

我们要测试一个用户名是否合法,用户名的定义:8位数字组成的字符。
我们可以先划分子集:空用户名,1-7位数字,8位数字,9位或以上数字,非数字。
然后从每个子集选出若干个有代表性的值:
空用户名:“” (无效等价类实例,指对于软件规格说明而言,没有意义的、不合理的输入)
1-7位数字:“234” (无效等价类实例)
8位数字:“00000000” (有效等价类实例,能检验程序是否实现了规格说明中所规定的功能和性能)
9位或以上数字:“1234567890” (无效等价类实例)
非数字:“abc&!!!” (无效等价类实例)

2、边界值

边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。

例如:

假定 X 为整数,10≤X≤100,那么 X 在测试中应该取的边界值为:10,11,99,100。
注:上面只是说边界值,如果是完整的测试,除了边界值外,还需要一个正常值,即12-98之间的任意值。

3、因果图

因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。

4、判定表

判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。

5、正交分解法

从大量的(实验)数据(测试例)中挑选适量的,有代表性的点(例),从而合理地安排实验(测试)的一种科学实验设计方法。

6、错误推测法

基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。

7、场景法

现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成事件流。


资源分享【这份资料必须领取~

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

☀️七分钟教会你手写callapply和bind

前言

面试官:如何改变 this 的指向?以及三者的共同点和不同点

我们:我们可以通过调用函数的 call、apply、bind 来改变 this 的指向。

面试官:来实现其中一个。

我们:…🔥


温习一下

call、apply、bind的异同
  • 共同点:
    • 功能角度:三者都能改变this 指向,且第一个传递的参数都是 this 指向的对象。
    • 传参角度:三者都采用的后续传参的形式。
  • 不同点:
    • 传参方面: call 的传参是单个传递(序列),而 apply 后续传递的参 数是数组形式。而 bind 与call相同。
    • 执行方面: call 和 apply 函数的执行是直接执行的,而 bind 函数会返回一个函数,然后我 们想要调用的时候才会执行。

思考

现在我们知道了这个三者的区别和特性,那么怎么来实现他们呢?

原理

分析: 🔥他们改变的this指向的原理:

  • 其实就是通过在 某个对象上添加这样一个方法,
  • 然后拿到参数,
  • 再去调用这个对象的这个方法(符合this指向调用者。) 。
  • 得到结果后,再在这个对象上删去这个属性方法。
  • 最后返回结果。(想一想,其实很简单是不是)

实现

call
  • 首先 context 为可选参数,如果不传的话默认上下文为 window ;
  • 接下来给 context 创建一个 fn 属性,并将值设置为需要调用的函数;
  • 因为 call 可以传入多个参数作为调用函数的参数,所以需要将参数剥离出来;
  • 然后调用函数并将对象上的函数删除。
// this 为调用的函数
// context 是参数对象
Function.prototype._Call = function (context) 
    // 判断调用者是否为函数
    if (typeof this !== 'function') 
        throw new TypeError('Error')
    
    // 不传参默认为 window
    context = context || window
    // 新增 fn 属性,将值设置为需要调用的函数
    context.fn = this
    // 将 arguments 转化为数组将 call 的传参提取出来 [...arguments]
    const args = Array.from(arguments).slice(1)
    // 传参调用函数
    const result = context.fn(...args)
    // 删除函数
    delete context.fn
    // 返回执行结果
    return result;

// 普通函数
function test(age) 
    console.log(this.name + " " + age);

// 自定义对象
var obj = 
    name: 'PJ'

// 调用函数的 _Call 方法
test._Call(obj, 22)
apply
  • 首先 context 为可选参数,
  • 如果不传的话默认上下文为 window 接下来给 context 创建一个 fn 属性,并将值设置为需要调用的函数
  • 因为 apply 传参是数组传参,所以取得数组,将其剥离为顺序参数进行函数调用
  • 然后调用函数并将对象上的函数删除
// 手写一个 apply 方法
Function.prototype._Apply = function (context) 
    // 判断调用者是否为函数
    if (typeof this !== 'function') 
        throw new TypeError('Error')
    
    // 不传参默认为 window
    context = context || window
    // 新增 fn 属性,将值设置为需要调用的函数
    context.fn = this
    // 返回执行结果
    let result;
    // 判断是否有参数传入
    if (arguments[1]) 
        result = context.fn(...arguments[1])
     else 
        result = context.fn()
    
    // 删除函数
    delete context.fn
    // 返回执行结果
    return result;

// 普通函数
function test(age, age2, age3) 
    console.log(this.name + " " + age + " " + age2 + " " + age3);

// 自定义对象
var obj = 
    name: 'PJ'

// 调用函数的 call 方法
test._Apply(obj, [18, 22, 39])
bind
  • 判断调用者是否为函数。
  • 截取参数,注意:这里有两种形式传参。
  • 返回一个函数,判断外部哪种方式调用了该函数(new | 直接调用)
// 手写一个 bind 函数
Function.prototype._bind = function (context) 
    // 判断调用者是否为函数
    if (typeof this !== 'function') 
        throw new TypeError('Error')
    
    // 截取传递的参数
    const args = Array.from(arguments).slice(1)
    // _this 指向调用的函数
    const _this = this;
    // 返回一个函数
    return function F() 
        // 因为返回了一个函数,我们可以 new F(),所以需要判断
        // 对于 new 的情况来说,不会被任何方式改变 this
        if (this instanceof F) 
            return new _this(...args, ...arguments)
         else 
            return _this.apply(context, args.concat(...arguments))
        
    

// 普通函数
function test() 
    // new 的方式调用 bind 参数输出换做 [...arguments]
    console.log(this.name);

// 自定义对象
var obj = 
    name: 'PJ'

// 调用函数的 call 方法
let F = test._bind(obj, 1, 2, 3);
F();
// 返回对象
let obj1 = new F();



总结:其实只要知道原理思路了,手写一下call和apply是不是很简单。bind只要注意一下new的情况就好啦

以上是关于七分钟教会你如何编写一个合格的测试用例的主要内容,如果未能解决你的问题,请参考以下文章

如何编写测试用例

测试用例——从认识到编写

测试用例——从认识到编写

如何编写测试用例?

面试——测试用例设计

python UI自动化实战记录七:页面2用例编写