每個Java開發(fā)者應該知道(并愛上)的8個工具

在Stormpath(一款用戶管理和認證服務),我們認真對待質量和效率焕阿。任何一個優(yōu)秀的工匠椭豫,僅僅擁有天賦是不夠的奶躯,你在工作中還需要正確的工具。工程學不僅僅是科學甸箱,更是藝術闽坡。所以栽惶,在Stormpath,盡管我們擁有天賦疾嗅,我們仍不斷尋找所需的有用的工具外厂。我們的工程師一直渴望向團隊其他人分享新工具。現在代承,讓我們向所有充滿天賦的Java開發(fā)者推薦工具汁蝶。

在這篇文章中,我將分享我們Java團隊日常工作使用的工具,并介紹如何使用它們掖棉,分享一些實用的小技巧墓律。

希望大家一起來學習討論java方面的問題群號:左邊六五八中間三六二 右邊六五八【JAVA學習交流2群】里面有很多學習資料以及大神討論。658362658


1.Groovy

我們使用Groovy來寫Java測試幔亥。為什么耻讽?因為它提供了下面這些能力:

寬松的Java語法:這是Java語法,但有些其他規(guī)則帕棉,比如分號针肥,變量類型,訪問修飾符都是可選的香伴。后者對于測試意義重大慰枕,由于訪問修飾符不是嚴格的,你的測試可以讀取并斷言類內部的狀態(tài)即纲。舉個例子具帮,我們假設下面一個類:

public class Foo {? ? private String bar = null;? ? public void setBar(String bar) {? ? ? ? ? ? this.bar = bar;? ? }}

如果你想測試setBar(String)方法正常(即能正確修改bar的值),你可以用Groovy方便的讀取變量值崇裁。Java中不允許這樣的操作(在不涉及Java反射機制前提下)匕坯。

