国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

IDEA懶人必備插件:自動生成單元測試,太爽了!

這篇具有很好參考價值的文章主要介紹了IDEA懶人必備插件:自動生成單元測試,太爽了!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

今天來介紹一款工具Squaretest,它是一款自動生成單元測試的插件,會用到它也是因為最近公司上了代碼質(zhì)量管控的指標(biāo),會考評各個項目的單元測試覆蓋率,以及sonar掃描出來的各種問題。

很多老項目老代碼,或者著急交付的項目,單元測試嚴(yán)重缺失,覆蓋率只有5%不到,所以幾個小伙伴這幾天就在瘋狂的堆單元測試,3個人堆了2天才堆到30%,于是我也來上手幫忙寫了兩個,寫到第二個的時候就發(fā)現(xiàn),這個活不應(yīng)該是人干的,要去看原來的代碼,然后根據(jù)邏輯寫各種Mock,感覺是有跡可循的東西,所以就查了下,發(fā)現(xiàn)果然有插件幫我們來干這個事情,那么解下來就來看看。

我使用的是idea,我們先來下載一下插件,File——>Settings——>Plugins,搜索Squaretest,然后install就好了,插件安裝完成后需要重啟一下

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

重啟之后,菜單欄就多了一項Squaretest,下面我們來講下怎么用,大家也可以通過看這個菜單的最后一項:Generate Test Methods(Help)來看它的一個演示,但演示不太全,我下面截圖給大家看下我怎么用的,以及一些使用心得。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

首先我們打開一個類,這個類就是我們即將要作為實驗的類,這個類有7個public方法,因為Squaretest生成的單元測試方法都是只能生成public的,當(dāng)然這也是合理的嘛!畢竟private的肯定被public調(diào)用了。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

如果我們來手寫這個類的單元測試,光看都要一會,下面看我操作,打開你的類,光標(biāo)定位到代碼里,右擊鼠標(biāo)選擇Generate…

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

然后你就會看到這里有兩個熟悉的圖標(biāo),第一次的話選擇第二個選項,它會讓你選擇你一下單元測試的模板,因為我已經(jīng)選擇過了,所以我現(xiàn)在演示不回再彈出,但后面我會告訴你怎么更改模板。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

選擇第二項后就會彈出一個框看下面這里它自動會識別出當(dāng)前類需要Mock的成員變量,直接點ok

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

自動會使用類的真實目錄層次在test文件夾中創(chuàng)建出來一個單元測試類,類名就是原類名后加Test

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

我把代碼貼出來給大家看看它生成出來的是什么樣的,看看嚇不嚇人,牛逼牛逼,7個單元測試方法,秒秒鐘就出來了,各位看官你們自己寫要多久能寫出來,畢竟時間就是金錢??!然后我們執(zhí)行一把試試!

