基于Java+HttpClient+TestNG的接口自动化测试框架(一)-------接口测试模型

  本篇开始,将陆续介绍基于Java+HttpClient+TestNG的接口自动化测试框架。(这里须要阅读的童鞋们有Java的编码知识及HttpClient和TestNG的使用经验。前端

  首先,咱们须要讨论一下,什么是接口测试?为何要作接口测试?以及咱们这个框架解决的问题是什么。数据库

  什么是接口测试?首先须要说明一下什么是接口。按照百度的定义,接口------外部系统与系统之间以及内部各个子系统之间的交互点。这么说有点抽象,简单来讲,若是我要在一个网页中显示一些数据/文字什么的,我须要有数据来源,碰巧这些数据来源是须要通过逻辑计算的,又碰巧这些数据来源不是来自同一个服务器。那么,若是我直接把这些逻辑和请求都写在页面上显然是不合适的。这时,咱们须要去请求一个接口,这个接口就是页面显示和后台服务之间的交互点。接口测试就是测试这个交互点的功能是否正常,我所须要的数据是否按既定的逻辑进行返回。从这个意义上来讲,接口测试很是简单,咱们只须要考虑各类输入条件下,会产生相应的什么结果,是最为简单的黑盒测试!json

  那么为何要作接口测试呢?无他,整体来讲就是成本低,效果好,速度快。后端

  在前端的童鞋尚未完成UI页面以前,传统的测试是不太可能进行的。而接口测试不须要UI界面,直接经过接口去验证后台逻辑。并且,若是有人经过抓包,直接跳过前端的校验,去进入后端的程序。也是一件很危险的事情。所以,接口测试能够尽量早的开展。越早介入测试,发现的问题解决起来的成本是越低的。在传统的测试中,开发没有将完整产品提交给测试时,测试这边是没法工做的。而在如今流行的敏捷开发中,开发能够写完一个接口就进行一轮接口测试的回归,以最小的代价快速保证质量。api

  接口测试性价比很高,不少公司也比较喜欢进行接口测试。那么当咱们作接口测试时,到底须要作哪些方面的工做呢?服务器

  1. 获取需求文档和接口文档 --------> 实际有可能没有,有可能不全。
  2. 经过对需求文档分析出接口的业务逻辑要求以及业务边界 -------->对测试的业务场景进行构建
  3. 经过对接口文档分析出接口的技术指标(接口地址、请求方式、入参、出参)-------->实际测试的以前必须搞清楚要访问接口的信息。
  4. 接口测试用例设计(着重于接口测试数据准备)-------->业务数据的准备尤其重要。
  5. 使用接口测试工具进行接口测试 --------> 可使用Jmeter,Postman等软件,也可使用自动化测试框架
  6. 接口缺陷管理与跟踪 -------->生成测试的log与报告
  7. 接口自动化持续集成 -------->用于Jenkins平台

  在这里,有一个误区,不少人认为会使用接口测试工具就是会接口测试。其实接口测试远远不止是工具的使用,Jmeter也好,Postman也好,这些工具都是咱们在进行接口测试过程当中可以更方便的进行测试,而工具仅仅是工具,真正核心部分仍是接口测试用例设计以及测试思惟。app

  既然已经有了接口测试的软件,也能必定程序上实现接口测试的自动化操做。为何咱们还要费劲周折的去写接口自动化测试框架呢?说实话,我一开始也不是很明白。直到后来,我遇到了这样一个接口,框架

这个接口的访问须要输入一个sign做为参数。而这个sign的获取方式以下:ide

  int A 为当前系统的Unix时间戳。(即1970年1月1日到如今有多少秒),String B为当前用户所对应的secret数据库id(一个32位字符串),String C为当前的appkey(能够经过另一个接口得到),工具

将int A转为16进制,而后变成字符串,与B及C拼接成字符串D,而后对字符串D取MD5的值,做为sign。

  说实话,这个我不知道用Jmeter或者Postman怎么作。尤为是int A每一秒都不同。在这种状况下,本身写个工具来解决,是否是方便不少呢?

       针对一些使用工具进行接口测试的痛点,就说说咱们这个接口自动化测试框架可以解决哪些问题。

  1. 采用数据驱动方式来解决大量功能重复性接口的测试。
  2. 针对返回JSON字符串,采用JSONPath的模式来精准断定JSON的内容。
  3. 能够生成比较直观的报告。

  固然,也能够集成不少小工具。好比上面提到的计算MD5的值。

  先开个头,想一想一个接口的请求及返回是由哪些构成的呢?

  请求的有:url,访问方法,请求头,body,参数等,返回的有json字符串,状态等。

  咱们能够根据接口的访问和返回的内容,作成一个Bean,来记录请求和返回及断定的数据,而这些数据都记录在Excel中。

  如今作成Excel的基础类:

  

package apiTest.bean; 
public class baseBean { private String excelName; private String sheetName;
public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public String getExcelName() { return excelName; } public void setExcelName(String excelName) { this.excelName = excelName; } }

        而后,咱们的api请求及返回继承这个基础类。 

package apiTest.bean; public class apiDataBean extends baseBean { private boolean run; //是否运行
    private String desc; // 接口描述
    private String method;//访问方法
    private String url; //接口访问url //header的状况相对复杂,能够设置公共header,也能够针对个别请求来设定访问的header。
    private String header; private String body;//接口请求时的body
    private boolean contains; //是否对返回的json字符串中做包含断定(针对接口返回内容较多,很差具体制定路径的状况)
    private int status; //返回状态
    private String verify;//断定内容
    private String save; //须要保存的内容
    private String param; //接口发送须要的参数
    private int sleep; //暂停时间
    public boolean isRun() { return run; } public void setRun(boolean run) { this.run = run; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getHeader() { return header; } public void setHeader(String header) { this.header = header; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public boolean isContains() { return contains; } public void setContains(boolean contains) { this.contains = contains; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getVerify() { return verify; } public void setVerify(String verify) { this.verify = verify; } public String getSave() { return save; } public void setSave(String save) { this.save = save; } public String getParam() { return param; } public void setParam(String param) { this.param = param; } public int getSleep() { return sleep; } public void setSleep(int sleep) { this.sleep = sleep; } @Override public String toString() { // TODO Auto-generated method stub
        return String.format("desc:%s,method:%s,url:%s,param:%s", this.desc, this.method, this.url, this.body); } }

 

       好的,这样咱们就对接口及返回数据制做了一个类,这个类就是接口测试的数据模型。

  开篇先写道这里。以后咱们来讨论配置的读取和设定。

相关文章
相关标签/搜索