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