public?class?CrawlerScreenShotServiceImplTest?{

????@Mock
????private?CrawerScreenShotTaskMapper?mockCrawerScreenShotTaskMapper;
????@Mock
????private?CrawerScreenShotTaskLogMapper?mockCrawerScreenShotTaskLogMapper;

????@InjectMocks
????private?CrawlerScreenShotServiceImpl?crawlerScreenShotServiceImplUnderTest;

????@Before
????public?void?setUp()?{
????????initMocks(this);
????}

????@Test
????public?void?testReceiveData()?{
????????//?Setup
????????final?CrawlerScreenShotVO?vo?=?new?CrawlerScreenShotVO();
????????vo.setUrl("url");
????????vo.setPcFlag(false);
????????vo.setMembergroup("membergroup");
????????vo.setTaskType(0);
????????vo.setUrlType(0);

????????when(mockCrawerScreenShotTaskLogMapper.saveSelective(any(CrawerScreenShotTaskLog.class))).thenReturn(0);
????????when(mockCrawerScreenShotTaskMapper.saveBatch(Arrays.asList(new?CrawlerScreenShotTask(0L,?"url",?"imageOssUrl",?false,?false,?"memberGroup",?0,?0,?"fileName",?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime(),?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime(),?false,?"skuCode",?"state",?"operater")))).thenReturn(0);

????????//?Run?the?test
????????final?Result<String>?result?=?crawlerScreenShotServiceImplUnderTest.receiveData(vo);

????????//?Verify?the?results
????}

????@Test
????public?void?testListJobScreenShotTask()?{
????????//?Setup

????????//?Configure?CrawerScreenShotTaskMapper.listJobScreenShotTask(...).
????????final?CrawlerScreenShotTaskDto?crawlerScreenShotTaskDto?=?new?CrawlerScreenShotTaskDto();
????????crawlerScreenShotTaskDto.setId(0L);
????????crawlerScreenShotTaskDto.setUrl("url");
????????crawlerScreenShotTaskDto.setSkuCode("skuCode");
????????crawlerScreenShotTaskDto.setPcFlag(false);
????????crawlerScreenShotTaskDto.setMemberGroup("memberGroup");
????????crawlerScreenShotTaskDto.setUrlType(0);
????????crawlerScreenShotTaskDto.setFileName("fileName");
????????crawlerScreenShotTaskDto.setTaskType(0);
????????crawlerScreenShotTaskDto.setState("state");
????????final?List<CrawlerScreenShotTaskDto>?crawlerScreenShotTaskDtos?=?Arrays.asList(crawlerScreenShotTaskDto);
????????when(mockCrawerScreenShotTaskMapper.listJobScreenShotTask(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime())).thenReturn(crawlerScreenShotTaskDtos);

????????//?Run?the?test
????????final?List<CrawlerScreenShotTaskDto>?result?=?crawlerScreenShotServiceImplUnderTest.listJobScreenShotTask();

????????//?Verify?the?results
????}

????@Test
????public?void?testQuery()?{
????????//?Setup
????????final?NikeScreenShotListRequestVo?requestVo?=?new?NikeScreenShotListRequestVo();
????????requestVo.setUrl("url");
????????requestVo.setUrlType(0);
????????requestVo.setStartTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????requestVo.setEndTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????requestVo.setStatus(0);
????????requestVo.setPcFlag(0);
????????requestVo.setPageNum(0);
????????requestVo.setPageSize(0);

????????//?Configure?CrawerScreenShotTaskMapper.query(...).
????????final?PimScreenShotVo?pimScreenShotVo?=?new?PimScreenShotVo();
????????pimScreenShotVo.setId(0L);
????????pimScreenShotVo.setUrl("url");
????????pimScreenShotVo.setImageOssUrl("imageOssUrl");
????????pimScreenShotVo.setStatus(0);
????????pimScreenShotVo.setPcFlag(false);
????????pimScreenShotVo.setCreateTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????pimScreenShotVo.setUrlType(0);
????????pimScreenShotVo.setMsg("msg");
????????final?List<PimScreenShotVo>?pimScreenShotVos?=?Arrays.asList(pimScreenShotVo);
????????when(mockCrawerScreenShotTaskMapper.query(any(NikeScreenShotListRequestVo.class))).thenReturn(pimScreenShotVos);

????????//?Run?the?test
????????final?PageInfo<PimScreenShotVo>?result?=?crawlerScreenShotServiceImplUnderTest.query(requestVo);

????????//?Verify?the?results
????}

????@Test
????public?void?testQuerySelectBoxData()?{
????????//?Setup

????????//?Configure?CrawerScreenShotTaskMapper.query(...).
????????final?PimScreenShotVo?pimScreenShotVo?=?new?PimScreenShotVo();
????????pimScreenShotVo.setId(0L);
????????pimScreenShotVo.setUrl("url");
????????pimScreenShotVo.setImageOssUrl("imageOssUrl");
????????pimScreenShotVo.setStatus(0);
????????pimScreenShotVo.setPcFlag(false);
????????pimScreenShotVo.setCreateTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????pimScreenShotVo.setUrlType(0);
????????pimScreenShotVo.setMsg("msg");
????????final?List<PimScreenShotVo>?pimScreenShotVos?=?Arrays.asList(pimScreenShotVo);
????????when(mockCrawerScreenShotTaskMapper.query(any(NikeScreenShotListRequestVo.class))).thenReturn(pimScreenShotVos);

????????//?Run?the?test
????????final?PimScreenShotTaskParamsDto?result?=?crawlerScreenShotServiceImplUnderTest.querySelectBoxData();

????????//?Verify?the?results
????}

????@Test
????public?void?testFindExecutionScreenShotTaskCount()?{
????????//?Setup
????????when(mockCrawerScreenShotTaskMapper.findExecutionScreenShotTaskCount()).thenReturn(0);

????????//?Run?the?test
????????final?Integer?result?=?crawlerScreenShotServiceImplUnderTest.findExecutionScreenShotTaskCount();

????????//?Verify?the?results
????????assertEquals(0,?result);
????}

????@Test
????public?void?testFindCrawerScreenshotTaskByCreateTime()?{
????????//?Setup
????????final?CrawlerScreenShotTaskSyncDto?crawlerScreenShotTaskSyncDto?=?new?CrawlerScreenShotTaskSyncDto();
????????crawlerScreenShotTaskSyncDto.setId(0L);
????????crawlerScreenShotTaskSyncDto.setUrl("url");
????????crawlerScreenShotTaskSyncDto.setSkuCode("skuCode");
????????crawlerScreenShotTaskSyncDto.setTaskType(0);
????????crawlerScreenShotTaskSyncDto.setStatus(0);
????????crawlerScreenShotTaskSyncDto.setLastModifyTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????crawlerScreenShotTaskSyncDto.setOperater("operater");
????????crawlerScreenShotTaskSyncDto.setMsg("msg");
????????final?List<CrawlerScreenShotTaskSyncDto>?expectedResult?=?Arrays.asList(crawlerScreenShotTaskSyncDto);

????????//?Configure?CrawerScreenShotTaskMapper.findCrawerScreenshotTaskByCreateTime(...).
????????final?CrawlerScreenShotTaskSyncDto?crawlerScreenShotTaskSyncDto1?=?new?CrawlerScreenShotTaskSyncDto();
????????crawlerScreenShotTaskSyncDto1.setId(0L);
????????crawlerScreenShotTaskSyncDto1.setUrl("url");
????????crawlerScreenShotTaskSyncDto1.setSkuCode("skuCode");
????????crawlerScreenShotTaskSyncDto1.setTaskType(0);
????????crawlerScreenShotTaskSyncDto1.setStatus(0);
????????crawlerScreenShotTaskSyncDto1.setLastModifyTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());
????????crawlerScreenShotTaskSyncDto1.setOperater("operater");
????????crawlerScreenShotTaskSyncDto1.setMsg("msg");
????????final?List<CrawlerScreenShotTaskSyncDto>?crawlerScreenShotTaskSyncDtos?=?Arrays.asList(crawlerScreenShotTaskSyncDto1);
????????when(mockCrawerScreenShotTaskMapper.findCrawerScreenshotTaskByCreateTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime())).thenReturn(crawlerScreenShotTaskSyncDtos);

