一鍵自動(dòng)化單元測(cè)試,Junit還有哪些執(zhí)行器?探索Runner之旅揭秘
懶人們覺(jué)得,得手動(dòng)點(diǎn)擊成百上千次按鈕,那簡(jiǎn)直是種煎熬,感覺(jué)就像被困在牢里一樣痛苦。為此,有人開發(fā)了一個(gè)工具來(lái)應(yīng)對(duì)這個(gè)問(wèn)題。那么,當(dāng)我們想開發(fā)一個(gè)工具,對(duì)整個(gè)代碼項(xiàng)目進(jìn)行全面檢查,并用lombok來(lái)替換getter/setter方法時(shí),我們?cè)撊绾尾僮鳎?/p>
懶人心態(tài)
許多人對(duì)繁重的手動(dòng)任務(wù)感到痛苦不堪。以代碼修改為例,若需替換眾多getter/setter和toString方法,逐一點(diǎn)擊數(shù)百次按鈕,無(wú)疑會(huì)耗費(fèi)大量時(shí)間和精力。這種情況并非少數(shù),許多程序員在處理這類重復(fù)工作時(shí)都會(huì)感到煩躁。在現(xiàn)實(shí)的工作場(chǎng)景中,比如在繁忙的辦公室里,程序員們正忙于完成項(xiàng)目,這樣的繁瑣操作更是讓人難以忍受。
private static List scanJavaFiles(File file) {
List result = Lists.newArrayList();
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files == null) {
return result;
}
for (File f : files) {
result.addAll(scanJavaFiles(f));
}
}
if (file.getName().endsWith(".java")) {
result.add(file);
}
return result;
}
在軟件開發(fā)過(guò)程中,若項(xiàng)目進(jìn)度緊迫,那些額外的工作無(wú)疑會(huì)讓人感到壓力山大。比如,一個(gè)項(xiàng)目需要在短短一個(gè)月內(nèi)完成,每天都會(huì)有新任務(wù)加入,這些紛繁復(fù)雜的操作不僅會(huì)拖慢工作節(jié)奏,還會(huì)讓人倍感煩惱。
工具需求分析
進(jìn)行代碼工程的全面檢查,首先要清晰界定目標(biāo)和具體要求。在龐大的代碼庫(kù)中,文件數(shù)量龐大,比如一個(gè)企業(yè)級(jí)項(xiàng)目可能包含數(shù)百甚至上千個(gè)類文件。我們需要找出哪些類的getter/setter缺乏特定邏輯,可以替換。同時(shí),還需注意代碼的兼容性,確保使用lombok不會(huì)影響現(xiàn)有功能的正常運(yùn)行。
需留意版本差異。若公司內(nèi)Java版本偏低,可能影響lombok部分功能。例如,Java 8與Java 11在特性上有所區(qū)別,需確保各版本工具均能正常運(yùn)作。此外,還需考慮項(xiàng)目所依賴的框架及其他環(huán)境要素。
JavaParser簡(jiǎn)介
JavaParser是一款極具價(jià)值的開源Java代碼解析工具。在眾多開源項(xiàng)目中,它顯得格外突出。它能對(duì)代碼中的各類元素進(jìn)行深入分析,包括類、方法、字段等。例如,它能明確指出一個(gè)類的繼承鏈,若在復(fù)雜的類層級(jí)中,資源管理類從基礎(chǔ)類模板繼承而來(lái),JavaParser便能準(zhǔn)確識(shí)別。
JavaParser能夠提取方法參數(shù)及返回類型等關(guān)鍵信息。遇到方法參數(shù)眾多或返回類型復(fù)雜的情況,JavaParser能提供清晰的解析支持。此外,它還能協(xié)助生成代碼片段,無(wú)論是構(gòu)建新類、方法或字段,或是制作代碼文檔,都十分便捷。
使用JavaParser解析類
JavaParser位于com.github.javaparser包中,是執(zhí)行代碼解析的關(guān)鍵類。在眾多代碼處理任務(wù)中,它不可或缺。例如,在分析大型項(xiàng)目的多個(gè)類文件時(shí),JavaParser就能高效地完成解析工作。以電商平臺(tái)的訂單管理模塊為例,其中包含大量類文件,JavaParser能出色地完成解析任務(wù)。
StaticJavaParser把源文件轉(zhuǎn)換成CompilationUnit,這個(gè)轉(zhuǎn)換在parse方法中進(jìn)行,JavaParser在這里執(zhí)行了真正的解析工作。通過(guò)這種方式,我們可以獲得文件結(jié)構(gòu)的抽象表示,從而清晰地了解源文件中各個(gè)元素之間的聯(lián)系。
CompilationUnit的重要性
CompilationUnit是Java源代碼文件的起始點(diǎn)。這個(gè)節(jié)點(diǎn)涵蓋了文件的完整結(jié)構(gòu)。在進(jìn)行代碼優(yōu)化時(shí),它提供了公開的接口來(lái)訪問(wèn)和調(diào)整文件內(nèi)的各個(gè)元素。無(wú)論是添加還是移除代碼,都必須要對(duì)它進(jìn)行操作。
開發(fā)者能夠創(chuàng)建自定義的訪問(wèn)者,通過(guò)遍歷抽象語(yǔ)法樹來(lái)訪問(wèn)特定種類的節(jié)點(diǎn)。比如,針對(duì)數(shù)據(jù)庫(kù)連接模塊,若要優(yōu)化相關(guān)代碼,開發(fā)者可以編寫專門的訪問(wèn)者來(lái)執(zhí)行操作,包括代碼分析和重構(gòu)等任務(wù)。
Printer的作用
Printer在轉(zhuǎn)換AST為Java源代碼字符串表示時(shí)扮演著核心角色。在編寫整個(gè)優(yōu)化工具的過(guò)程中,它確保了修改后的代碼能夠準(zhǔn)確無(wú)誤地更新到原始的Java文件中。
修改代碼后,特別是不停更替多個(gè)類的getter/setter,若需恢復(fù)改動(dòng)后的代碼結(jié)構(gòu),Printer是必用工具。它確保了代碼修改全程的周密性和精確度。
<dependency>
<groupId>com.jd.omni.opdd</groupId>
<artifactId>lombok-replace</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.jd.omni.opdd.tools.lombok.LombokConverter</mainClass>
<arguments>
<argument>../../pop-jingme-customs</argument>
</arguments>
</configuration>
</plugin>
作者:小藍(lán)
鏈接:http://www.tymcc.com.cn/content/7459.html
本站部分內(nèi)容和圖片來(lái)源網(wǎng)絡(luò),不代表本站觀點(diǎn),如有侵權(quán),可聯(lián)系我方刪除。