ES學習筆記之-整合測試的簡單學習
阿新 • • 發佈:2018-12-23
整合測試在es原始碼中的用法比較簡單。我選擇的切入口是delete-by-query外掛。
將es外掛的原始碼匯入intellij後,直接執行類DeleteByQueryRestIT
, 就會執行所有的整合測試用例。
-ea -Dtests.security.manager=false
這個執行結果,會讓我產生兩個疑問:
- 這個類裡面沒有test註解的方法,其入口在哪裡?
- resource/rest-api-spec目錄下,只有一個yaml檔案,這些測試用例來自哪裡?
通過檢視其父類ESRestTestCase
,可以看到裡面有test註解的test方法,而且設定斷點,可以確定該方法是測試的入口。
那麼500多個測試用例來自哪裡呢?
看ESRestTestCase
類@BeforeClass
註解的方法
@BeforeClass public static void initExecutionContext() throws IOException, RestException { String[] specPaths = resolvePathsProperty(REST_TESTS_SPEC, DEFAULT_SPEC_PATH); RestSpec restSpec = null; FileSystem fileSystem = getFileSystem(); // don't make a try-with, getFileSystem returns null // ... and you can't close() the default filesystem try { restSpec = RestSpec.parseFrom(fileSystem, DEFAULT_SPEC_PATH, specPaths); } finally { IOUtils.close(fileSystem); } validateSpec(restSpec); restTestExecutionContext = new RestTestExecutionContext(restSpec); }
通過了解這個方法的原始碼,可以瞭解到在elasticsearch-2.4.5-tests.jar
裡面,集成了這些測試用例。
這些測試用例的原始碼就在elasticsearch/rest-api-spec
目錄下。
那麼如何只執行外掛中的測試用例而忽略jar包中的測試用例呢?
-Dtests.rest.load_packaged=false
直接執行,會發現測試用例執行失敗。原來delete-by-query的測試用例有依賴。先編譯原始碼:
編譯前修改專案原始碼的pom.xml檔案, 不能略過整合測試。
<skip.integ.tests>false</skip.integ.tests>
然後編譯delete-by-query外掛
elasticsearch/plugins/delete-by-query$ mvn install
編譯完成後再執行DeleteByQueryRestIT類,即可成功執行外掛的測試用例。
-ea -Dtests.security.manager=false -Dtests.rest.load_packaged=false
這裡的測試用例會啟用一個獨立的es叢集,用來執行測試用例,執行完成後再shutdown. 其功能由如下的指令碼提供:
elasticsearch/dev-tools/src/main/resources/integration-tests.xml
參考:
http://david.pilato.fr/blog/2016/10/18/elasticsearch-real-integration-tests-updated-for-ga/
瞭解了整合測試外掛的執行過程後,就可以在開發外掛時自行實現整合測試的功能。而且通過yaml+json的方式,能夠做到測試用例的複用。