????????//?Run?the?test
????????final?List<CrawlerScreenShotTaskSyncDto>?result?=?crawlerScreenShotServiceImplUnderTest.findCrawerScreenshotTaskByCreateTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());

????????//?Verify?the?results
????????assertEquals(expectedResult,?result);
????}

????@Test
????public?void?testQueryCrawlerDashboard()?{
????????//?Setup
????????when(mockCrawerScreenShotTaskMapper.queryCrawlerDashboard(0,?0,?0,?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime(),?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime())).thenReturn(0);

????????//?Run?the?test
????????final?Integer?result?=?crawlerScreenShotServiceImplUnderTest.queryCrawlerDashboard(0,?0,?0,?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime(),?new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime());

????????//?Verify?the?results
????????assertEquals(0,?result);
????}
}

?報錯了呢,不要慌,這個斷言是為了檢查你單元測試跑出來的結(jié)果是否符合預(yù)期的,如果你不想檢查只想完成覆蓋率,直接干掉就可以了(手動狗頭)。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

怎么樣!刺不刺激,爽不爽,秒秒鐘90多行的代碼覆蓋率就到了90%以上。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

上面說過第一次進(jìn)來會讓你選擇單元測試的模板,如果你要切換的話可以在單元測試類中按快捷鍵,Alt+M,或者通過Squaretest的菜單倒數(shù)第二個,下面這個就是按快捷鍵的效果,我選擇的是這個模板,你們也可以借鑒。

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

OK,以上Squaretest部分就結(jié)束了,當(dāng)然拉也不能高興的太早,這個類算是比較成功的情況,很多時候還是要你自己小修小改的,畢竟它生成出來的測試數(shù)據(jù)可能完全匹配不上你的if else數(shù)據(jù)對吧,但這都很好改啊,這樣就從自己分析if else變成了,debug程序了呀,哪里報錯,debug過去,看看是不是生成的數(shù)據(jù)有問題,改個數(shù)據(jù),就通過了,反正本人用的是很舒暢的,妥妥的節(jié)省70%的工作量。

