首页 > 其他分享 >浅谈测试

浅谈测试

时间:2023-01-22 16:22:39浏览次数:49  
标签:浅谈 性能 接口 参数 测试 我们 输入

浅谈测试

本篇文章将会讲讲个人对测试的理解,以及测试所需要的知识体系,我会从不同角度来分析我们作为测试,所需要掌握的基本技能以及扩展技能。

  1. 首先,说说测试的职责吧。这个大家都知道,我也简单的在这里说两句
    • 保证产品质量
    • 产品发布之前,尽可能发现多的bug,消除产品发布后的隐患问题
  2. 随着时代的进步,技能的增长。上文提到的两个职责,我们会一层一层剖析。关于产品质量,我们如何保证呢?以及我们在测试的同时如何提升质量和效益呢?

我们会先通过常用的测试手段来保证产品开发质量:功能测试、接口测试、安全测试、性能测试、自动化测试

测试技术

功能测试

功能测试顾名思义就是针对开发出来的功能做校验,能够满足用户正常使用该功能。这方面的测试其实我们只要关注以下点足以:

  1. 功能本身实现与否
  2. 参数校验(各种表单)
  3. 逻辑梳理
  4. 其实还有一些兼容性,美观性,易用性方面的内容

我们再来说说关于验证,我们到底验证的是什么?

最常见的就是表单,在前端的表现形式就是form:

<html lang="en"><head>
    <title>document</title></head><body><form>
    <p>账号:<input type="text" name="loginid"></p>
    <p>密码:<input type="password" name="loginpwd"></p>
    <!--下面的按钮都是提交按钮-->
    <p><input type="submit" value="提交1"></p>
    <p><button type="submit">提交2</button></p>
    <p><input type="image" src="http://i.imgur.com/d6lbol2.png"></p></form></body></html>

在我们测试角度看来就是一个普通的登录界面又或者是注册信息的页面

在后端开发的角度来说就是:输入的参数

func post(engine *gin.Engine) {
	engine.POST("/student", func(ctx *gin.Context) {
		name := ctx.PostForm("name")
		addr := ctx.DefaultPostForm("addr", "China") //如果没传addr参数,则默认为China
		ctx.String(http.StatusOK, name+" live in "+addr)
	})
}

由此可见,数据的传输方式为:用户输入信息----》前端-----》后端

我们浏览器上输入的信息,其实都是靠前端进行验证,比如每个输入框的展现形式(下拉、输入、选择框等等)又或者是输入框的字符长度限制以及默认长度限制,这些都是靠前端控制。前端校验完毕后把用户的数据整理一下传给后端,后端对这些数据进行逻辑处理,比如进行计数操作、排名操作、存入数据库操作等等。简称curd(增删改查)

接口测试

通过上文提到的,我们用户的数据是经过前端的校验再到后端,而接口测试,我们的关注点变成了只针对后端接口。个人的看法其实就是没有页面的功能测试。

数据的传输方式为:用户输入信息-----》后端

传输方式变为用户--》后端,那就说明少了前端的校验,但是这些校验并不代表不需要了,只不过责任都交给了后端。所以我们关注的地方依然有很多:

  1. 请求方式

  2. 数据传输的格式,比如form-data、xml、json、文件图片流等等

  3. 数据类型,比如string、int、time等等类型

  4. 返回信息,比如状态码、具体返回内容

以上四点说明了我们代替了前端的功能,负责和后端进行联调,但是呢。我们测试需要关注的依然是对以上这些可以输入的地方不断的做异常测试,比如输入一个错误的数据类型,错误的请求方式,检查返回的状态码以及信息是否正确等等

接下来我们就进行实战:

我们先看接口文档内容

从这段接口文档中,我们能得知的信息有哪些呢?

  1. 请求方式为GET
  2. 该接口使用了restful风格(restful风格的意思是路径目录也可以作为参数传递)
  3. params参数为style,其他参数作为路径拼接
  4. 所有参数类型为string类型
  5. style这个参数是非必填项,可不传,默认显示title

以上是返回内容,有图可以知道如下信息:

  1. 返回的类型都为string类型
  2. 返回的格式为字符串(并非json)

我们知道了请求方式和响应内容,就可以开展接口测试了

  1. 正向测试,输入正确的url、请求方式以及参数

检查返回状态码,响应内容是否正确完整

  1. 异常测试----输入错误的请求方式,正确的url以及参数

检查响应状态码和响应结果

  1. 异常测试---输入错误的请求参数,参数类型为string,比如输入浮点型或者布尔值

解释说明: 如果是提供给的三方openapi,输入参数为json格式,此处返回结果应为:请输入正确的参数类型

• 关键字参数、参数为空、多、少参数、错误参数

• 覆盖所有的必选参数,组合可选参数,参数有、无或为null,参数的顺序、个数、类型,

• 参数类型数值大小、输入的数值的范围,参数字串长短,参数包含特殊字符。

  1. 异常测试---输入错误的路径

检查返回提示是否正确,错误路径无法访问该接口信息

