快速的远程服务测试
測試與遠程服務交互的代碼通常很困難。 有很多折衷因素會影響您可以編寫哪些測試以及要編寫的測試數量。 在大多數情況下,您對從服務中獲取的數據的控制為零,這使得斷言至少很難說。
不久前,我使用VCR庫針對遠程服務編寫了一些Ruby測試。 VCR解決了上述問題。 它記錄了測試套件的HTTP交互,以便在以后的運行中重播它們。 快速和可重復的測試是顯而易見的好處。
這個星期,我想知道Java是否也是如此。 事實證明,有Betamax可以做到這一點。 實際上,Betamax是VCR的Groovy端口,可以與任何JVM語言一起使用。
Betamax在您和目標主機之間安裝代理,在tape上記錄每個請求和響應,并為已知請求重放tape 。 它適用于任何遵守Java代理設置的HTTP客戶端,也適用于諸如Apache HttpClient和WSLite之類的不兼容的客戶端。
例
在JUnit測試中,可以將Betamax用作方法級別的TestRule 。 在應該記錄和重放的每個測試方法上,您都放置了@Betamax記錄器并設置了磁帶。
請考慮以下示例,在該示例中,我使用Spotify Metadata API來獲得藝術家的歡迎。 在此示例中,我使用Apache HttpClient庫并將其配置為Betamax。
public class SpotifyTest {@Rule public final Recorder recorder = new Recorder();private final DefaultHttpClient http = new DefaultHttpClient();@Betamax(tape = "fixtures/popularity")@Testpublic void get_popularity() throws Exception {Spotify spotify = new Spotify(http);assertThat(spotify.popularity("The Beatles"), is(.55f));}@Beforepublic void setUp() throws Exception {BetamaxRoutePlanner.configure(http);} }在編寫此代碼時,甲殼蟲樂隊的流行度為.55,但由于此數字是基于用戶的意見,因此很有可能會發生變化。 使用Betamax磁帶將獲得相同的響應(只要請求不發生更改),并允許聲明0.55以使其受歡迎。
HTTPS
正如我向您展示的那樣,Betamax使用代理或包裝器類正確記錄并重放任何HTTP通信(如示例中所示)。 還支持HTTPS,但是當您在基于代理的設置中使用Betamax時,HTTPS可能會更有趣。 使用包裝器就可以了。
HTTPS和基于代理的設置的問題顯然是代理無法在標準HTTPS通信中攔截數據。 這就是為什么我們信任HTTPS。
Betamax可以解決這個問題。 您可以在Betamax Recorder上啟用sslSupport 。 如果您的客戶端代碼可以使用SSL證書鏈斷開了,則可以進行此操作。
同樣,當您使用基于代理的設置時,這實際上只是一個問題。 使用客戶端包裝程序可以直接在API調用上啟用Betamax,從而簡化HTTPS通信。
自己嘗試
Betamax可以幫助您為遠程服務的客戶端編寫快速且可重復的單元測試。 對我最有益的是,由于消除了遠程通信,因此測試速度非常快。 雖然我個人比較喜歡這些測試的基于屬性的樣式(例如,流行度必須是> = 0和<= 5的數字),但聲明特定的值可能會有所幫助。
下次您與遠程服務進行交互時,請嘗試使用Betamax。
翻譯自: https://www.javacodegeeks.com/2014/03/fast-remote-service-tests.html
總結
- 上一篇: 小米MIX Flip名称通过IMEI确认
- 下一篇: 多数人反馈不喜欢,比亚迪海豹出口欧洲车型