mock技术

目录

1.moco:

Stub(桩)实现:

moco.json文件内容: 

 启动moco服务命令: 

根据规则1访问:

 根据规则2访问:

2.wiremock:

1.pom依赖

 2.stubbing

3.proxying

3.bmp:browsermob-proxy(可利用har文件自动生成测试用例)

1.embedded mode(嵌入式,适合自己开发工具使用)

        pom依赖

1.embedded模式下自动生成har文件,并生成测试用例的实现

2.proxy功能实现 透明代理

2.standalone(作为独立进程运行,自动抓包使用)

1.下载zip包

 2.解压

3.启动服务:browsermob-proxy -port 9000(此端口只是bmp服务的端口,非监听端口)

 4.执行下列命令时会生成代理服务监听的端口8081.

 5.新建har文件

 6.实际请求各接口

 7.请求操作完毕后访问:http://127.0.0.1:9000/proxy/8081/har


常用mock工具:charles,fiddler,moco,wiremock,browsermod-proxy,mitmproxy.

1.moco:

        GitHub - dreamhead/moco: Easy Setup Stub Server

Stub(桩)实现:

moco.json文件内容: 

[
  {
    "response" :
      {
        "text" : "Hello, Moco"
      }
  },

 {
   "request":
	{
	"uri" : "/foo"
          },
   "response":
         {
	 "text" : "chuntian_tester的测试!" 
            }
 }
]

 启动moco服务命令: 

         java -jar .\moco-runner-1.2.0-standalone.jar http -p 12306 -c .\moco.json

根据规则1访问:

 根据规则2访问:

 _____________________________________________________________________________

2.wiremock:

        https://github.com/wiremock/wiremock-->Getting Started - WireMock

1.pom依赖

        <dependency>
            <groupId>com.github.tomakehurst</groupId>
            <artifactId>wiremock-jre8</artifactId>
            <version>2.31.0</version>
            <scope>test</scope>
        </dependency>

 2.stubbing

package ServiceTest;

import com.github.tomakehurst.wiremock.WireMockServer;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;

public class StubTest {

    private static WireMockServer wireMockServer;

    @BeforeAll
    static void beforeAll() {
        //beforeall中先启动wiremockserver,服务占用8089端口
        wireMockServer = new WireMockServer(wireMockConfig().port(8089));
        //启动服务
        wireMockServer.start();
        //配置端口,上面已配置,此处可省略......(此处可有可无)
        configureFor("localhost", 8089);
    }


    @Test
    void stub() throws InterruptedException {
        //stubFor这个API:需要一个stub服务,发送请求时如果url中匹配到包含"/user/d",则给我返回我下面特定的内容,
        stubFor(get(urlEqualTo("/user/d"))
//                .withHeader("Accept", equalTo("text/xml"))
                //返回特定的aResponse().
                .willReturn(aResponse()
                        .withStatus(200)
                        .withHeader("Content-Type", "text/xml")
                        .withBody("<response>d info</response>")));

        //todo: use
        Thread.sleep(300000);
    }
}

运行用例stub,会启动wiremock服务

浏览器访问该服务,匹配到规则时就能返回想要的内容.

 curl命令发起网络请求:也会返回response 

 可返回多个数据设置:

 服务开启后的前10s内访问返回:"mock on stub"

  服务开启后的前10s内访问返回:"exception"

3.proxying

    代码实现:

//代理服务
public class StubTest {
    private static WireMockServer wireMockServer;
    @BeforeAll
    static void beforeAll() {
        //beforeall中先启动wiremockserver,服务占用8089端口
        wireMockServer = new WireMockServer(wireMockConfig().port(8089));
        //启动服务
        wireMockServer.start();
        //配置端口,上面已配置,此处可省略......(此处可有可无)
        configureFor("localhost", 8089);
    }

    //设置代理服务,类似charles中的map_remote技术.BeforeAll中的服务启动起来后会占用8089端口,任何访问这个端口的请求都会被代理到另一个地址.
    @Test
    void proxy() throws InterruptedException {
        stubFor(
                //请求任何地址都会代理到proxiedFrom中的地址.
                get(urlMatching(".*"))
                        .atPriority(10)
                        .willReturn(aResponse().proxiedFrom("https://www.baidu.com")));
        Thread.sleep(100000);
    }
}

 启动服务后访问服务所在主机的8089端口,被代理到了百度

_____________________________________________________________________________

3.bmp:browsermob-proxy(可利用har文件自动生成测试用例)

        类似python的mitmproxy.

GitHub - lightbody/browsermob-proxy: A free utility to help web developers watch and manipulate network traffic from their AJAX applications.

1.embedded mode(嵌入式,适合自己开发工具使用)

        pom依赖

  <dependency>
        <groupId>net.lightbody.bmp</groupId>
        <artifactId>browsermob-core</artifactId>
        <version>2.1.5</version>
        <scope>test</scope>
    </dependency>

1.embedded模式下自动生成har文件,并生成测试用例的实现

public class mockBmpOnProxyTest {


    private BrowserMobProxy proxy;

    @BeforeAll
    void beforeall(){
        //代理服务的初始化
        //根据官方文档介绍引用官方代码
        BrowserMobProxy proxy = new BrowserMobProxyServer();
        //bmp 服务开启监听8083端口
        proxy.start(8083);
    }

    @BeforeEach
    void beforeeach(){
        //每条用例操作执行前创建har文件
        //与每个操作绑定.如下面的click测试
        proxy.newHar("click");
    }

    @AfterEach
    void aftereach(){
        //每条用例操作执行完后生成har文件中的数据
        proxy.endHar();
    }

    @Test
    void click(){
        //自动化测试的各个操作,对各对象的操作将记录下对接口的请求,存在har文件中.
    }
}

2.proxy功能实现 透明代理

 1.代码实现:

public class mockBmpOnProxyTest {

    //修改response
    @Test
    void mockOnProxy() throws InterruptedException {
//        //根据官方文档介绍引用官方代码
        BrowserMobProxy proxy = new BrowserMobProxyServer();
        //bmp 服务开启监听8083端口
        proxy.start(8083);
        proxy.addResponseFilter(new ResponseFilter() {
            @Override
            public void filterResponse(HttpResponse httpResponse, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) {
                httpMessageContents.setTextContents(httpMessageContents.getTextContents().replace("DMS后台管理系统", "DMS后管mock"));
            }
        });
        Thread.sleep(100000);
    }
}

2.启动服务后指定代理访问

 3.​​​​​​电脑指定代理后访问也会相应修改

2.standalone(作为独立进程运行,自动抓包使用)

1.下载zip包

 2.解压

3.启动服务:browsermob-proxy -port 9000(此端口只是bmp服务的端口,非监听端口)

 4.执行下列命令时会生成代理服务监听的端口8081.

 5.新建har文件

[~]$ curl -X PUT -d 'initialPageRef=Foo' http://localhost:9000/proxy/8081/har

 6.实际请求各接口

 7.请求操作完毕后访问:http://127.0.0.1:9000/proxy/8081/har

或者

[~]$ curl http://localhost:9000/proxy/8081/har

 有了以上har文件就可以生成测试用例了.

猜你喜欢

转载自blog.csdn.net/qq_40132294/article/details/120979422