package com.easyooo.framework.rule; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; /** * <p>规则引擎单元测试</p> * <p> * 测试结果: * <ul> * <li>java规则引擎是js引擎的24倍左右</li> * <li>java规则引擎是groovy引擎的3倍左右</li> * </UL> * <b>可以看出java来实现规则引擎是比较合适的</b> * </p> * <p> * <b><i>NOTE</i></b> * groovy生成的字节码比java规则生成的字节码多了近10倍,而且内部用了反射机制, * 因此同样是class文件,执行时间却相差几倍的原因,当然Groovy还可以进一步优化, * 可以使得生成的字节码通过ClassVisitor进行修改。 * </p> * @author Killer */ public class RuleEngineManagerTest2 { String classRuleText = "int a = local.get(\"a\");" + " if(a > 18 && a < 36){ return \"美女\";} else{ return \"滚\"; }"; String scriptRuleText = "var a = local.get('a'); " + " if(a > 18 && a < 36){ '美女'} else{ '滚' }"; // 全局上下文 Map<String, Object> context = null; // 循环的次数 static final int testCount = 2000; @Before public void setUp(){ context = new HashMap<String, Object>(); } @BeforeClass public static void common(){ System.out.println("Test " + testCount + " times the total time consuming: "); } /** * 简单的测试一段Java脚本 * @throws RuleException */ @Test public void testJavaEngine() throws RuleException{ StringReader sr = new StringReader(classRuleText); Rule rule = RuleBuilder.build(sr, Language.JAVA); RuleEngineProxy proxy = new RuleEngineProxy(rule); evalAndAssert("java", proxy); } /** * Test Groovy Engine */ @Test @Ignore public void testGroovyEngine()throws RuleException{ StringReader sr = new StringReader(classRuleText); Rule rule = RuleBuilder.build(sr, Language.GROOVY); RuleEngineProxy proxy = new RuleEngineProxy(rule); evalAndAssert("groovy", proxy); } /** * Test JavaScript Engine * @throws RuleException */ @Test @Ignore public void testJavaScriptEngine()throws RuleException{ StringReader sr = new StringReader(scriptRuleText); Rule rule = RuleBuilder.build(sr, Language.JAVASCRIPT); RuleEngineProxy proxy = new RuleEngineProxy(rule); evalAndAssert("rhino", proxy); } /** * eval rule and assert return * @param proxy * @throws RuleException */ private void evalAndAssert(String tag, RuleEngineProxy proxy)throws RuleException{ long start = System.currentTimeMillis(); for(int i = 0; i < testCount; i++){ String rv = proxy.eval("a", 24); assertThat(rv, is("美女")); } System.out.println(tag + " : " + (System.currentTimeMillis() - start) + "ms"); } }