解決了上面一個問題之后,又發(fā)現(xiàn)另一個問題,這個工具VO,DTO,Entity,Command,Model這種實體類來講,一般這種實體類我們都用lombok的注解get,set,還有constract構(gòu)造器等注解,但是這個工具只能生成這些實體類的構(gòu)造器的單元測試,無法生成get set方法的單元測試,所以寫了個base方法,實體類繼承一下,簡單的寫兩行帶就好了,看下面代碼:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public?abstract?class?BaseVoEntityTest<T>?{
????protected?abstract?T?getT();

????private?void?testGetAndSet()?throws?IllegalAccessException,?InstantiationException,?IntrospectionException,
????????????InvocationTargetException?{
????????T?t?=?getT();
????????Class?modelClass?=?t.getClass();
????????Object?obj?=?modelClass.newInstance();
????????Field[]?fields?=?modelClass.getDeclaredFields();
????????for?(Field?f?:?fields)?{
????????????boolean?isStatic?=?Modifier.isStatic(f.getModifiers());
????????????//?過濾字段
????????????if?(f.getName().equals("isSerialVersionUID")?||?f.getName().equals("serialVersionUID")?||?isStatic?||?f.getGenericType().toString().equals("boolean")
????????????????????||?f.isSynthetic())?{
????????????????continue;
????????????}
????????????PropertyDescriptor?pd?=?new?PropertyDescriptor(f.getName(),?modelClass);
????????????Method?get?=?pd.getReadMethod();
????????????Method?set?=?pd.getWriteMethod();
????????????set.invoke(obj,?get.invoke(obj));
????????}
????}

????@Test
????public?void?getAndSetTest()?throws?InvocationTargetException,?IntrospectionException,
????????????InstantiationException,?IllegalAccessException?{
????????this.testGetAndSet();
????}

}

同樣的方式我們在實體類上通過Squaretest生成單元測試,然后繼承我上面寫的那個base類,vo的單元測試代碼稍加改動,如下

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)

看run完之后,覆蓋率100%,妥妥的,通過這兩個解決方案,一天之內(nèi)我們就把覆蓋率搞到了60%以上,不要太刺激,大家可以用用試試哦,當(dāng)然這個也不是純?yōu)榱藨?yīng)付差事寫的單元測試,我們后續(xù)開發(fā)的時候,也可以用這個工具來生成,然后自測自己的代碼,這樣也是提升工作效率的嘛!

IDEA懶人必備插件:自動生成單元測試,太爽了!,intellij-idea,java,ide,程序人生,學(xué)習(xí)?文章來源地址http://www.zghlxwxcb.cn/news/detail-778857.html

