jmeter教程(三):接口测试初探

做测试,怎么测试,要测试什么,得有依据。功能测试的依据是需求规格说明书,接口测试的依据,通常有需求规格说明书及接口开发文档。但这些文档,并不是每个公司都有的,有的可能没有接口文档,甚至需求文档都没有,这个时候,就只能与产品、开发沟通来确定接口的逻辑了。

现在假定有个登录的接口,需求是用户名和密码长度都是8-16位,且只能数字或字母组成。如果是比较好的需求文档,所有正常及异常的情况都要有所规范,比如用户登录成功后,程序如何处理,用户名少于8位,要如何提示,有标点符号,要如何提示等等。如果是一般的需求文档,可能就是一句话带过,用户名8-16位,只能数字或字母组成。至于各种提示语,没有规范,那么测试的时候,就可能会出现争执的情况,一个提示语,开发认为可以,可测试认为不够人性化,提出要改,开发就不愿意改,这样就比较纠结了。这里就不去讨论这样的问题了,现在我们用之前博客中构建的web项目写一个接口,接口代码如下:

package king;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String result = "";
		
		if(username == null || password == null){
			writer.write("Bad Request");
			return;
		}
		
		username = username.trim();
		password = password.trim();
		int usernameLength = username.length();
		int passwordLength = password.length();
		
		if(usernameLength == 0){
			result = "用户名不能为空!";
		}else if(usernameLength < 8){
			result = "用户名太短了!";
		}else if(usernameLength > 16){
			result = "用户名太长了!";
		}else if(!username.matches("[0-9a-zA-Z]+")){
			result = "用户名只能由数字或字母组成!";
		}else if(passwordLength == 0){
			result = "密码不能为空!";
		}else if(passwordLength < 8){
			result = "密码太短了!";
		}else if(passwordLength > 16){
			result = "密码太长了!";
		}else if(!password.matches("[0-9a-zA-Z]+")){
			result = "密码只能由数字或字母组成!";
		}else if("qwertyui".equals(username) && "12345678".equals(password)){
			result = "登录成功!";
		}else{
			result = "用户或密码不正确!";
		}
		
		writer.write(result);
		writer.flush();
		writer.close();
	}

}

当然了,这只是一个模拟的接口,没有连接数据库,正确的帐号写死了,只有一个“qwertyui”,密码是“12345678”。实际开发中的接口,肯定不是这样写的。这个模拟的接口中,判断还是比较严谨的。先获取前端传过来的用户名和密码,然后判断一下这两个值,是否为null,如果为null,就响应“Bad Request”,如果是走了这个判断,很明显,是有人在调用接口,恶意攻击。如果都不为null,那就两个值去掉首尾空格,再校验用户名的格式,密码的格式,最后两个分支,本应该是查数据库的,但这个只是模拟的接口,就不去查数据库了。

那么,在接口测试中,开发人员容易犯的错误有哪些呢?首先,参数的null值判断,很多开发不会写,这个在需求中也不会提及。有些需求,在需求文档中不会写,但开发人员也要实现。比如代码里不能有触犯法律的东西,这个在需求文档里,肯定不会提及的,因为这个是共识。程序在接收前端传过来的数据时,需要对null值做处理,这个,可以作为编程的一个规范,规范并不是强制约束,所以肯定就会有人不遵守或是不知道。如果不做null值的处理,那么后面的语句,使用这些参数,就可能会空指针异常。另外一个就是去掉首尾空格,很多开发也不会做,当然,有些系统需求就是不用去掉首尾空格的,这个就另当别论了。

现在我们要开始测试这个接口,开发给出的接口地址:http:localhost:8080/Demo/login,参数为username和password。这个接口地址,是开发在自己的电脑上测试时用的,我们测试时,需要将localhost改成需要测试的环境的地址。这个项目,我部署到了我的linux虚拟机中,假设这个就是测试环境,项目怎么部署到liunx,可以参考前面的博文:eclipse构建web项目。

进入jmeter安装目录下的bin目录,双击jmeter.bat,打开jmeter,界面如图:

右击测试计划——添加——Threads(Users)——线程组

在新添加的线程组上右击,添加——Sampler——HTTP请求

然后,HTTP请求配置页面,输入各个配置项

然后右击线程组,添加——监听器——察看结果树

这样,简单的接口测试脚本就算完成了,按Ctrl+S保存。然后,我们运行一下:

运行之后,我们点察看结果树。

这个就是请求接口的一些信息了。通常,我们并不会太关注这个,我们关注的是响应数据

可以看到响应的数据为:用户名不能为空!,这个正是我们在后台定义的响应数据。这样,我们现在就测试了接口的一种异常情况了,相当于是跑了一条测试用例,用户名和密码都为空的情况。然后点http请求,username的后面输入:abc,保存,运行

查看响应数据

提起:用户名太短了!,可以看到,上一次的运行结果还在,如果不想看到上一次的运行结果的话,可以按工具栏中扫把样的按钮,清除之前的运行的结果。然后,可以依次测试用户名太长、含有标点符号的情况,还有密码的各种情况。当然还有少参数的情况

比如,现在参数只有username,没有password参数,保存,运行,然后查看结果树

响应正确。现在是可以实现接口的测试了,不过,很麻烦,每一种情况,都要到HTTP请求中改一下参数,运行一下,再到结果树中查看结果。能不能一次运行就把所有的可能都测试到呢,肯定是可以的,笨方法:在线程组中加很多HTTP请求,一个HTTP请求就是一种情况。聪明的方法:加一个HTTP请求,然后参数的值,做成参数化。另一个问题就是可不可以让脚本自动判断响应的结果对不对呢?答案是可以的,参数化和响应断言,下篇博文再讲吧。

猜你喜欢

转载自blog.csdn.net/kingzhsh/article/details/84769472
今日推荐