devops Mock 及 Mock 工具 Moco 的基本使用

耗子 · 2021年07月08日 · 4523 次阅读

引言

最近在一个偶然的机会了解到了 Mock,看了看对我个人感觉使用场景不多。趁着有时间,在这里总结一下。此文适合有 HTTP 基础的人员观看。

Mock 介绍

那么,什么是 Mock 呢?将 Mock 单独翻译过来为:虚假、虚设。而在软件开发领域,我们也可以将其理解成虚假数据或者模拟数据。

在测试过程中,我们经常会碰到协同模块尚未开发完成的情况,像这种情况一般都需要等待协同模块开发完成才进入测试阶段。而如果使用了 Mock,当接口定义好后,测试人员可以创建一个 Mock,把接口添加到自动化测试环境,提前进行测试。

现在市面上有很多实现了 Mock 的框架,如:Mockito、EasyMock、Mockito、PowerMock、JMockit、Moco 等等。下面随机抽取 Moco 框架进行演示说明,想了解其它 Mock 框架的可以自行了解。

Moco 介绍

Moco 是 ThoughtWorks 的前工程师郑烨使用 Java 进行编写并且开源在了 GitHub,地址

我们进入 Moco 的首页然后进行下载。下载的文件是一个 JAR 包,所以在使用 Moco 前还需要安装部署 JDK 环境。

下载好后我们来看看 Moco 的优点及缺点。

  • Moco 的优点:
    • 支持 http、https、socket;
    • 支持设置 headers、cookies、statuscode
    • 支持 GET、POST、PUT、DELETE 请求
    • 只需 JRE 环境即可运行
    • 支持热更新
    • 支持 json、xml、text、file 数据格式
    • 可以与 JUnit、Maven、Gradle 集成
  • Moco 的缺点:
    • Moco 使用简单,配置方便。但也仅仅只能模拟出一些简单的场景;
    • 如果接收到请求后需要做一些处理,如查询数据库、运算、或者一些复杂的操作,Moco 是不支持的。

说完了优点及缺点,我们来根据 GitHub 的使用说明看看怎么用吧。

Moco 基本使用

首先,我们先创建一个 JSON 文件,moco.json。内容如下:

[
    {
        "description": "这是一个GET请求",
        "request": {
            "uri": "/get"
        },
        "response": {
            "text": "Hello Moco GET URI"
        }
    }
]

我们可以看到有几个关键字,其中 description 表示注释,request 中是请求的方式及请求的参数等,而 response 是返回的数据格式及数据。让我们来启动 Moco。命令如下:

java -jar moco-runner-1.1.0-standalone.jar http -p 8080 -c moco.json

想知道更多 moco 用法可以进链接了解

运行成功后我们使用 Postman 进行一个请求看看效果。

我们可以看到,用 Postman 请求成功了,也返回了 moco.json 文件中 response 中的内容。

除此之外,我们还可以设置请求方式。如:

[
    {
        "description": "无参GET请求",
        "request": {
            "uri": "/get",
            "method": "get"
        },
        "response": {
            "text": "无参GET请求返回"
        }
    },
    {
        "description": "带参GET请求",
        "request": {
            "uri": "/getparam",
            "method": "get",
            "queries": {
                "code": "success",
                "status": "200"
            }
        },
        "response": {
            "text": "带参GET请求返回"
        }
    }
]

这时候。如果我们使用 Post 方式请求就失败了。因为带参的请求中限制了请求方式及参数,只要不是符合下面 URL 的都会报错。


http://127.0.0.1:8080/getparam?code=success&status=200    请求方式必须为GET

除此之外,POST 请求也是可以进行 body 限制的,如限制 forms 的键值对:

[
    {
        "description": "带参数POST请求",
        "request": {
            "uri": "/postparam",
            "method": "post",
            "forms": {
                "code": "success",
                "status": "200"
            }
        },
        "response": {
            "text": "带参POST请求返回",
            "headers": {
                "Content-Type": "text/html;charset=utf-8"
            }
        }
    }
]

除此之外,也可以设置 Headers 返回 JSON 。如:

