在Stormpath(一款用戶管理和認(rèn)證服務(wù)),我們認(rèn)真對(duì)待質(zhì)量和效率。任何一個(gè)優(yōu)秀的工匠,僅僅擁有天賦是不夠的,你在工作中還需要正確的工具。工程學(xué)不僅僅是科學(xué),更是藝術(shù)。所以,在Stormpath,盡管我們擁有天賦,我們?nèi)圆粩鄬ふ宜璧挠杏玫墓ぞ?。我們的工程師一直渴望向團(tuán)隊(duì)其他人分享新工具。在這篇文章中,我將分享Java工程師日常工作使用的工具,并介紹如何使用它們,分享一些實(shí)用的小技巧。
我們使用Groovy來寫Java測(cè)試。為什么?因?yàn)樗峁┝讼旅孢@些能力:
寬松的Java語法:這是Java語法,但有些其他規(guī)則,比如分號(hào),變量類型,訪問修飾符都是可選的。后者對(duì)于測(cè)試意義重大,由于訪問修飾符不是嚴(yán)格的,你的測(cè)試可以讀取并斷言類內(nèi)部的狀態(tài)。
public class Foo {
private String bar = null;
public void setBar(String bar) {
this.bar = bar;
}
}
如果你想測(cè)試setBar(String)方法正常(即能正確修改bar的值),你可以用Groovy方便的讀取變量值。Java中不允許這樣的操作(在不涉及Java反射機(jī)制前提下)。
@Test public void test() {
def foo = new Foo()
foo.setBar("hello")
Assert.isTrue(foo.bar.equals("hello"))
//groovy 允許我們?cè)L問私有變量 bar
}
強(qiáng)大的斷言:Groovy提供強(qiáng)大多樣的assert,被稱作power assertion statement。Groovy的強(qiáng)大斷言能夠清晰的展示驗(yàn)證失敗時(shí)的結(jié)果。另外,它比Java更有可讀性。
Assert.isTrue(foo.bar.equals("hello"));
可以用Groovy這樣寫:
assert foo.bar == "hello"
當(dāng)斷言失敗時(shí)它會(huì)顯示一個(gè)非常清晰的描述:
assert foo.bar == "goodbye"
| | |
| | false
| hello
Foo@12f41634
Mocking:使用Java時(shí),動(dòng)態(tài)模擬框架(如:EasyMock,PowerMock和Mockito)非常流行,這些框架可以在Groovy下方便的使用。耶!
小編在這里給大家推薦一個(gè)java學(xué)習(xí)群:818464711,進(jìn)群找管理可以領(lǐng)取免費(fèi)系統(tǒng)學(xué)習(xí)資料,以及每天可以免費(fèi)去聽直播java教學(xué),歡迎小白和進(jìn)階中的朋友!
我們的后端提供REST API服務(wù)來創(chuàng)建和管理賬戶,眾多SDK中,我們的Java SDK提供特定語言客戶端模型做簡單交互。其中一些SDK也提供網(wǎng)頁來和后端交互,從而不用編寫代碼。
為了保證網(wǎng)絡(luò)框架的互操作性,它們必須表現(xiàn)的一樣。因此我們需要?jiǎng)?chuàng)建一系列基于HTTP的測(cè)試。這是我們的兼容性測(cè)試工具。這個(gè)項(xiàng)目由我們的SDK工程師維護(hù),他們精通不止一種語言。因此我們需要跨語言測(cè)試工具,謝天謝地Rest-assured來了。
Rest-assured是Java領(lǐng)域特定語言(DSL domain-specific language)用來測(cè)試REST服務(wù),它簡單易用易上手,甚至對(duì)于沒有用過Java的開發(fā)者也是難以置信的強(qiáng)大。它提供先進(jìn)的特性,比如細(xì)節(jié)配置、過濾器、定制分析、跨站請(qǐng)求偽造(CSRF)和OAuth 2.0。它提供非常簡單的語法:given-when-then。
舉個(gè)例子:讓我們來看它如何校驗(yàn)“向/login路徑發(fā)送post認(rèn)證信息請(qǐng)求返回302狀態(tài)碼”:
given() .accept(ContentType.HTML) .formParam("login", account.username)
.formParam("password", account.password) .when() .post(LoginRoute) .then() .statusCode(302)
你可以在我們的TCK repo中看到更多Rest-assured測(cè)試
為了讓我們的Java SDK按照TCK校驗(yàn),我們需要開啟我們其中一個(gè)Web服務(wù),以便測(cè)試在上面執(zhí)行。講道理的話,我們需要每次構(gòu)建時(shí)自動(dòng)測(cè)試,Gargo Plugin就是為此而生。
Cargo用標(biāo)準(zhǔn)的方式簡單封裝各種應(yīng)用容器。我們使用Cargo可以毫不費(fèi)力的在不同的Servlet容器(比如Jetty和Tomcat)中運(yùn)行我們的代碼。我們只需要在我們的pom文件中配置Cargo Maven2 Plugin來啟動(dòng)一個(gè)Servlet容器(Tomcat7),在測(cè)試階段編譯最近的War包,你可以在我們的Servlet插件例子中看到配置。
Git保障了我們寫的每一行代碼,這里有一些非常棒的命令,節(jié)省了我們大量的時(shí)間:
git mv –force foo.java Foo.java:在大小寫敏感的文件系統(tǒng)中改變文件名是非常麻煩的,這個(gè)命令能讓git意識(shí)到foo.java重命名為Foo.java
git diff-tree –no-commit-id –name-only -r :查看所有在這次提交中更改的文件。
git diff –name-only SHA1 SHA2:列舉出在SHA1和SHA2兩次提交之間所有更改的文件。
在一個(gè)文件的歷史提交記錄中查詢某個(gè)字符串:創(chuàng)建search.sh文件,粘貼下面代碼:
git rev-list --all $2 | (
while read revision; do
git grep -F $1 $revision $2
done
)
命令可以通過這種方式執(zhí)行:sh ./search.sh string_to_search file_where_to_search
GitHub不僅僅為我們的Git項(xiàng)目提供托管服務(wù),它為代碼開源并讓全世界都看到做出了巨大貢獻(xiàn)。這鼓舞了人們?nèi)L試、去交流、去練習(xí),很大程度提高了每個(gè)人的項(xiàng)目質(zhì)量和大家的技術(shù)水平。
GitHub允許我們跟進(jìn)我們的issue.游客可以提交新需求和報(bào)告bug。他們也可以收到我們項(xiàng)目進(jìn)展的通知。
管理依賴:在一個(gè)多模塊的項(xiàng)目中,你需要在根pom.xml的標(biāo)簽中定義每一個(gè)依賴。一旦你這樣做,所有下層模塊都可以不需要指定版本。這種管理依賴的方式可以集中處理,所有下層模塊都會(huì)自動(dòng)識(shí)別。
跳過集成測(cè)試:我們有很多集成測(cè)試需要很長時(shí)間編譯。這些測(cè)試確保了后端整體運(yùn)行正常.在頻繁的本地部署期間,我們多次因?yàn)樾鹿δ芑蛐迯?fù)bug而更改代碼。并不需要每次在本地構(gòu)建的時(shí)候執(zhí)行這些測(cè)試,這會(huì)拖慢開發(fā)進(jìn)度。因此我們要確保我們的Java SDK只在我們的CI服務(wù)器上運(yùn)行的時(shí)候執(zhí)行集成測(cè)試。
然后,如果我們想讓集成測(cè)試運(yùn)行,我們執(zhí)行以下構(gòu)建:mvn clean install -DskipITs=false
我們的Java SDK使用JWT(JSON Web Token)通過安全可靠的方式傳輸數(shù)據(jù)。當(dāng)我們測(cè)試排查時(shí),我們需要分析從瀏覽器接收到的JWT內(nèi)容。token信息可能在URL,cookie或本地儲(chǔ)存中。JWT Inspector是一款瀏覽器插件,讓我們可以從控制臺(tái)或內(nèi)置的界面解碼JSON Web Token。你不需要在你的app中跟蹤token信息。你只需要按一下插件的按鈕,JWT Inspector會(huì)自動(dòng)展示你所需要的所有信息,然后你可以復(fù)制其中任何token信息。
我們重度依賴REST API請(qǐng)求,編寫REST請(qǐng)求并不方便,具體語法取決于我們所用的工具,比如curl或HTTPie。兩者都易讀,但語法難記。通常,我們需要排查問題時(shí),我們需要測(cè)試一些請(qǐng)求。當(dāng)出問題時(shí),我們無法判斷原因是請(qǐng)求還是后端。我們浪費(fèi)了大量時(shí)間來懷疑我們寫的請(qǐng)求是否正確。
Postman讓書寫REST API請(qǐng)求變得簡單。它也提供很多功能,比如保存、復(fù)用請(qǐng)求、生成代碼(java,python,curl等等),還可以批量按序執(zhí)行請(qǐng)求。Postman通過友好的界面幫助你構(gòu)建復(fù)雜的命令,你所需要做的就是填寫一個(gè)表單,簡直不能再棒了。
總結(jié)
使用正確的工具不僅僅幫助你節(jié)省時(shí)間提高效率,還能提高你作品的質(zhì)量并享受日常工作。我們要時(shí)刻留心,發(fā)現(xiàn)并學(xué)習(xí)新的工具。一開始可能需要一些努力,但你總會(huì)意識(shí)到付出的時(shí)間是值得的。