以上是接口测试需要关注的内容,关于接口方面,读者想要了解更多关于http方面的知识,可以阅读下篇文章:https://www.cnblogs.com/dykstudy/p/17050813.html

性能测试

说到性能测试,其实需要掌握的知识需要很多,可以说是一个大方向了,这里先简单介绍一下性能所需要关注的知识点

Linux

Linux是我们项目工程部署最常用的操作系统,我们需要熟悉他的特性,以及有哪些优势,最常见的优势就是性能方面,对资源的利用率比我们日常工作的windows、mac操作系统要高很多,也便捷很多,这里不多做阐述

为什么在性能测试这块要熟悉Linux呢?

  1. 性能测试最常关注的四点: CPU、磁盘、内存、带宽 ,在性能测试中,评估这些资源能带动多少的并发量
  2. Linux命令以及常用测试工具。 我们需要通过各种查看系统指标分析是否满足当前项目性能测试的要求,所以就需要用到各种查看资源的命令,比如ps、free、top、dump等第三方工具
  3. 部署监控工具。 为了更好的分析资源情况,通常都会部署监控,最常见的监控nmon、zabbix、prometheus等。
  4. 部署项目环境。 通常测试环境和生产环境是1比4的资源占比,作为测试,个人觉得部署项目的能力是非常有必要的,不管是平时练习也好又或者是企业里做性能测试,测试环境是必不可少的

以上是开展性能测试针对Linux部分所需要掌握的基础技能。如果想要更深层次的接触性能这方面的知识,比如如何调优,就需要了解每个组件、每个工具的性能以及特性了。比如nginx多路复用、cdn域名分发、iptables和ipvs效率上的差异、集群以及分布式。

工具

性能测试中常用的工具有Jmeter、loadrunner、以及阿里云的pts。后面两个工具都需要付费,所以Jmeter平时需要多了解一些,这些工具上的差异不做过多说明,一分价钱一分货吧。

流程

我们开展性能测试,其目的就是为了找出瓶颈点,不断的优化,从而满足产品的需求。任何地方都有可能成为瓶颈点

通过上图可以看到一个完整的企业项目用到的组件,其中每个组件都有可能成为瓶颈,我们测试人员要发现瓶颈其实不是很容易,这就需要同事之间的相互配合了,术业有专攻,在测试的角度需要关注哪些内容呢?这里我会详细展开说明

  1. 网络IO,用户出入口带宽以及服务器出入口带宽,以及各个组件的网络传输速度。这个测试人员需要关注在压测的情况下,网络IO应满足压测需求提升带宽
  2. 磁盘IO,所谓磁盘IO顾名思义,就是磁盘的读写速度。我们可以通过一些监控工具或者Linux命令检查磁盘IO是否存在瓶颈
  3. cpu, 一般压测中,产品要求cpu不能高达70-80%
  4. 内存,一般压测中,产品要求内存不能高达70-80%且不能出现oom
  5. 数据库,一般来说数据库查询不得查过200ms,如果不满足根据项目进行调优
  6. 接口返回时间,一般为2 5 原则,接口返回速度保持在2秒以内,如果到了5秒,客户基本会放弃这个产品

性能测试原理与方法篇.xmind

此处提供一篇性能测试详解的思维导图,有兴趣的读者可观阅

总结

其实不管是什么测试,其目的都是检查代码的规范性和完整性,测试过程中其实就是为了检查开发编码时,考虑的场景是否充分,覆盖率是否全面,比如上图的接口测试中,请求方式错误(要求GET请求的接口,使用POST方式请求)返回提示,在代码中就是拦截检查器

又或者性能测试中发生OOM,可能就是代码出现死循环,又或者是资源无限创建,资源未回收或者资源回收不及时就会出现OOM,比如下段代码:

import java.util.ArrayList;
import java.util.List;
public class HeapOom {
   public static void main(String[] args) {
       List<byte[]> list =new ArrayList<byte[]>();
       int i = 0;
       boolean flag = true;
        while(flag){
           try{
               i++;
               list.add(new byte[1024* 1024]);//每次增加一个1M大小的数组对象
               Thread.sleep(1000);
           }catch(Throwable e){
               e.printStackTrace();
               flag = false;
               System.out.println("count="+i);//记录运行的次数
           }
       }
   }
}

安全测试中其实也会出现类似这种,比如SQL注入, 代码使用原生SQL,路径拼接'or 1=1 也会出现泄库的情况。

在揭开神秘的代码面纱后,我们测试的目的就显而易见了,就是测试过程中会逐渐完善代码的健壮性,完整性,规范性。

最后呢,个人建议,作为一个合格的测试,除了增加项目的业务能力,更应该多接触一些跟开发、运维息息相关的技术,比如监控、CICD、开发一些测试工具。项目的健壮程度离不开这些基础的技术。学习路线推荐:测试-----》测试开发-----》运维-----》安全----》架构师

标签:浅谈,性能,接口,参数,测试,我们,输入
From: https://www.cnblogs.com/dykstudy/p/17064487.html

相关文章