ソースを参照

优化测试用例

houxinyu 1 年間 前
コミット
6b1c3edb0b

+ 1 - 1
liteflow-rule-plugin/liteflow-rule-redis/src/main/java/com/yomahub/liteflow/parser/redis/mode/polling/RedisParserPollingMode.java

@@ -49,7 +49,7 @@ public class RedisParserPollingMode implements RedisParserHelper {
     private static final int CORE_POOL_SIZE = 2;
 
     //定时任务线程池
-    private ScheduledThreadPoolExecutor pollExecutor;
+    private static ScheduledThreadPoolExecutor pollExecutor;
 
     //计算hash中field数量的lua脚本
     private final String luaOfKey = "local keys = redis.call(\"hkeys\", KEYS[1]);\n" +

+ 89 - 0
liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/java/com/yomahub/liteflow/test/redis/RedisWithXmlELPollChainSpringbootTest.java

@@ -0,0 +1,89 @@
+package com.yomahub.liteflow.test.redis;
+
+import cn.hutool.crypto.digest.DigestUtil;
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.parser.redis.mode.RClient;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.when;
+
+/**
+ * springboot环境下的redis配置源chain轮询拉取模式功能测试
+ *
+ * @author hxinyu
+ * @since 2.11.0
+ */
+@ExtendWith(SpringExtension.class)
+@TestPropertySource(value = "classpath:/redis/application-poll-chain-xml.properties")
+@SpringBootTest(classes = RedisWithXmlELPollChainSpringbootTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.redis.cmp"})
+public class RedisWithXmlELPollChainSpringbootTest extends BaseTest {
+
+    @MockBean(name = "chainClient")
+    private static RClient chainClient;
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    //计算hash中field数量的lua脚本
+    private final String luaOfKey = "local keys = redis.call(\"hkeys\", KEYS[1]);\n" +
+            "return #keys;\n";
+
+    //计算hash中value的SHA值的lua脚本
+    private final String luaOfValue = "local key = KEYS[1];\n" +
+            "local field = KEYS[2];\n" +
+            "local value, err = redis.call(\"hget\", key, field);\n" +
+            "if value == false or value == nil then\n" +
+            "    return \"nil\";\n" +
+            "end\n" +
+            "local sha1 = redis.sha1hex(value);\n" +
+            "return sha1;";
+
+    /**
+     * 测试chain
+     */
+    @Test
+    public void testPollWithXml() throws InterruptedException {
+        Set<String> chainNameSet = new HashSet<>();
+        chainNameSet.add("chain11");
+        String chainValue = "THEN(a, b, c);";
+        //SHA值用于测试修改chain的轮询刷新功能
+        String chainSHA = DigestUtil.sha1Hex(chainValue);
+
+        //修改chain并更新SHA值
+        String changeChainValue = "THEN(a, c);";
+        String changeChainSHA = DigestUtil.sha1Hex(changeChainValue);
+        when(chainClient.hkeys("pollChainKey")).thenReturn(chainNameSet);
+        when(chainClient.hget("pollChainKey", "chain11")).thenReturn(chainValue).thenReturn(changeChainValue);
+        when(chainClient.scriptLoad(luaOfKey)).thenReturn("keysha");
+        when(chainClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
+        when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn("1");
+        when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn(chainSHA).thenReturn(changeChainSHA);
+
+        //测试修改前的chain
+        LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg");
+        Assertions.assertTrue(response.isSuccess());
+        Assertions.assertEquals("a==>b==>c", response.getExecuteStepStr());
+
+        Thread.sleep(4000);
+
+        //测试修改后的chain
+        response = flowExecutor.execute2Resp("chain11", "arg");
+        Assertions.assertTrue(response.isSuccess());
+        Assertions.assertEquals("a==>c", response.getExecuteStepStr());
+    }
+}

+ 28 - 58
liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/java/com/yomahub/liteflow/test/redis/RedisWithXmlELPollSpringbootTest.java → liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/java/com/yomahub/liteflow/test/redis/RedisWithXmlELPollScriptSpringbootTest.java

@@ -2,16 +2,13 @@ package com.yomahub.liteflow.test.redis;
 
 import cn.hutool.crypto.digest.DigestUtil;
 import com.yomahub.liteflow.core.FlowExecutor;
-import com.yomahub.liteflow.core.FlowInitHook;
-import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.log.LFLog;
+import com.yomahub.liteflow.log.LFLoggerManager;
 import com.yomahub.liteflow.parser.redis.mode.RClient;
-import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.parser.redis.mode.polling.RedisParserPollingMode;
 import com.yomahub.liteflow.slot.DefaultContext;
-import com.yomahub.liteflow.spi.holder.SpiFactoryCleaner;
-import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.test.BaseTest;
-import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.junit.jupiter.api.*;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -20,25 +17,29 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
+
 import javax.annotation.Resource;
+import java.lang.reflect.Field;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 
-import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 /**
- * springboot环境下的redis配置源轮询拉取模式功能测试
+ * springboot环境下的redis配置源script轮询拉取模式功能测试
  *
  * @author hxinyu
  * @since 2.11.0
  */
 @ExtendWith(SpringExtension.class)
-@TestPropertySource(value = "classpath:/redis/application-poll-xml.properties")
-@SpringBootTest(classes = RedisWithXmlELPollSpringbootTest.class)
+@TestPropertySource(value = "classpath:/redis/application-poll-script-xml.properties")
+@SpringBootTest(classes = RedisWithXmlELPollScriptSpringbootTest.class)
 @EnableAutoConfiguration
 @ComponentScan({"com.yomahub.liteflow.test.redis.cmp"})
-public class RedisWithXmlELPollSpringbootTest extends BaseTest {
+public class RedisWithXmlELPollScriptSpringbootTest extends BaseTest {
 
     @MockBean(name = "chainClient")
     private static RClient chainClient;
@@ -63,68 +64,37 @@ public class RedisWithXmlELPollSpringbootTest extends BaseTest {
             "local sha1 = redis.sha1hex(value);\n" +
             "return sha1;";
 
+    static LFLog LOG = LFLoggerManager.getLogger(RedisWithXmlELPollChainSpringbootTest.class);
 
-    @AfterEach
-    public void after() {
-        FlowBus.cleanCache();
-        FlowInitHook.cleanHook();
-        ExecutorHelper.loadInstance().clearExecutorServiceMap();
-        SpiFactoryCleaner.clean();
-    }
-
-    /**
-     * 测试chain
-     */
-    @Test
-    public void testPollWithXml() throws InterruptedException {
-        Set<String> chainNameSet = new HashSet<>();
-        chainNameSet.add("chain11");
-        String chainValue = "THEN(a, b, c);";
-        //SHA值用于测试修改chain的轮询刷新功能
-        String chainSHA = DigestUtil.sha1Hex(chainValue);
-
-        //修改chain并更新SHA值
-        String changeChainValue = "THEN(a, c);";
-        String changeChainSHA = DigestUtil.sha1Hex(changeChainValue);
-        when(chainClient.hkeys("pollChainKey")).thenReturn(chainNameSet);
-        when(chainClient.hget("pollChainKey", "chain11")).thenReturn(chainValue).thenReturn(changeChainValue);
-        when(chainClient.scriptLoad(luaOfKey)).thenReturn("keysha");
-        when(chainClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
-        when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn("1");
-        when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn(chainSHA).thenReturn(changeChainSHA);
-        //这里其实并没有script数据 预设数据只是为了不产生NumberFormatException
-        when(scriptClient.scriptLoad(luaOfKey)).thenReturn("keysha");
-        when(scriptClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
-        when(scriptClient.evalSha(eq("keysha"), anyString())).thenReturn("0");
-        when(scriptClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn("");
-
-        //测试修改前的chain
-        LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg");
-        Assertions.assertTrue(response.isSuccess());
-        Assertions.assertEquals("a==>b==>c", response.getExecuteStepStr());
-
-        Thread.sleep(4000);
 
-        //测试修改后的chain
-        response = flowExecutor.execute2Resp("chain11", "arg");
-        Assertions.assertTrue(response.isSuccess());
-        Assertions.assertEquals("a==>c", response.getExecuteStepStr());
+    @AfterAll
+    public static void after() {
+        //关闭poll模式的轮询线程池
+        try{
+            Field pollExecutor = RedisParserPollingMode.class.getDeclaredField("pollExecutor");
+            pollExecutor.setAccessible(true);
+            ScheduledThreadPoolExecutor threadPoolExecutor = (ScheduledThreadPoolExecutor) pollExecutor.get(null);
+            threadPoolExecutor.shutdownNow();
+        } catch (Exception ignored) {
+            LOG.error("[Polling thread pool not closed]", ignored);
+        }
     }
 
     /**
      * 测试script
      */
     @Test
-    public void testPollWithScript() throws InterruptedException {
+    public void testPollWithScriptXml() throws InterruptedException {
         Set<String> chainNameSet = new HashSet<>();
         chainNameSet.add("chain22");
         String chainValue = "THEN(s11, s22, s33, a, b);";
+        String chainSHA = DigestUtil.sha1Hex(chainValue);
         when(chainClient.hkeys("pollChainKey")).thenReturn(chainNameSet);
         when(chainClient.hget("pollChainKey", "chain22")).thenReturn(chainValue);
         when(chainClient.scriptLoad(luaOfKey)).thenReturn("keysha");
         when(chainClient.scriptLoad(luaOfValue)).thenReturn("valuesha");
-        when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn("1");
-        when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn("");
+        when(chainClient.evalSha(eq("keysha"), anyString())).thenReturn(null);
+        when(chainClient.evalSha(eq("valuesha"), anyString(), anyString())).thenReturn(chainSHA);
 
         Set<String> scriptFieldSet = new HashSet<>();
         scriptFieldSet.add("s11:script:脚本s11:groovy");

+ 7 - 6
liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/java/com/yomahub/liteflow/test/redis/RedisWithXmlELSubscribeSpringbootTest.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.redis;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.exception.ChainNotFoundException;
 import com.yomahub.liteflow.flow.LiteflowResponse;
 import com.yomahub.liteflow.parser.redis.vo.RedisParserVO;
 import com.yomahub.liteflow.property.LiteflowConfig;
@@ -30,11 +31,11 @@ import javax.annotation.Resource;
 
 /**
  * springboot环境下的redis配置源订阅模式功能测试
- *
+ * <p>
  * 由于Redisson中RMapCache的监听器功能无法mock测试
  * 故Sub模式测试用例需本地启动Redis服务 连接地址: 127.0.0.1:6379
  * 若本地该端口号未启动Redis 则自动忽略本类中测试用例
- *
+ * <p>
  * 测试用例会在1号database中添加测试数据 chainKey:testChainKey; scriptKey:testScriptKey
  * 测试完成后清除测试数据
  *
@@ -70,7 +71,7 @@ public class RedisWithXmlELSubscribeSpringbootTest extends BaseTest {
     }
 
     @AfterAll
-    public static void after(){
+    public static void after() {
         testCleanData();
     }
 
@@ -153,7 +154,7 @@ public class RedisWithXmlELSubscribeSpringbootTest extends BaseTest {
         LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
         RedisParserVO redisParserVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), RedisParserVO.class);
         RMapCache<String, String> chainKey = redissonClient.getMapCache(redisParserVO.getChainKey());
-        chainKey.put("chain4","THEN(b, c);");
+        chainKey.put("chain4", "THEN(b, c);");
     }
 
     /**
@@ -179,8 +180,8 @@ public class RedisWithXmlELSubscribeSpringbootTest extends BaseTest {
     }
 
     //redis内规则数据数据清空
-    public static void testCleanData(){
-        if(ObjectUtil.isNotNull(redissonClient)){
+    public static void testCleanData() {
+        if (ObjectUtil.isNotNull(redissonClient)) {
             RMapCache<String, String> chainKey = redissonClient.getMapCache("testChainKey");
             RMapCache<String, String> scriptKey = redissonClient.getMapCache("testScriptKey");
             for (String key : chainKey.keySet()) {

+ 9 - 0
liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/resources/redis/application-poll-chain-xml.properties

@@ -0,0 +1,9 @@
+liteflow.rule-source-ext-data={\
+  "host":"localhost",\
+  "port":6379,\
+  "pollingInterval":1,\
+  "pollingStartTime":2,\
+  "chainDataBase":1,\
+  "chainKey":"pollChainKey"\
+  }
+liteflow.parse-on-start=false

+ 0 - 0
liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/resources/redis/application-poll-xml.properties → liteflow-testcase-el/liteflow-testcase-el-redis-springboot/src/test/resources/redis/application-poll-script-xml.properties