[
    {
        "description": "带headers信息POST请求",
        "request": {
            "uri": "/post/headers",
            "method": "post",
            "headers": {
                "content-type": "application/json"
            },
            "json": {
                "name": "testing",
                "sex": "23"
            }
        },
        "response": {
            "json": {
                "code": "success",
                "status": "200"
            }
        }
    }
]

除此之外,也可以设置 cookies 等信息。如:


[
    {
        "description": "返回cookies信息的GET请求",
        "request": {
            "uri": "/getcookies",
            "method": "get"
        },
        "response": {
            "cookies": {
                "key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
            },
            "text": "get cookies success"
        }
    },
    {
        "description": "携带cookies信息的GET请求",
        "request": {
            "uri": "/get/with/cookies",
            "method": "get",
            "cookies": {
                "key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
            }
        },
        "response": {
            "text": "the cookies is okay"
        }
    },
    {
        "description": "携带cookies信息的POST请求",
        "request": {
            "uri": "/post/with/cookies",
            "method": "post",
            "cookies": {
                "key": "4d942801-ddcd-4d84-a6fb-9e0703409cd1"
            },
            "json": {
                "name": "testing",
                "age": "24"
            }
        },
        "response": {
            "status": 200,
            "json": {
                "code": "success",
                "status": "200"
            }
        }
    }
]

除了请求之外,moco 还支持重定向。


[
    {
        "description": "绝对路径重定向",
        "request": {
            "uri": "/redirect"
        },
        "redirectTo": "/redirect""
    },
    {
        "description": "相对重定向",
        "request": {
            "uri": "/redirect/top"
        },
        "redirectTo": "/redirect/max"
    },
    {
        "description": "被重定向的请求",
        "request": {
            "uri": "/redirect/max"
        },
        "response": {
            "text": "top == max"
        }
    }
]

支持 file 返回文件。

[
    {
        "request": {
            "uri": "/file"
        },
        "response": {
            "file": "data.json"
        }
    }
]

通过 Java 的 keytools 生成密钥

java -jar moco-runner-1.1.0-standalone.jar http -p 8088 -c moco.json --https tomcat.keystore --cert 123456 --keystore 123456

支持引入多个文件,类似于开发项目时的多个 config 文件,不过启动方式要由-c 改为-g

[
    {
        "context": "/",
        "include": "./json/moco1.json"
    },
    {
        "context": "/",
        "include": "./json/moco2.json"
    }
]

支持正则表达式

[
    {
        "request": {
            "uri": {
                "match": "/gettest/\\w"
            }
        },
        "response": {
            "text": "gettest"
        }
    }
]

支持 template 动态返回

[
    {
        "request": {
            "uri": {
                "match": "/gettest/\\w"
            }
        },
        "response": {
            "text": {
                "template": "${req.method}"
            }
        }
  }
]

除此之外,template 还支持:

"template": "${req.version}"
"template": "${req.method}"
"template": "${req.content}"
"template": "${req.headers['foo']}"
"template": "${req.queries['foo']}"
"template": "${req.forms['foo']}"
"template": "${req.cookies['foo']}"

支持延迟返回,如下 20 秒后返回。

[
    {
        "request": {
            "uri": {
                "match": "/gettest/\\w"
            }
        },
        "response": {
    "latency": {
                "duration": 20,
                "unit": "second"
            },
            "text": {
                "template": "${req.method}"
            }
        }
  }
]

moco 除了本身的功能,moco 也可以和 Junit 单元测试框架进行集成,具体的就不进行说明了,对 moco 有兴趣的可以到 GITHUB 官网进行文档查看。地址

尾巴

mock 及工具 moco 就说到这。有兴趣的可以关注下本人的公众号:测试小哥进阶,TesterHome 会不定时的更新。哈哈~ 对了,最近想建个学习的测试群,有好的资源可以分享、有问题也可以在群里提问、也可以互相监督学习、或者组团参与线下沙龙,各地的小伙伴可以在群里捞人,欢迎软件测试的各位小伙伴的加入!公众号二维码和群二维码会放在评论区~

共收到 0 条回复 时间 点赞
1楼 已删除
2楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册