互联网大厂服务端测试流程

2022-09-28 14:58:44 浏览数 (2)

大家好,我是洋子,现在是一名服务端测试开发工程师,今天给大家讲解一下服务端的测试步骤

测试步骤概述

  • 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其实是最先能暴露问题的环节,它要求测试人员需要有一定的代码能力才能发现问题。要想发现代码最深层次的问题,还是得进行白盒测试

0 人点赞