AccuREST Stub Runner发布
最近發(fā)布時(shí)間不錯(cuò)! 我在Too Much Coding博客上的博客更多是關(guān)于發(fā)布,然后是關(guān)于任何具體主題;)
在作為Brixton RC1的一部分發(fā)布Spring Cloud Sleuth之后,我們剛剛發(fā)布了AccuREST 1.0.4版本。 我們修復(fù)了一些錯(cuò)誤,但引入了一些重要功能,包括:
- Maven插件支持
- Stub Runner功能
這篇文章將更深入地介紹后者。
介紹
我已經(jīng)就名為Micro-Infra-Spring的庫(kù)進(jìn)行了很多討論,在其中我介紹了如何從Stub Runner功能中受益。 自從我離開(kāi)擁有該存儲(chǔ)庫(kù)的公司以來(lái),幾乎根本沒(méi)有維護(hù)該項(xiàng)目。 很長(zhǎng)一段時(shí)間以來(lái),任何開(kāi)發(fā)工作都是我自己完成的,實(shí)際上,我是大多數(shù)Stub Runner代碼的作者。 由于上述原因以及Stub Runner與AccuREST的stub生成功能緊密結(jié)合的事實(shí),我決定將其遷移到AccuREST的存儲(chǔ)庫(kù)。
AccuREST回顧
Stub Runner與AccuREST的概念緊密結(jié)合。 有關(guān)AccuREST的更多信息,您可以檢查我的博客條目或在Github上檢查AccuREST項(xiàng)目 。 如果您不知道那是什么,我會(huì)盡力快速回顧一下。
AccuREST是消費(fèi)者驅(qū)動(dòng)的合同驗(yàn)證器,您可以在其中通過(guò)Groovy DSL定義API的合同。 從該DSL,在服務(wù)器端,創(chuàng)建測(cè)試以檢查您的合同是否說(shuō)實(shí)話。 從Stub Runner的角度來(lái)看,更有趣的是客戶(hù)端。 對(duì)于客戶(hù)端,AccuREST從提供的DSL生成WireMock存根,以便可以為該API的客戶(hù)端提供可靠的存根。
什么是Stub Runner?
現(xiàn)在,我們記得AccuREST做什么了,我們可以更深入地研究Stub Runner 。 假設(shè)我們有以下服務(wù)流程(順便說(shuō)一下,這是來(lái)自與Spring Cloud Sleuth集成的Zipkin的屏幕截圖 )
讓我們想象一下自己作為服務(wù)2的開(kāi)發(fā)商-的一個(gè)呼叫服務(wù)3和服務(wù) 。 因?yàn)槲覀冋谧龅腃DC( 消費(fèi)者驅(qū)動(dòng)的契約 )的方式讓我們假定服務(wù)3和服務(wù)的存根得到了已部署到一些Maven倉(cāng)庫(kù)。
如果我寫(xiě)服務(wù)2的集成測(cè)試我肯定有服務(wù)3和服務(wù)互動(dòng)的一些要點(diǎn)。 在大多數(shù)情況下,我很可能會(huì)在代碼中模擬這些交互,但是對(duì)其他應(yīng)用程序執(zhí)行真正的HTTP調(diào)用將非常有價(jià)值。 當(dāng)然,我不想下載這兩種服務(wù)并只為進(jìn)行集成測(cè)試而運(yùn)行它們-這太過(guò)分了。 這就是為什么此時(shí)最好的解決方案是運(yùn)行我的協(xié)作者的存根。
由于我懶得手動(dòng)做事,所以我希望自動(dòng)為我下載存根,因此WireMock服務(wù)器啟動(dòng)并提供了存根定義。
這正是Stub Runner可以為您做的!
它是如何工作的?
概念
Stub Runner的核心是使用Groovy的Grape機(jī)制從給定的Maven存儲(chǔ)庫(kù)下載存根。 接下來(lái),將它們解壓縮到一個(gè)臨時(shí)文件夾。 假設(shè)您在存根JAR中具有WireMock存根的以下結(jié)構(gòu)(service3 service3-stubs.jar )
├── META-INF │ └── MANIFEST.MF └── mappings└── service3├── shouldMarkClientAsFraud.json├── notAWireMockMapping.json└── shouldSayHello.jsonStub Runner將掃描整個(gè)解壓縮的JAR中是否有任何.json文件。 約定將存根定義放在mappings文件夾下。 因此它將選擇shouldMarkClientAsFraud.json , notAWireMockMapping.json和shouldSayHello.json文件。
接下來(lái),為每個(gè)依賴(lài)項(xiàng)啟動(dòng)一個(gè)WireMock實(shí)例,并嘗試將每個(gè)找到的JSON解析為WireMock存根定義。 此時(shí)任何異常都將被忽略(因此,假設(shè)notAWireMockMapping.json不是有效的WireMock定義,該異常將被抑制)。 在我們的場(chǎng)景2 WireMock服務(wù)器將啟動(dòng)-一個(gè)用于service3 ,一個(gè)用于service4 。
這樣,您不必手動(dòng)復(fù)制存根。 由于存根存儲(chǔ)在Maven存儲(chǔ)庫(kù)中,因此它們是集中式的。 這是非常重要的原因,因?yàn)镾tub Runner總是下載最新版本的Stub,因此您可以確保一旦有人進(jìn)行了不兼容的更改,測(cè)試就會(huì)中斷。
API
從開(kāi)發(fā)人員的角度來(lái)看,僅應(yīng)使用少數(shù)幾個(gè)Stub Runner的類(lèi)。 在大多數(shù)情況下,您將使用以下內(nèi)容:
存根查找器
該接口允許您查找已啟動(dòng)的WireMock實(shí)例的URL。 您可以通過(guò)傳遞常春藤表示法( groupId:artifactId )或僅artifactId來(lái)找到該URL, Stub Runner將嘗試處理其余的內(nèi)容。
interface StubFinder {/*** For the given groupId and artifactId tries to find the matching* URL of the running stub.** @param groupId - might be null. In that case a search only via artifactId takes place* @return URL of a running stub or null if not found*/URL findStubUrl(String groupId, String artifactId)/*** For the given Ivy notation {@code groupId:artifactId} tries to find the matching* URL of the running stub. You can also pass only {@code artifactId}.** @param ivyNotation - Ivy representation of the Maven artifact* @return URL of a running stub or null if not found*/URL findStubUrl(String ivyNotation)/*** Returns all running stubs*/RunningStubs findAllRunningStubs() }RunningStubs
表示已經(jīng)運(yùn)行的存根的結(jié)構(gòu)。 給您一些幫助方法,以檢索特定存根的常春藤表示,找到存根的端口等。
存根運(yùn)行
可以運(yùn)行存根的類(lèi)的合同:
interface StubRunning extends Closeable, StubFinder {/*** Runs the stubs and returns the {@link RunningStubs}*/RunningStubs runStubs()}StubRunner
表示一個(gè)現(xiàn)成的存根實(shí)例。 它可以運(yùn)行存根并返回到運(yùn)行實(shí)例的WireMock包裹在RunningStubs類(lèi)。 由于正在實(shí)現(xiàn)StubFinder因此,如果當(dāng)前的groupid和artifactid與相應(yīng)的正在運(yùn)行的存根匹配,也可以查詢(xún)StubFinder 。
BatchStubRunner
如果您要使用存根運(yùn)行WireMocks的多種服務(wù),則可以使用BatchStubRunner 。 迭代StubRunner的給定Iterable ,并在每個(gè)StubRunner執(zhí)行邏輯。
正在運(yùn)行的Stub Runner
在下面的所有示例中,我們假設(shè)存根存儲(chǔ)在Maven存儲(chǔ)庫(kù)中,該存儲(chǔ)庫(kù)位于http://toomuchcoding.com URL下。 作為服務(wù)2我想下載的存根com.toomuchcoding:service3和com.toomuchcoding:service4服務(wù)。
存根賽跑者為胖胖的JAR
如何使用它?
Stub Runner帶有一個(gè)主類(lèi)( io.codearte.accurest.stubrunner.StubRunnerMain ),您可以使用以下選項(xiàng)運(yùn)行它:
-maxp (--maxPort) N : Maximum port value to be assigned to theWiremock instance. Defaults to 15000(default: 15000)-minp (--minPort) N : Minimal port value to be assigned to theWiremock instance. Defaults to 10000(default: 10000)-s (--stubs) VAL : Comma separated list of Ivy representation ofjars with stubs. Eg. groupid:artifactid1,groupid2:artifactid2:classifier-sr (--stubRepositoryRoot) VAL : Location of a Jar containing server where youkeep your stubs (e.g. http://nexus.net/content/repositories/repository)-ss (--stubsSuffix) VAL : Suffix for the jar containing stubs (e.g.'stubs' if the stub jar would have a 'stubs'classifier for stubs: foobar-stubs ).Defaults to 'stubs' (default: stubs)-wo (--workOffline) : Switch to work offline. Defaults to 'false'(default: false)您可以從IDE運(yùn)行該主類(lèi),也可以自己構(gòu)建一個(gè)胖JAR。 為此,只需調(diào)用以下命令:
./gradlew stub-runner-root:stub-runner:shadowJar -PfatJar然后在build/lib中將有一個(gè)帶有分類(lèi)器fatJar的胖JAR,等待您執(zhí)行。
再回到我們的例子中,一旦脂肪JAR建我只是調(diào)用下面的命令檢索服務(wù)3和服務(wù)的存根從Maven倉(cāng)庫(kù)提供http://toomuchcoding.com 。
java -jar stub-runner-1.0.4-SNAPSHOT-fatJar.jar -sr http://toomuchcoding.com -s com.toomuchcoding:service3:stubs,com.toomuchcoding.service4什么時(shí)候使用?
當(dāng)您在不想下載并運(yùn)行該應(yīng)用程序的所有協(xié)作器的已部署應(yīng)用程序上運(yùn)行一些快速冒煙測(cè)試時(shí),將Stub Runner作為主要類(lèi)運(yùn)行是最有意義的。 有關(guān)這種方法的更多原理,您可以查看我有關(guān)微服務(wù)部署的文章
Stub Runner JUnit規(guī)則
如何使用它?
您可以使用Stub Runner的 JUnit規(guī)則在測(cè)試過(guò)程中自動(dòng)下載并運(yùn)行存根。 AccurestRule實(shí)現(xiàn)了StubFinder界面,因此您可以輕松地找到您感興趣的服務(wù)的URL。
這是使用Spock的方法:
class SomeSpec extends Specification {@ClassRule @Shared AccurestRule rule = new AccurestRule().repoRoot('http://toomuchcoding.com').downloadStub("com.toomuchcoding", "service3").downloadStub("com.toomuchcoding:service4")def 'should do something useful when service3 is called'() {given:URL service3Url = rule.findStubUrl('com.toomuchcoding', 'service3')expect:somethingUseful(service3Url)}def 'should do something even more useful when service4 is called'() {given:URL service4Url = rule.findStubUrl('service4')expect:somethingMoreUseful(service4Url)} }或使用普通的Java JUnit:
public class SomeTest {@ClassRule public static AccurestRule rule = new AccurestRule().repoRoot("http://toomuchcoding.com").downloadStub("com.toomuchcoding", "service3").downloadStub("com.toomuchcoding:service4");@Testpublic void should_do_something_useful_when_service3_is_called() {URL service3Url = rule.findStubUrl("com.toomuchcoding", "service3");somethingUseful(service3Url);}@Testpublic void should_do_something_even_more_useful_when_service4_is_called() {URL service4Url = rule.findStubUrl("service4");somethingMoreUseful(service4Url);} }什么時(shí)候使用?
如果我們不提供與現(xiàn)有框架的任何集成,則可以在任意位置使用此規(guī)則。
存根賽跑者春天
如何使用它?
您可以使用Stub Runner的 Spring配置下載協(xié)作者的Stub,并在Spring上下文啟動(dòng)時(shí)運(yùn)行WireMock服務(wù)器。 我們提供了您可以在測(cè)試中導(dǎo)入的StubRunnerConfiguration 。 在該配置中,我們注冊(cè)了一個(gè)StubFinder bean,您可以在測(cè)試中自動(dòng)裝配它。
具有以下application.yaml文件:
stubrunner.stubs.repository.root: http://toomuchcoding.com stubrunner.stubs.ids: com.toomuchcoding:service3:stubs,com.toomuchcoding.service4這就是用Spock可以做到的
@ContextConfiguration(classes = Config, loader = SpringApplicationContextLoader) class StubRunnerConfigurationSpec extends Specification {@Autowired StubFinder stubFinderdef 'should do something useful when service3 is called'() {given:URL service3Url = stubFinder.findStubUrl('com.toomuchcoding', 'service3')expect:somethingUseful(service3Url)}def 'should do something even more useful when service4 is called'() {given:URL service4Url = stubFinder.findStubUrl('service4')expect:somethingMoreUseful(service4Url)}@Configuration@Import(StubRunnerConfiguration)@EnableAutoConfigurationstatic class Config {}}什么時(shí)候使用?
在您的測(cè)試中,如果您擁有Spring而沒(méi)有Spring Cloud。 您也可以在編譯時(shí)添加它(當(dāng)然,您必須添加一些Spring概要文件,以便不在生產(chǎn)環(huán)境中運(yùn)行它),以從運(yùn)行微服務(wù)的“開(kāi)發(fā)人員”模式中獲利。 這意味著,如果您啟動(dòng)應(yīng)用程序以單擊它,那么周?chē)乃写娓紝⒁呀?jīng)下載并啟動(dòng)。
存根賽跑者春天云
如何使用它?
在使用Spring Cloud的服務(wù)發(fā)現(xiàn)抽象和Netflix Ribbon時(shí),您可以使用Stub Runner的 Spring Cloud配置來(lái)從Stubed合作者中獲利。 Stub Runner Spring Cloud配置是AutoConfiguration因此會(huì)自動(dòng)為您啟動(dòng)。
讓我們假設(shè)你指的是作為服務(wù)3 service3在你的代碼,并作為服務(wù)4 shouldMapThisNameToService4 。 這意味著您以如下方式使用了@LoadBalanced RestTemplate (不要像在本示例中一樣使用字段注入!):
@Component class SomeClass {@Autowired @LoadBalanced RestTemplate restTemplatevoid doSth() {// code...String service3Response = restTemplate.getForObject('http://service3/name', String)String service4Response = restTemplate.getForObject('http://shouldMapThisNameToService4/name', String)// more code...}}如果您用來(lái)調(diào)用其他服務(wù)的服務(wù)ID準(zhǔn)確地映射到Maven存儲(chǔ)庫(kù)中的工件ID的名稱(chēng),那么您很幸運(yùn),無(wú)需執(zhí)行任何操作即可找到正在運(yùn)行的存根。 但是,如果不是這種情況–不用擔(dān)心,您只需要自己映射即可。
stubrunner.stubs.idsToServiceIds屬性是映射的根路徑,其中的鍵是下載的存根的artifactID , 值是代碼中使用的serviceId 。
具有以下application.yaml文件:
stubrunner.stubs.repository.root: http://toomuchcoding.com stubrunner.stubs.ids: com.toomuchcoding:service3:stubs,com.toomuchcoding.service4stubrunner.stubs.idsToServiceIds:service4: shouldMapThisNameToService4這就是用Spock可以做到的
@ContextConfiguration(classes = Config, loader = SpringApplicationContextLoader) class StubRunnerConfigurationSpec extends Specification {@Autowired SomeClass someClassdef 'should not explode'() {when:someClass.doSth()expect:noExceptionThrown()}@Configuration@EnableAutoConfigurationstatic class Config {}}什么時(shí)候使用?
當(dāng)您使用Spring Cloud時(shí)。 您也可以以“開(kāi)發(fā)人員”模式從Stub Runner Spring Cloud受益,如Stub Runner Spring部分所述。
其他配置選項(xiàng)
您可以通過(guò)系統(tǒng)屬性設(shè)置Maven存儲(chǔ)庫(kù)的默認(rèn)值:
-Dstubrunner.stubs.repository.root=http://your.maven.repo.com可配置屬性的列表包含:
| stubrunner.port.range.min | 10000 | WireMock服務(wù)器的端口的最小值 |
| stubrunner.port.range.max | 15000 | WireMock服務(wù)器的端口最大值 |
| stubrunner.stubs.repository.root | M2倉(cāng)庫(kù)的地址(如果未提供,將指向本地M2倉(cāng)庫(kù)) | |
| stubrunner.stubs.classifier | 存根 | 包含存根的JAR的默認(rèn)分類(lèi)器 |
| stubrunner.work-offline | 假 | 應(yīng)該嘗試連接到任何存儲(chǔ)庫(kù)以下載存根(如果沒(méi)有互聯(lián)網(wǎng),則很有用) |
| 存根 | 默認(rèn)逗號(hào)分隔的存根列表以供下載 |
摘要
短跑選手 :
- 已經(jīng)被證明是進(jìn)行CDC時(shí)非常有用的工具。
- 經(jīng)過(guò)了戰(zhàn)斗測(cè)試,越來(lái)越多的公司宣布有興趣使用它。
- 幫助您生成一個(gè)API,該API應(yīng)該使雙方(服務(wù)器和客戶(hù)端)同等高興(或不高興,但他們的情感仍然平等;))。
- 語(yǔ)言/技術(shù)不可知–您可以將其作為胖JAR來(lái)運(yùn)行,可以將其與Spring,Guice或任何您想要的東西一起使用。
- 從API設(shè)計(jì)和兼容性角度來(lái)看,都可以幫助您加快反饋周期。
鏈接
- AccuREST Github存儲(chǔ)庫(kù)
- 短跑選手維基
- AccuREST Gitter
翻譯自: https://www.javacodegeeks.com/2016/04/accurest-stub-runner-released.html
總結(jié)
以上是生活随笔為你收集整理的AccuREST Stub Runner发布的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iRobot 推出 Roomba j9+
- 下一篇: mvvm 耗时加载进度条_ZK的实际应用