每個 Java 開發者應該知道(並愛上)的 8 個工具
本文由碼農網 – 孫騰浩原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
在Stormpath(一款使用者管理和認證服務),我們認真對待質量和效率。任何一個優秀的工匠,僅僅擁有天賦是不夠的,你在工作中還需要正確的工具。工程學不僅僅是科學,更是藝術。所以,在Stormpath,儘管我們擁有天賦,我們仍不斷尋找所需的有用的工具。我們的工程師一直渴望向團隊其他人分享新工具。現在,讓我們向所有充滿天賦的Java開發者推薦工具。
在這篇文章中,我將分享我們Java團隊日常工作使用的工具,並介紹如何使用它們,分享一些實用的小技巧。
1.Groovy
我們使用Groovy來寫Java測試。為什麼?因為它提供了下面這些能力:
寬鬆的Java語法:這是Java語法,但有些其他規則,比如分號,變數型別,訪問修飾符都是可選的。後者對於測試意義重大,由於訪問修飾符不是嚴格的,你的測試可以讀取並斷言類內部的狀態。舉個例子,我們假設下面一個類:
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時,動態模擬框架(如:EasyMock,PowerMock和Mockito)非常流行,這些框架可以在Groovy下方便的使用。耶!
2.支援REST風格
我們的後端提供REST API服務來建立和管理賬戶,眾多SDK中,我們的Java SDK提供特定語言客戶端模型做簡單互動。其中一些SDK也提供網頁來和後端互動,從而不用編寫程式碼。
為了保證網路框架的互操作性,它們必須表現的一樣。因此我們需要建立一系列基於HTTP的測試。這是我們的相容性測試工具。這個專案由我們的SDK工程師維護,他們精通不止一種語言。因此我們需要跨語言測試工具,謝天謝地Rest-assured來了。
Rest-assured是Java領域特定語言(DSL domain-specific language)用來測試REST服務,它簡單易用易上手,甚至對於沒有用過Java的開發者也是難以置信的強大。它提供先進的特性,比如細節配置、過濾器、定製分析、跨站請求偽造(CSRF)和OAuth 2.0。它提供非常簡單的語法:given-when-then。
舉個例子:讓我們來看它如何校驗“向/login路徑傳送post認證資訊請求返回302狀態碼”:
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服務,以便測試在上面執行。講道理的話,我們需要每次構建時自動測試,Gargo Plugin就是為此而生。
Cargo用標準的方式簡單封裝各種應用容器。我們使用Cargo可以毫不費力的在不同的Servlet容器(比如Jetty和Tomcat)中執行我們的程式碼。我們只需要在我們的pom檔案中配置Cargo Maven2 Plugin來啟動一個Servlet容器(Tomcat7),在測試階段編譯最近的War包,你可以在我們的Servlet外掛例子中看到配置。
4.Git
我們能討論哪些關於Git你不瞭解的事情呢?想要深入瞭解Git,你可以看他們的About頁。
我們的Java SDK團隊遍佈全球,而且彼此之間幾乎從未坐在一起。Git保障了我們寫的每一行程式碼,這裡有一些非常棒的命令,節省了我們大量的時間:
- git mv –force foo.java Foo.java:在大小寫敏感的檔案系統中改變檔名是非常麻煩的,這個命令能讓git意識到foo.java重新命名為Foo.java
- git diff-tree –no-commit-id –name-only -r <commit_ID>:檢視所有在<commit_ID>這次提交中更改的檔案。
- git diff –name-only SHA1 SHA2:列舉出在SHA1和SHA2兩次提交之間所有更改的檔案。
- 在一個檔案的歷史提交記錄中查詢某個字串:建立search.sh檔案,貼上下面程式碼:
git rev-list --all $2 | ( while read revision; do git grep -F $1 $revision $2 done )
命令可以通過這種方式執行:sh ./search.sh string_to_search file_where_to_search
5.GitHub
GitHub不僅僅為我們的Git專案提供託管服務,它為程式碼開源並讓全世界都看到做出了巨大貢獻。這鼓舞了人們去嘗試、去交流、去練習,很大程度提高了每個人的專案質量和大家的技術水平。
GitHub允許我們跟進我們的issue.遊客可以提交新需求和報告bug。他們也可以收到我們專案進展的通知。
6.Maven
Maven已經足夠出名了。所以我不會用長篇幅解釋為什麼我們使用Maven做構建管理。然而我可以分享幾個技巧,讓你的Maven更得心應手:
管理依賴:在一個多模組的專案中,你需要在根pom.xml的<dependencyManagement>標籤中定義每一個依賴。一旦你這樣做,所有下層模組都可以不需要指定版本。這種管理依賴的方式(比如版本升級)可以集中處理,所有下層模組都會自動識別。比如在根pom.xml:
<dependencyManagement> <dependencies> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> ... <dependencies> <dependencyManagement>
下層模組的pom.xml:
<dependencies> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <!-- 注意這裡沒有指定版本 --> </dependency> ... <dependencies>
阻止下層模組編譯:在釋出的時候我們需要所有下層模組一起釋出,但是我們如何避免某個模組(比如example)釋出呢?很簡單,只需要把下面的pom檔案加入到你不想釋出的模組:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> <configuration> <skip>true</skip> <!-- (敲黑板)這是重點 --> </configuration> </plugin>
跳過整合測試:我們有很多整合測試需要很長時間編譯。這些測試確保了後端整體執行正常.在頻繁的本地部署期間,我們多次因為新功能或修復bug而更改程式碼。並不需要每次在本地構建的時候執行這些測試,這會拖慢開發進度。因此我們要確保我們的Java SDK只在我們的CI伺服器上執行的時候執行整合測試。可以通過下面方法:
根pom.xml檔案:
<properties> <skipITs>true</skipITs> </properties> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.19.1</version> <configuration> <skipITs>${skipITs}</skipITs> <includes> <include>**/*IT.*</include> </includes> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> </plugins> <build>
所以你可以想象到,所有整合測試檔案以IT結尾,來保證配置正常運作,比如:ApplicationIT.groovy 或 I18nIT.groovy
然後,如果我們想讓整合測試執行,我們執行以下構建: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等等),還可以批量按序執行請求。Postman通過友好的介面幫助你構建複雜的命令,你所需要做的就是填寫一個表單,簡直不能再棒了。
總結
使用正確的工具不僅僅幫助你節省時間提高效率,還能提高你作品的質量並享受日常工作。我們要時刻留心,發現並學習新的工具。一開始可能需要一些努力,但你總會意識到付出的時間是值得的。
譯文連結:http://www.codeceo.com/article/8-tools-every-java-developer-love.html
英文原文:Eight Tools Every Java Developer Should Know (and Love)
翻譯作者:碼農網 – 孫騰浩
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 每個Java開發者都應該知道的5個JDK工具JavaJDK
- 每個 Java 開發者都應該知道的 5 個註解Java
- 每個開發者都應該知道的33個JavaScript概念JavaScript
- 每個Android開發者應該知道的6個SDK和APIAndroidAPI
- 每個 Web 開發者應該知道的 jQuery i18n 知識WebjQuery
- 每個Web開發者都應該知道的關 URL編碼的知識Web
- 每個前端應該知道的jquery 細節前端jQuery
- 每個PHP開發者都應該看的書PHP
- [譯]每個 iOS 開發者都該知道的 17 個 Xcode 小技巧iOSXCode
- 每個 Linux 新手都應該知道的 10 個命令Linux
- 每個程式設計師應該知道的12個API程式設計師API
- 每個MySQL開發者都應該瞭解的10個技巧MySql
- 每個Javascript開發者都應當知道的那些事JavaScript
- IT職場:每個黑帶都應該知道的事
- 每個極客都應該知道的Linux技巧Linux
- 每個Java軟體架構師都應該知道的20件事Java架構
- 每個 Kubernetes 應聘者應該知道的 5 個面試題面試題
- 每個運維人員應該知道的 10 個 Linux 命令!運維Linux
- 每個開發人員應該知道的 10 個 Linux 命令Linux
- 每個程式設計師應該知道12件事程式設計師
- 重要!每個開發者都應該掌握的9個核心演算法演算法
- Java開發者應該知道的五款錯誤跟蹤工具Java
- Web開發者應當知道的5個JavaScript工具WebJavaScript
- 每個開發人員都應該知道的 10 個 GitHub 倉庫Github
- 每個程式設計師都應該知道的 15 個最佳 PHP 庫程式設計師PHP
- 每個C++開發者都應該使用的十個C++11特性C++
- 有關網頁渲染,每個前端開發者都該知道的那點事網頁前端
- 開發者應該避免使用的6個Java功能Java
- 每個開發人員都應該知道的WebSockets知識Web
- 每個Python新手都應該知道的程式設計技巧Python程式設計
- 每個 Python 高手都應該知道的內建函式Python函式
- 每個Android程式設計師應該知道的KotlinAndroid程式設計師Kotlin
- 你應當知道的7個Java工具Java
- 每個開發者都應該使用的VSCode外掛 - tvkoushikVSCode
- 每一個JavaScript開發者應該瞭解的浮點知識JavaScript
- 每個Android開發者都應該瞭解的資源列表Android
- 為什麼每個Android開發者都應該使用AnkoAndroid
- 每個資料科學專家都應該知道的六個概率分佈資料科學概率分佈