集成測試在es源碼中的用法比較簡單。我選擇的切入口是delete-by-query插件。json
將es插件的源碼導入intellij後,直接運行類DeleteByQueryRestIT
, 就會運行全部的集成測試用例。api
-ea -Dtests.security.manager=false
這個運行結果,會讓我產生兩個疑問:elasticsearch
經過查看其父類ESRestTestCase
,能夠看到裏面有test註解的test方法,並且設置斷點,能夠肯定該方法是測試的入口。ide
那麼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
目錄下。rest
那麼如何只運行插件中的測試用例而忽略jar包中的測試用例呢?code
-Dtests.rest.load_packaged=false
直接運行,會發現測試用例運行失敗。原來delete-by-query的測試用例有依賴。先編譯源碼:
編譯前修改項目源碼的elasticsearch/pom.xml文件, 不能略過集成測試。xml
<skip.integ.tests>false</skip.integ.tests>
而後編譯delete-by-query插件blog
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的方式,可以作到測試用例的複用。