去年的一个项目中,BDD自动化测试(基于cucumber)部分,由于某些依赖到的API没有稳定的STG环境,我们需要启wiremock服务器来模拟依赖到的API。
需求:
1, 在测试程序执行之前启动wiremock服务器。
2, 在测试程序执行之后自动关闭wiremock服务器(如果不关闭,由于端口冲突,下次测试时wiremock服务器启动会失败)。
背景:
按照BDD的规范,按照功能划分,项目的自动化测试scenarios分布在多个功能feature文件中。因此测试代码分布在多个test类中。
这个需求貌似简单,在测试类的@before标签中开启wiremock服务器,@after标签中关闭服务器就好了。
但是,,如果一次自动化测试中需要执行多个测试Test类的话,这样就有问题
1, 如果A_Test.java关闭服务器不及时会导致B_Test.java启动服务器失败。
2, 如果加入延时或者同步机制的话导致代码复杂度变高,测试时间变长。
我的解决方案:
写一个如下WiremockClient类, 在每个Test类中使用该类。
public class WireMockClient {
private static WireMockServer server;
static {
server = new WireMockServer(options().port(18088));
server.start();
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
shutdown();
}
});
}
........
........
}
1,根据JVM加载类的代码执行顺序, 该 static 块内的代码仅在该类被JVM加载时,执行一次。因此避免了多次启动。
2,将停止wiremock的逻辑写在当前JVM的shutdownHook里面。在所有的测试执行完毕之后再停wiremock服务器,保证每个测试都有依赖的API可用。
另外:
wiremock是一个基于request行为模型匹配response的java开源服务器项目。简单好用。
官网:http://wiremock.org/