WireMock教程

https://juejin.im/post/5b3a23cd6fb9a024e53ce223

三、Mock的好处

提前创建测试;TDD(测试驱动开发)

这是个最大的好处吧。如果你创建了一个Mock那么你就可以在service接口创建之前写Service Tests了,这样你就能在开发过程中把测试添加到你的自动化测试环境中了。换句话说,模拟使你能够使用测试驱动开发。

团队可以并行工作

这类似于上面的那点;为不存在的代码创建测试。但前面讲的是开发人员编写测试程序,这里说的是测试团队来创建。当还没有任何东西要测的时候测试团队如何来创建测试呢?模拟并针对模拟测试!这意味着当service借口需要测试时,实际上QA团队已经有了一套完整的测试组件;没有出现一个团队等待另一个团队完成的情况。这使得模拟的效益型尤为突出了。

你可以创建一个验证或者演示程序

由于Mocks非常高效,Mocks可以用来创建一个概念证明,作为一个示意图,或者作为一个你正考虑构建项目的演示程序。这为你决定项目接下来是否要进行提供了有力的基础,但最重要的还是提供了实际的设计决策。

为无法访问的资源编写测试

这个好处不属于实际效益的一种,而是作为一个必要时的“救生圈”。有没有遇到这样的情况?当你想要测试一个service接口,但service需要经过防火墙访问,防火墙不能为你打开或者你需要认证才能访问。遇到这样情况时,你可以在你能访问的地方使用MockService替代,这就是一个“救生圈”功能。

Mock 可以分发给用户

在有些情况下,某种原因你需要允许一些外部来源访问你的测试系统,像合作伙伴或者客户。这些原因导致别人也可以访问你的敏感信息,而你或许只是想允许访问部分测试环境。在这种情况下,如何向合作伙伴或者客户提供一个测试系统来开发或者做测试呢?最简单的就是提供一个mock,无论是来自于你的网络或者客户的网络。soapUI mock非常容易配置,他可以运行在soapUI或者作为一个war包发布到你的java服务器里面。

隔离系统

有时,你希望在没有系统其他部分的影响下测试系统单独的一部分。由于其他系统部分会给测试数据造成干扰,影响根据数据收集得到的测试结论。使用mock你可以移除掉除了需要测试部分的系统依赖的模拟。当隔离这些mocks后,mocks就变得非常简单可靠,快速可预见。这为你提供了一个移除了随机行为,有重复模式并且可以监控特殊系统的测试环境。

四、优化

在实际业务代码中,调用某个接口不可能只返回简单的 JSON 字符串。如果将这些字符串写到上文的代码中,当需要修改数据结构时将是一个灾难,因此我们可将返回的数据写入到文件进行维护。

4.1 新建文件

在项目的 src/main/resources 目录下创建名为 user.txt(自定义),内容如下:

{
    "id":1,
    "name":"jack",
    "age":18,
    "birthday":"2018-01-01"
}

4.2 添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

在测试的代码中需要用到上述依赖的 API,如果读者已自定义好读取文件的 API,可以略过该步骤。

4.3 修改代码

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.core.io.ClassPathResource;


public class App {

    public static void main(String[] args) throws IOException {
        // 连接 9999 端口
        configureFor(9999);
        // 删除旧的规则
        removeAllMappings();
        // 添加请求规则和请求响应
        mock("user.txt","/user/1");

    }

    private static void mock(String fileName, String url) throws IOException{
        // 加载文件
        ClassPathResource resource = new ClassPathResource(fileName);
        // 读取内容
        String data = FileUtils.readFileToString(resource.getFile(), "UTF-8");

        stubFor(get(urlPathEqualTo(url))
                .willReturn(aResponse()
                    .withStatus(200)
                    .withBody(data)));
    }
}

执行方法,打开浏览器访问http://127.0.0.1:9999/user/1,效果图如下:

当我们需要为前端模拟新接口时,只需对 mock 方法传入不同参数运行即可。

results for ""

    No results matching ""