VOL 185

moco在接口自动化中的应用_编程

18

2020-12

今天距2021年13天

这是ITester软件测试小栈第185次推文

moco在接口自动化中的应用_编程_02

 

 

 

本文5293字,阅读约需14分钟

 

在上一篇moco系列文章:moco常用配置参数及实战,主要介绍moco常用参数配置及实战小例子。今天主要介绍,moco在接口自动化中如何应用。Moco是一个搭建模拟服务器的工具,其支持 api 和独立运行两种方式。在之前的文章里是通过一个jar包开启服务,模拟一个后台请求服务器的。其实Moco也提供API的用法,且能很好的与Junit和Maven等集成。一

需求背景

 

现在有两个接口:登录和首页。首页接口需在请求头带上登录成功后返回的token进行认证。假设现在登录接口未开发完成或报错,这样我们就不能正常请求首页了。那么问题来了,如何moco登录接口,然后将登录成功的返回值传递给首页接口的请求呢。

 

 

项目架构

 

1项目环境

 

  • JUnit;

  • maven;

  • moco;

  • fastjson;

  • fluent-hc;

 

 

2项目环境搭建

(1) maven项目构建

①打开idea工具,依次选择File-->New-->Project,新建项目。

moco在接口自动化中的应用_编程_03

 

②maven项目,选择java版本,点击Next。

moco在接口自动化中的应用_编程_04

 

③Name和GroupId自定义,点击finish完成maven项目的创建。

moco在接口自动化中的应用_编程_05

 

④创建完成后,项目结构如下:

moco在接口自动化中的应用_编程_06

 

 

(2) 创建包,存放测试用例

 

①java目录右键,依次选择New-->Package。

moco在接口自动化中的应用_编程_07

 

②填写包名,回车。

moco在接口自动化中的应用_编程_08

③选中包右键,依次选择New-->Java Class,新建MockLoginTest类及IndexTest()类。

moco在接口自动化中的应用_编程_09

如下所示:

moco在接口自动化中的应用_编程_10

 

 

(3)  moco配置文件

 

Resources包,右键,新建moco.json文件。

moco在接口自动化中的应用_编程_11

 

到此,基本的架构就算搭建完成了。

 

 

接口实战

 

 

1处理思路

①通过moco框架,moco登录接口,返回成功的响应;

②从登录接口的响应中提取token;

③首页接口在请求头携带token并发送请求。

 

 

2mock登录接口

 

在moco.json文件,mock登录接口,返回值为成功响应值,内容如下:

[
  {
    "description": "登录接口",
    "request": {
      "uri": "/login",
      "method": "post",
      "forms": {
        "username":"vivi",
        "password":"123456"
      }
    },
    "response": {
      "json":{
        "msg":"login success",
        "status":"200",
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NDg5NzgsImVtYWlsIjoidml2aUBxcS5jb20ifQ.a2ExtNVjGrY8T1gefcJTnk4JUOx9NVtCk6lMK8o47co"
      }
    }
  }
]

 

 

3添加依赖在pom.xml中添加如下依赖:
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.5.8</version>
</dependency>
<dependency>
    <groupId>com.github.dreamhead</groupId>
    <artifactId>moco-core</artifactId>
    <version>0.12.0</version>
</dependency>
<dependency>
    <groupId>com.github.dreamhead</groupId>
    <artifactId>moco-junit</artifactId>
    <version>0.12.0</version>
</dependency>
<dependency>
    <groupId>com.github.dreamhead</groupId>
    <artifactId>moco-runner</artifactId>
    <version>0.12.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.38</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.2</version>
</dependency>

 

 

4启动服务

MocoJunitRunner提供了多种方法来运行Moco服务器作为测试规则,它可以在测试之前启动Moco服务器,并在测试后停止。jsonHttpRunner方法可以将JSON配置引用作为HTTP服务器,这里只是介绍基本使用,在后面代码中会有实际应用。

public class MocoJunitJsonHttpRunnerTest {
      @Rule
      public MocoJunitRunner runner = MocoJunitRunner.jsonHttpRunner(8888, Moco.pathResource("foo.json"));
      ...
    }

 

 

5编写登录接口请求编写登录接口请求,并返回token值(登录接口为moco的请求)。MockLoginTest类
package com.vivi.cases;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.fluent.Content;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
import java.io.IOException;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
public class MockLoginTest {
    public String mockLogin() throws IOException {
        //发送post请求
        Content content = Request.Post("http://localhost:8888/login").bodyForm((Form.form()).add("username", "vivi")
                .add("password", "123456").build()).execute().returnContent();
        //将Json字符串转化为对象
        JSONObject jsonObject = JSON.parseObject(String.valueOf(content));
        //获取返回值的token
        String token = (String) jsonObject.get("token");
        String final_token = "Bearer" + " " + token;
        return final_token;
    }
}

 

 

6编写首页接口请求编写首页接口请求,获取登录接口的返回值,并携带token进行请求。IndexTest类
package com.vivi.cases;
import com.github.dreamhead.moco.Moco;
import com.github.dreamhead.moco.junit.MocoJunitRunner;
import org.apache.http.client.fluent.Content;
import org.apache.http.client.fluent.Request;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
public class IndexTest {
    //启动moco服务
    @Rule
    public MocoJunitRunner runner = MocoJunitRunner.jsonHttpRunner(8888, Moco.pathResource("moco.json"));
    private String token;
    //获取token
    @Before
    public void getToken() throws IOException {
        MockLoginTest mockRunnerTest = new MockLoginTest();
        token = mockRunnerTest.mockLogin();
    }
    @Test
    public void indexTest() throws IOException {
        //发送get请求
        Content content = Request.Get("http://localhost:8899/index").addHeader("authorization", token)
                .execute().returnContent();
        assertThat(content.asString(), containsString("welcome"));
    }
    
}
运行之后,通过结果可以看出首页接口带上了token,并请求成功。
GET /index HTTP/1.1
authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InZpdmkiLCJleHAiOjE1ODY4NDg5NzgsImVtYWlsIjoidml2aUBxcS5jb20ifQ.a2ExtNVjGrY8T1gefcJTnk4JUOx9NVtCk6lMK8o47co
content-length: 0
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.8 (Java/11)
Host: localhost:8899
Accept-Encoding: gzip,deflate
17 12月 2020 15:44:06 [pool-1-thread-5] INFO  Response return:
HTTP/1.1 200
Content-Length: 32
Content-Type: application/json; charset=gbk
{"msg":"welcome","status":"200"}
总结:本文主要介绍Moco在实际接口中是如何解决依赖问题。Moco的使用很简单,配置也很方便,能模拟出简单的接口场景。如果接收到请求后需要做一些处理,如需查询数据库、进行运算、或者一些复杂的操作,就无能为力了。因此,是否选用Moco就取决于应用者是否只是需要一个简单的模拟服务器。以上That‘s all更多系列文章敬请期待
ITester软件测试小栈(ID:ITestingA),专注于软件测试技术和宝藏干货分享,每周准时更新原创技术文章,每月不定期赠送技术书籍,第三方转载请注明出处。

moco在接口自动化中的应用_编程_12

moco在接口自动化中的应用_编程_13moco在接口自动化中的应用_编程_14