到了這里,關(guān)于IDEA懶人必備插件:自動生成單元測試,太爽了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • IDEA插件-----Squaretest(自動生成單元測試)

    IDEA插件-----Squaretest(自動生成單元測試)

    菜單欄就多了一項Squaretest 首先我們打開一個類,這個類就是我們即將要作為實驗的類,這個類有7個public方法,因為Squaretest生成的單元測試方法都是只能生成public的,當(dāng)然這也是合理的嘛!畢竟private的肯定被public調(diào)用了。 打開你的類,光標(biāo)定位到代碼里,右擊鼠標(biāo)選擇Gen

    2024年02月11日
    瀏覽(26)
  • 一款自動生成單元測試的 IDEA 插件

    一款自動生成單元測試的 IDEA 插件

    ? 今天來介紹一款工具Squaretest,它是一款自動生成單元測試的插件,為什么會用到它? 主要因為最近公司上了代碼質(zhì)量管控的指標(biāo),會考評各個項目的單元測試覆蓋率,以及sonar掃描出來的各種問題,很多老項目老代碼,或者著急交付的項目,單元測試嚴(yán)重缺失,覆蓋率只有

    2024年04月11日
    瀏覽(22)
  • Springboot 使用插件 自動生成Mock單元測試 Squaretest

    Springboot 使用插件 自動生成Mock單元測試 Squaretest

    很多公司對分支單測覆蓋率會有一定的要求,比如 單測覆蓋率要達(dá)到 60% 或者 80%才可以發(fā)布。 有時候工期相對緊張,就優(yōu)先開發(fā)功能,測試功能,然后再去補(bǔ)單元測試。 但是編寫單元測試又比較浪費時間,有沒有能夠很大程度上自動化生成單元測試的插件,自己改下就行

    2023年04月08日
    瀏覽(36)
  • 工具—IDEA代碼自動生成插件EasyCode

    工具—IDEA代碼自動生成插件EasyCode

    官網(wǎng)簡介 基于IntelliJ IDEA開發(fā)的代碼生成插件,支持自定義任意模板(Java,html,js,xml)。 只要是與數(shù)據(jù)庫相關(guān)的代碼都可以通過自定義模板來生成。支持?jǐn)?shù)據(jù)庫類型與java類型映射關(guān)系配置。 支持同時生成生成多張表的代碼。每張表有獨立的配置信息。完全的個性化定義,

    2024年02月09日
    瀏覽(33)
  • java單元測試自動生成測試用例插件diffblue cover和evosuite

    Diffblue Cover和Evosuite都可以通過IDEA插件安裝。兩者的區(qū)別如下: evosuite安裝無需聯(lián)網(wǎng)。diffblue cover社區(qū)版安裝無需聯(lián)網(wǎng),但需要聯(lián)網(wǎng)激活。 使用Jacoco或idea的coverage插件獲取覆蓋率時,Evosuite生成的用例只能顯示出覆蓋率,不會顯示哪塊代碼沒有覆蓋。diffblue cover生成的用例可與

    2024年02月11日
    瀏覽(26)
  • idea一鍵自動生成對象所有g(shù)et、set方法。idea插件:GenerateAllSetter

    idea一鍵自動生成對象所有g(shù)et、set方法。idea插件:GenerateAllSetter

    idea中有一款插件能夠一鍵自動生成對象所有的get、set方法,有助于我們開發(fā)者提升開發(fā)效率的插件,非常簡單實用。 插件名: GenerateAllSetter 。 該插件作用是可以快速針對已有的model實體對象的屬性生產(chǎn)get、set代碼,免去開發(fā)者在開發(fā)過程中g(shù)et、set屬性值時還需要去實體對象

    2024年02月11日
    瀏覽(42)
  • Intellij IDEA插件之自動生成時序圖(Sequence Diagram)

    Intellij IDEA插件之自動生成時序圖(Sequence Diagram)

    ????????小伙們,你們有沒有發(fā)現(xiàn),身邊經(jīng)常有這樣一些人,看著平時沒怎么干活,到關(guān)鍵時候需要展示工作成果,會發(fā)現(xiàn)這些人也有工作成果,甚至比辛苦在干的人可能還要多一些。按常理推測,這絕對不是一件科學(xué)的事,但是有沒有一種可能?是因為這些看似沒怎么干

    2023年04月23日
    瀏覽(34)
  • 自動生成單元測試、外掛開源代碼庫等新功能,上線JetBrains IDEs的CodeGeeX插件!

    自動生成單元測試、外掛開源代碼庫等新功能,上線JetBrains IDEs的CodeGeeX插件!

    CodeGeeX第三代模型發(fā)布后,多項基于第三代模型能力的新功能今天也同步上線JetBrains IDEs全家桶。 用戶可以在IDEA、PyCharm等JetBrains系的IDE中,搜索下載CodeGeeX v2.5.0版本,深度使用最新功能。 一、新模型加持的代碼補(bǔ)全和智能問答 以IDEA為例,在v2.5.0版本的CodeGeeX插件中,用戶可

    2024年03月13日
    瀏覽(90)
  • 懶人自動化生成e2e測試文件:JSON => playwright

    懶人自動化生成e2e測試文件:JSON => playwright

    本工具實現(xiàn)的是:使用簡單的 JSON 配置,生成可執(zhí)行的 playwright UI 測試文件。 然后通過項目內(nèi)已經(jīng)配置好的 playwright 配置實現(xiàn) UI 測試。 工具工作流程: 期望達(dá)到的目的是: ? 基礎(chǔ)頁面(進(jìn)入頁面)即獲取頁面快照對比 ? 等待頁面某些請求結(jié)束,才進(jìn)行頁面快照對比 ??

    2024年02月16日
    瀏覽(27)
  • Idea中 css 、js 壓縮插件會自動生成xxx.min.css、xxx.min.js文件

    Idea中 css 、js 壓縮插件會自動生成xxx.min.css、xxx.min.js文件

    第一步:下載 yuicompressor-2.4.8.jar 下載路徑:打開搜索 YUI compressor Maven Repository: Search/Browse/Explore (mvnrepository.com) https://mvnrepository.com/ 找到點擊下載即用(如下圖) 創(chuàng)建文件夾,放入idea文件中 第二步:安裝插件 File Watchers 找到Settings設(shè)置 點擊plugins插件,輸入搜索File Watchers 進(jìn)

    2024年02月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包