2015-06-08 77 views
1

我想爲Groovy腳本,在Elasticsearch用做單元測試。如何單元測試Groovy腳本,在Elasticsearch用於_score計算

腳本本身計算_score,基於3個參數和給定的公式。 我想爲該腳本編寫一個自動單元測試程序,以驗證其正確性。

是否有任何可用的工具,它提供了這樣的功能?

+0

會像這樣的幫助你https: //github.com/elastic/elasticsearch/blob/master/core/src/test/java/org/elasticsearch/script/GroovyScriptTests.java? (我知道這是不是一個單元測試,而是集成測試) –

+0

@AndreiStefan有趣的方法 - 感謝..我腦子裏想的)東西,這更去到一個方向,我想測試用的eval(測試腳本和一個給定的數據提供器(testng),以便我可以測試兩個少數參數和一個公式。 – nitram509

+0

對我來說,這聽起來像Groovy測試是誠實的,沒有任何Elasticsearch的參與。但是,如果你需要一些特殊的字段/值,這些值可以在腳本中使用,那麼你需要類似前面引用的類。 –

回答

2

我的嘲笑/在TestNG的測試模擬Elasticsearch環境,使用Groovy「神奇」解決了這個問題。

考慮下面的Groovy腳本,它應該計算基於參數和文件,高度自定義的分數值。

es_compute_custom_score.groovy

h = doc['height'] 
if (h <= 50) { 
    // complex logic here ;-) 
} else if (h < 1000) { 
    // more complex logic here ;-) 
} else { 
    // even more complex logic here ;-) 
} 
_score = a * b + h 

那麼這個單元測試可以讓你走在路上red/green/refactor TDD ...

es_compute_custom_scoreTest.groovy(假設默認Maven project layout

import org.codehaus.groovy.control.CompilerConfiguration 
import org.testng.annotations.BeforeMethod 
import org.testng.annotations.DataProvider 
import org.testng.annotations.Test 

class es_compute_custom_scoreTest{ 

    private static final String SCRIPT_UNDER_TEST = 'src/main/groovy/es_compute_custom_score.groovy' 

    private CompilerConfiguration compilerConfiguration 
    private Binding binding 

    @BeforeMethod 
    public void setUp() throws Exception { 
     compilerConfiguration = new CompilerConfiguration() 
     this.compilerConfiguration.scriptBaseClass = DocumentBaseClassMock.class.name 
     binding = new Binding() 
    } 

    @DataProvider 
    public Object[][] createTestData() { 
     List<Object[]> refdata = new ArrayList<>() 
     refdata.add([100, 50, 5042L]) 
     refdata.add([200, 50, 10042L]) 
     refdata.add([300, 50, 15042L]) 
     return refdata 
    } 

    @Test(dataProvider = 'createTestData') 
    void 'calculate a custom document score, based on parameters a and b, and documents height'(Integer a, Integer b, Long expected_score) { 
     // given 
     binding.setVariable("a", a) 
     binding.setVariable("b", b) 
     binding.setVariable("doc", new MockDocument(42)) 

     // when 
     evaluateScriptUnderTest(this.binding) 

     // then 
     long score = (long) this.binding.getVariable("_score") 
     assert score == expected_score 
    } 

    private void evaluateScriptUnderTest(Binding binding) { 
     GroovyShell gs = new GroovyShell(binding, compilerConfiguration) 
     gs.evaluate(new File(SCRIPT_UNDER_TEST)); 
    } 
} 

class MockDocument { 
    long height; 

    MockDocument(long height) { 
     this.height = height 
    } 
}