@Test public void test() {? ? def foo = new Foo()? ? foo.setBar("hello")? ? Assert.isTrue(foo.bar.equals("hello"))? ? //groovy 允許我們訪問私有變量 bar}

強大的斷言:Groovy提供強大多樣的assert,被稱作power assertion statement拔稳。Groovy的強大斷言能夠清晰的展示驗證失敗時的結果葛峻。另外,它比Java更有可讀性巴比。

Assert.isTrue(foo.bar.equals("hello"));

可以用Groovy這樣寫:

assert foo.bar == "hello"

當斷言失敗時它會顯示一個非常清晰的描述:

assert foo.bar == "goodbye"? ? ? |? |? |? ? ? |? |? false? ? ? |? hello? ? ? Foo@12f41634

Mocking:使用Java時术奖,動態(tài)模擬框架(如:EasyMock,PowerMock和Mockito)非常流行,這些框架可以在Groovy下方便的使用轻绞。耶采记!

2.支持REST風格

我們的后端提供REST API服務來創(chuàng)建和管理賬戶,眾多SDK中政勃,我們的Java SDK提供特定語言客戶端模型做簡單交互唧龄。其中一些SDK也提供網頁來和后端交互,從而不用編寫代碼奸远。

為了保證網絡框架的互操作性既棺,它們必須表現的一樣。因此我們需要創(chuàng)建一系列基于HTTP的測試懒叛。這是我們的兼容性測試工具丸冕。這個項目由我們的SDK工程師維護,他們精通不止一種語言薛窥。因此我們需要跨語言測試工具胖烛,謝天謝地Rest-assured來了眼姐。

Rest-assured是Java領域特定語言(DSL domain-specific language)用來測試REST服務,它簡單易用易上手佩番,甚至對于沒有用過Java的開發(fā)者也是難以置信的強大众旗。它提供先進的特性,比如細節(jié)配置趟畏、過濾器逝钥、定制分析、跨站請求偽造(CSRF)和OAuth 2.0拱镐。它提供非常簡單的語法:given-when-then。

舉個例子:讓我們來看它如何校驗“向/login路徑發(fā)送post認證信息請求返回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測試

3.Cargo Plugin

為了讓我們的Java SDK按照TCK校驗持际,我們需要開啟我們其中一個Web服務沃琅,以便測試在上面執(zhí)行。講道理的話蜘欲,我們需要每次構建時自動測試益眉,Gargo Plugin就是為此而生。

Cargo用標準的方式簡單封裝各種應用容器姥份。我們使用Cargo可以毫不費力的在不同的Servlet容器(比如Jetty和Tomcat)中運行我們的代碼郭脂。我們只需要在我們的pom文件中配置Cargo Maven2 Plugin來啟動一個Servlet容器(Tomcat7),在測試階段編譯最近的War包澈歉,你可以在我們的Servlet插件例子中看到配置展鸡。

4.Git

我們能討論哪些關于Git你不了解的事情呢?想要深入了解Git埃难,你可以看他們的About頁莹弊。

我們的Java SDK團隊遍布全球,而且彼此之間幾乎從未坐在一起涡尘。Git保障了我們寫的每一行代碼忍弛,這里有一些非常棒的命令,節(jié)省了我們大量的時間:

git mv –force foo.java Foo.java:在大小寫敏感的文件系統(tǒng)中改變文件名是非常麻煩的考抄,這個命令能讓git意識到foo.java重命名為Foo.java

git diff-tree –no-commit-id –name-only -r :查看所有在這次提交中更改的文件细疚。

git diff –name-only SHA1 SHA2:列舉出在SHA1和SHA2兩次提交之間所有更改的文件。

在一個文件的歷史提交記錄中查詢某個字符串:創(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

5.GitHub

GitHub不僅僅為我們的Git項目提供托管服務疯兼,它為代碼開源并讓全世界都看到做出了巨大貢獻。這鼓舞了人們去嘗試挑势、去交流镇防、去練習,很大程度提高了每個人的項目質量和大家的技術水平潮饱。

GitHub允許我們跟進我們的issue.游客可以提交新需求和報告bug来氧。他們也可以收到我們項目進展的通知。

6.Maven

Maven已經足夠出名了。所以我不會用長篇幅解釋為什么我們使用Maven做構建管理啦扬。然而我可以分享幾個技巧中狂,讓你的Maven更得心應手:

管理依賴:在一個多模塊的項目中,你需要在根pom.xml的標簽中定義每一個依賴扑毡。一旦你這樣做胃榕,所有下層模塊都可以不需要指定版本。這種管理依賴的方式(比如版本升級)可以集中處理瞄摊,所有下層模塊都會自動識別勋又。比如在根pom.xml:

? ? ? ? ? ? ? io.jsonwebtoken? ? ? ? jjwt? ? ? ? ${jjwt.version}? ? ? ? ...?

下層模塊的pom.xml:

? ? ? ? io.jsonwebtoken? ? ? jjwt? ? ? ...

阻止下層模塊編譯:在發(fā)布的時候我們需要所有下層模塊一起發(fā)布,但是我們如何避免某個模塊(比如example)發(fā)布呢换帜?很簡單楔壤,只需要把下面的pom文件加入到你不想發(fā)布的模塊:

? ? org.apache.maven.plugins? ? maven-deploy-plugin? ? 2.7? ? ? ? ? ? true? ? ?

跳過集成測試:我們有很多集成測試需要很長時間編譯。這些測試確保了后端整體運行正常.在頻繁的本地部署期間惯驼,我們多次因為新功能或修復bug而更改代碼蹲嚣。并不需要每次在本地構建的時候執(zhí)行這些測試,這會拖慢開發(fā)進度祟牲。因此我們要確保我們的Java SDK只在我們的CI服務器上運行的時候執(zhí)行集成測試隙畜。可以通過下面方法:

根pom.xml文件:

? ? true...? ? ? ? ? ? ? ? ? ? ? ? org.apache.maven.plugins? ? ? ? ? ? maven-failsafe-plugin? ? ? ? ? ? 2.19.1? ? ? ? ? ? ? ? ? ? ? ? ? ? ${skipITs}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? **/*IT.*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? integration-test? ? ? ? ? ? ? ? ? ? ? verify? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

所以你可以想象到说贝,所有集成測試文件以IT結尾议惰,來保證配置正常運作,比如:ApplicationIT.groovy 或 I18nIT.groovy

然后乡恕,如果我們想讓集成測試運行换淆,我們執(zhí)行以下構建:mvn clean install -DskipITs=false

7.JWT Inspector

我們的Java SDK使用JWT(JSON Web Token)通過安全可靠的方式傳輸數據。當我們測試排查時几颜,我們需要分析從瀏覽器接收到的JWT內容倍试。token信息可能在URL,cookie或本地儲存中蛋哭。JWT Inspector是一款瀏覽器插件县习,讓我們可以從控制臺或內置的界面解碼JSON Web Token。你不需要在你的app中跟蹤token信息谆趾。你只需要按一下插件的按鈕躁愿,JWT Inspector會自動展示你所需要的所有信息,然后你可以復制其中任何token信息沪蓬。

8.Postman

我們重度依賴REST API請求彤钟,編寫REST請求并不方便,具體語法取決于我們所用的工具跷叉,比如curl或HTTPie逸雹。兩者都易讀营搅,但語法難記。通常梆砸,我們需要排查問題時转质,我們需要測試一些請求。當出問題時帖世,我們無法判斷原因是請求還是后端休蟹。我們浪費了大量時間來懷疑我們寫的請求是否正確。

Postman讓書寫REST API請求變得簡單日矫。它也提供很多功能赂弓,比如保存、復用請求哪轿、生成代碼(java,python,curl等等)拣展,還可以批量按序執(zhí)行請求。Postman通過友好的界面幫助你構建復雜的命令缔逛,你所需要做的就是填寫一個表單,簡直不能再棒了姓惑。

總結

使用正確的工具不僅僅幫助你節(jié)省時間提高效率褐奴,還能提高你作品的質量并享受日常工作。我們要時刻留心于毙,發(fā)現并學習新的工具敦冬。一開始可能需要一些努力,但你總會意識到付出的時間是值得的唯沮。

希望大家一起來學習討論java方面的問題群號:左邊六五八中間三六二 右邊六五八【JAVA學習交流2群】里面有很多學習資料以及大神討論脖旱。658362658

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介蛉,隨后出現的幾起案子萌庆,更是在濱河造成了極大的恐慌,老刑警劉巖币旧,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践险,死亡現場離奇詭異,居然都是意外死亡吹菱,警方通過查閱死者的電腦和手機巍虫,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳍刷,“玉大人占遥,你說我怎么就攤上這事∈涔希” “怎么了瓦胎?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵芬萍,是天一觀的道長。 經常有香客問我凛捏,道長担忧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任坯癣,我火速辦了婚禮瓶盛,結果婚禮上,老公的妹妹穿的比我還像新娘示罗。我一直安慰自己惩猫,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布蚜点。 她就那樣靜靜地躺著轧房,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绍绘。 梳的紋絲不亂的頭發(fā)上奶镶,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音陪拘,去河邊找鬼厂镇。 笑死,一個胖子當著我的面吹牛左刽,可吹牛的內容都是我干的捺信。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欠痴,長吁一口氣:“原來是場噩夢啊……” “哼迄靠!你這毒婦竟也來了?” 一聲冷哼從身側響起喇辽,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掌挚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菩咨,有當地人在樹林里發(fā)現了一具尸體疫诽,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年旦委,在試婚紗的時候發(fā)現自己被綠了奇徒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缨硝,死狀恐怖摩钙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情查辩,我是刑警寧澤胖笛,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布网持,位于F島的核電站,受9級特大地震影響长踊,放射性物質發(fā)生泄漏功舀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一身弊、第九天 我趴在偏房一處隱蔽的房頂上張望辟汰。 院中可真熱鬧,春花似錦阱佛、人聲如沸帖汞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩蘸。三九已至,卻和暖如春淮逊,著一層夾襖步出監(jiān)牢的瞬間催首,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工泄鹏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留郎任,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓命满,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绣版。 傳聞我的和親對象是個殘疾皇子胶台,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現杂抽,斷路器诈唬,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 說好的糖豆呢铸磅?怎么變得不認識了~~
    Naty閱讀 325評論 4 5
  • 邀你幸福的第6天活動: 6/49 買根火腿腸或者買點小零食放在包里,如果碰到流浪的小動物杭朱,幫它改善一下伙食阅仔。 早起...
    liqi_carol閱讀 234評論 0 1