大家好,我是洋子,现在是一名服务端测试开发工程师,今天给大家讲解一下服务端的测试步骤
测试步骤概述
- code review
- 部署测试环境
- 接口测试
- 白盒测试
code review
通过code review 可以发现5类错误,分别是语法错误,边界行为错误,经验错误,算法错误,部分算法错误
1 语法错误
这类语法错误,如果使用IDE环境,大多就能够直接发现,也有部分语法错误在编译阶段时会通过,而在运行阶段才能发现错误。下面有3个语法错误的例子
1.1 参数少传 (以下函数需要传入2个参数)
代码语言:javascript复制func test(a int,b int)(c int){
return a b
}
test(1) //少传了1个参数
1.2 数组索引越界(以下数组最大索引为2)
代码语言:javascript复制var arr =[3]int{1,2,3}
fmt.Println(arr[3])
1.3 未初始化数组直接使用(引发空指针异常)
代码语言:javascript复制//错误写法:未初始化map直接赋值
var a map[string]string
a["123"]="123"
//正确写法:
var a map[string]string
a= make(map[string]string) //给map初始化
a["123"]="123"
2 边界行为错误
在执行代码过程中,因为边界条件,导致程序崩溃或者超时。比如经典的除0错误,以下代码若b取值为0,那么函数就会抛出异常
代码语言:javascript复制func test(a int, b int)(c int){
c=a/b
return c
}
3 经验错误
通过程序编写的过往经验进行判断错误。
下面的if 语句少了一个=号,变成了赋值语句,这样if判断就永远返回为true了,这样输入非3的任何数字,也无法走到else里面的逻辑了
代码语言:javascript复制func test(a int)(){
if(a=3){
fmt.Println("hello world")
}else{
fmt.Println("come on")
}
}
4 算法错误
指当前设计的功能与预期完全不符合 比如设计一个抽奖的算法,当有1000人进行抽奖时,会触发大奖,但实际上1000人已抽奖时并没有触发大奖,这就与预期完全不符合
5 部分算法错误
指当前设计的功能与预期部分符合,但一些特殊场景下会出现不符合的情况
如以下的加法函数,如果数字a或者b已经超出了int的最大范围,则不会返回预期的结果
代码语言:javascript复制func add(a int,b int)(c int){
return a b
}
部署测试环境
测试环境可以是一台物理机(虚拟机),也可以是一个容器。在一台物理机上分割出许多容器,说到容器,你第一时间可能会想到docker。容器比物理机更节约空间。在互联网大厂,为了充分利用服务器的资源并适配自己公司的环境,目前都有自己的容器化解决方案
在测试环境当中,我们需要安装一些必要的软件,比如mysql,redis,nginx,hhvm等。有了这些软件,我们服务端上的代码才能正常运行和进行请求转发
完成以上步骤后,我们可以利用git 去拉取代码,拉取代码后,需要在测试环境上部署好我们的测试代码,然后就可以开始接口测试和白盒测试了
附上一张git命令速查表
git常用命令
接口测试
到了第三步接口测试,这一步我们可以根据研发提供的接口文档,传入指定的参数到postman当中调用接口,看一下返回值当中的每个字段是否符合预期
postman接口返回值
白盒测试
在白盒测试当中,有三种覆盖率统计方式
- 行覆盖(语句覆盖):度量该代码行是否被测试到,这里要求最低的覆盖率标准
- 判定覆盖(分支覆盖):度量程序当中每个判定的分支被测试到
- 条件覆盖:度量判定中的每个条件的取值至少满足一次
如果接口测试没有问题,这并不以为着服务端测试就结束了,我们通常情况下还会进行白盒测试,特别是针对代码当中的if语句,循环语句。至少要做到判定覆盖或条件覆盖
下面举一个例子 if(m>0 && n>0) 做行覆盖时,只需要执行到这条语句就行;做判定覆盖时,需要覆盖到该"m>0 && n>0" 为true和false 各一次;做条件覆盖时,需要"m>0" 取 true 和false 各一次 ,同时要"n>0" 取 true 和false 各一次。
可见条件覆盖比判定覆盖更加严格。在测试时间允许的情况下,最好能做到条件覆盖
下面再举两个我在实际工作当中的测试的代码示例
例子:嵌套if
代码语言:javascript复制if(!empty($a["white_list"])&&!empty($name)){
$namelist=explode(',',$a["white_list"]);
if(!in_array($name,$namelist)){
echo "not in list";
}
}
可以看到这是两个嵌套if的结构,如果要做到条件覆盖,我们需要设计一共4*2个测试case,即 真真真,真真假,真假真,真假假,假真真,假真假,假假真,假假假
代码语言:javascript复制语句1
if($a=="" && ($b !=0 || $b != 1));
语句2
if($a=="" && ($b !=0 && $b != 1));
我们再看下面这个例子,观察一下两个if的区别,可以看到语句1,在变量A等于"" 的情况下,变量b无论取任何值,$b !=0 || $b != 1
返回的结果都是真。但语句2当中,$b !=0 && $b != 1
,变量b,如果取1或者0为假,取非0和非1的数为真。综上我们可以看出,语句1当中的$b !=0 || $b != 1
无法做到条件限制,如果if的body部分是抛出异常,那么b取任何值,该程序都会抛出异常,这样程序就无法正常执行了
总结
本文对服务端测试4个步骤进行了说明。code review其实是最先能暴露问题的环节,它要求测试人员需要有一定的代码能力才能发现问题。要想发现代码最深层次的问题,还是得进行白盒测试