moco在接口自动化中的应用

VOL 185

18

2020-12

今天距2021年13天

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

点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 08:30准时推送,每月不定期赠送技术书籍

微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信交流群”、“内推群”一起进群打怪。

本文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,新建项目。

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

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

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

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

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

②填写包名,回车。

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

如下所示:

(3)  moco配置文件

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

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

接口实战

1

处理思路

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

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

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

2

mock登录接口

在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),专注于软件测试技术和宝藏干货分享,每周准时更新原创技术文章,每月不定期赠送技术书籍,第三方转载请注明出处。

ITester软件测试小栈

往期内容宠幸

1.Python接口自动化-接口基础(一)


2.Python接口自动化-接口基础(二)


3.Python接口自动化-requests模块之get请求


4.Python接口自动化-requests模块之post请求


5.Python接口自动化之cookie、session应用


6.Python接口自动化之Token详解及应用


7.Python接口自动化之requests请求封装


8.Python接口自动化之pymysql数据库操作


9.Python接口自动化之logging日志


10.Python接口自动化之logging封装及实战

想获取更多最新干货内容

快来星标 置顶 关注我

每周一、三、五 08:30见

<<  滑动查看下一张图片  >>


 后台 回复"资源"取干货

回复"微信群"一起打怪升级

个人微信:Cc2015123

添加请注明来意 :)

真爱四连,BiuBiuBiu~

猜你喜欢

转载自blog.csdn.net/weixin_42485712/article/details/111399395
今日推荐