接口mock提升自动化质

对于QA同学来说我们常常会碰到依赖第三方服务模块的测试,第三方服务对于我们来说不可控,特别是对于自动化的实现来说,第三方属于强依赖模块,导致我们的模块化自动化测试不够独立,回归维护较为困难。

细细想来第三方模块的交互大部分是以接口的形式来进行信息传递,相信很多QA同学在自动化实现的时候都会想到如何才能够很好的模拟第三方响应,完整将第三方服务行为mock掉,以便提升自动化测试质量。

基于此,个人实践使用了wiremock在自动化测试中mock其他接口。

下面拿一个例子给大家介绍,需要模拟如下接口:

请求url如下:
GET /lbs?version=1.0&bucketName=$bucketname

响应如下:
200 OK 

{
    "lbs": "http://192.168.1.1/lbs",
    "upload":[
        "http://192.168.1.2",
        "http://192.168.1.3"
    ]
}

具体使用介绍如下: 首先在pom文件引入wiremock

<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock</artifactId>
    <version>2.5.1</version>
</dependency>

测试代码实现一:

public class MockTempTest {
	private static final Logger logger = Logger.getLogger(MockTempTest.class);

	private WireMockServer mockServer = null;
	
	@BeforeClass(alwaysRun = true)
	public void before(){
		mockServer = new WireMockServer(WireMockConfiguration.wireMockConfig().port(8888));
		mockServer.start();
	}
	@AfterClass(alwaysRun = true)
	public void after(){
		mockServer.stop();
		
	}
	
	@Test
	public void testTesmpTest(){
	//此处定义被mock API规则
		mockServer.stubFor(get(urlMatching("/lbs\\?(.*)"))
 				.willReturn(aResponse()
 						.withStatus(200)
 						.withBody("{\"lbs\": \"http://192.168.1.1/lbs\","
                                		+"\"upload\":["
                                		+ "\"http://192.168.1.2\","
                                		+ "\"http://192.168.1.3\""
                                		+ "]"
                                		+ "}";)
 				));
 	}
 	
 	//此处做测试相关逻辑,可以调用mock API
 	Response response = testclient.get("/lbs?versiong=1.0")
 	Assert.assertEquals(response.getStatusLine().getStatusCode(),HttpStatus.SC_OK);
	}
}

上述方法是适用于使用TestNG的同学,当然有很多同学在使用时使用到了Junit框架,单元测试框架使用更为方便,示例如下:

public class MockTempTest {
	private static final Logger logger = Logger.getLogger(MockTempTest.class);

	@Rule
	public WireMockRule mockServer = new WireMockRule(8888);
	
	@Test
	public void testTesmpTest(){
	//此处定义被mock API规则
		mockServer.stubFor(get(urlMatching("/lbs\\?(.*)"))
 				.willReturn(aResponse()
 						.withStatus(200)
 						.withBody("{\"lbs\": \"http://192.168.1.1/lbs\","
                                		+"\"upload\":["
                                		+ "\"http://192.168.1.2\","
                                		+ "\"http://192.168.1.3\""
                                		+ "]"
                                		+ "}";)
 				));
 	}
 	
 	//此处做测试相关逻辑,可以调用mock API
 	Response response = testclient.get("/lbs?versiong=1.0")
 	Assert.assertEquals(response.getStatusLine().getStatusCode(),HttpStatus.SC_OK);
	}
}

以上是两种mock方式的简单使用,wiremock还为我们提供了如下功能:

1.url正则匹配和完全匹配
2.支持添加任意header
3.支持body匹配和正则
4.支持代理、录制等功能

wiremock基本已经满足了常规mock所需要的所有功能,如何更好充分使用其功能,需要我们在工作中进一步探索。

本文来自网易实践者社区,经作者刘成授权发布。