IDEA懶人必備插件:自動(dòng)生成單元測(cè)試,太爽了!-創(chuàng)新互聯(lián)

今天,我們將介紹一個(gè)工具Squaretest,它是一個(gè)用于自動(dòng)生成單元測(cè)試的插件。它也將被使用,因?yàn)樵摴咀罱鼘?shí)施了代碼質(zhì)量控制指標(biāo),以評(píng)估各種項(xiàng)目的單元測(cè)試覆蓋率和聲納掃描的各種問題。
許多舊項(xiàng)目和舊代碼,或者需要匆忙交付的項(xiàng)目,都嚴(yán)重缺少單元測(cè)試,覆蓋率不到5%。所以最近幾天,幾個(gè)小伙伴一直在瘋狂地堆積單元測(cè)試。三個(gè)人把兩天的單元測(cè)試?yán)鄯e到30%。所以我也來幫忙寫了兩篇。當(dāng)我寫第二篇時(shí),我發(fā)現(xiàn)這項(xiàng)工作不應(yīng)該由人來做。我們應(yīng)該查看原始代碼,然后根據(jù)邏輯編寫各種模擬,我覺得有一些東西可以遵循,所以我檢查了一下,發(fā)現(xiàn)有插件可以幫助我們做到這一點(diǎn)。然后我看了一眼。
我使用這個(gè)想法。首先,讓我們下載插件。文件-->設(shè)置-->插件,搜索Squaretest,然后安裝它。安裝插件后,需要重新啟動(dòng)它

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、新密網(wǎng)絡(luò)推廣、小程序定制開發(fā)、新密網(wǎng)絡(luò)營(yíng)銷、新密企業(yè)策劃、新密品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供新密建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn

重新啟動(dòng)后,菜單欄會(huì)有一個(gè)額外的方形測(cè)試。讓我們來討論一下如何使用它。通過查看菜單的最后一項(xiàng):生成測(cè)試方法(幫助),您也可以看到它的演示,但演示尚未完成。我將在下面截圖,向您展示如何使用它和一些經(jīng)驗(yàn)。

首先,我們開一個(gè)類,這是我們要測(cè)試的類。這個(gè)類有七個(gè)公共方法,因?yàn)镾quaretest生成的單元測(cè)試方法只能生成public。當(dāng)然,這是合理的!畢竟,私人電話必須由公眾撥打。

如果我們要手工編寫這個(gè)類的單元測(cè)試,那么需要一段時(shí)間來研究它?,F(xiàn)在讓我們來看看我的操作。打開類,將光標(biāo)放在代碼中,然后右鍵單擊鼠標(biāo)以選擇Generate…

然后您將看到兩個(gè)熟悉的圖標(biāo)。第一次選擇第二個(gè)選項(xiàng)時(shí),它將允許您為單元測(cè)試選擇模板。因?yàn)槲乙呀?jīng)選擇了它,所以我不會(huì)再次彈出演示,但稍后我會(huì)告訴您如何更改模板。

選擇第二項(xiàng)后,將彈出一個(gè)框。在這里,它將自動(dòng)識(shí)別需要Mock的當(dāng)前類的成員變量。直接單擊“確定”

將使用類的真實(shí)目錄層次結(jié)構(gòu)在測(cè)試文件夾中自動(dòng)創(chuàng)建單元測(cè)試類。類名是原始類名,后跟Test

我會(huì)把代碼發(fā)給你,看看它生成了什么。讓我們看看它是否可怕、可怕、可怕。七種單元測(cè)試方法將在幾秒鐘內(nèi)發(fā)布。你要寫多長(zhǎng)時(shí)間?畢竟,時(shí)間就是金錢!那我們?cè)囋嚢桑?/p>

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?Resultresult?=?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?ListcrawlerScreenShotTaskDtos?=?Arrays.asList(crawlerScreenShotTaskDto);
????????when(mockCrawerScreenShotTaskMapper.listJobScreenShotTask(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime())).thenReturn(crawlerScreenShotTaskDtos);

????????//?Run?the?test
????????final?Listresult?=?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?ListpimScreenShotVos?=?Arrays.asList(pimScreenShotVo);
????????when(mockCrawerScreenShotTaskMapper.query(any(NikeScreenShotListRequestVo.class))).thenReturn(pimScreenShotVos);

????????//?Run?the?test
????????final?PageInforesult?=?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?ListpimScreenShotVos?=?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?ListexpectedResult?=?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?ListcrawlerScreenShotTaskSyncDtos?=?Arrays.asList(crawlerScreenShotTaskSyncDto1);
????????when(mockCrawerScreenShotTaskMapper.findCrawerScreenshotTaskByCreateTime(new?GregorianCalendar(2019,?Calendar.JANUARY,?1).getTime())).thenReturn(crawlerScreenShotTaskSyncDtos);

????????//?Run?the?test
????????final?Listresult?=?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);
????}
}

不要驚慌。這個(gè)斷言是為了檢查單元測(cè)試的結(jié)果是否符合預(yù)期。

怎樣這并不令人興奮,也不酷。每秒超過90行的代碼覆蓋率超過90%。

如上所述,第一次進(jìn)來時(shí),您將被要求選擇單元測(cè)試模板。如果要切換,可以在單元測(cè)試類中按快捷鍵Alt+M,或者在Squaretest菜單中按倒數(shù)第一個(gè)。按下快捷鍵的效果如下。我選擇了這個(gè)模板,您也可以使用它作為參考。

好了,上面的SQUARETEST部分結(jié)束了。當(dāng)然,拉動(dòng)并不為時(shí)過早。這個(gè)類是一個(gè)比較成功的案例,您仍然需要做一些小的修改。畢竟,它生成的測(cè)試數(shù)據(jù)可能與if-else數(shù)據(jù)不匹配,對(duì)嗎?但這很容易改變。這從if else的自我分析變?yōu)檎{(diào)試,查看生成的數(shù)據(jù)是否有問題。更改數(shù)據(jù)將被傳遞。無論如何,我對(duì)它很滿意,我可以適當(dāng)?shù)毓?jié)省70%的工作量。
解決了上述問題后,發(fā)現(xiàn)了另一個(gè)問題。對(duì)于VO、DTO、entity、Command和Model等實(shí)體類,我們通常使用lombok注釋,如get、set和約束構(gòu)造函數(shù)。但是,該工具只能為這些實(shí)體類的構(gòu)造函數(shù)生成單元測(cè)試,而不能為get set方法生成單元測(cè)試。因此,我們編寫一個(gè)由實(shí)體類繼承的基方法,只需編寫兩行磁帶。請(qǐng)參見以下代碼:

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public?abstract?class?BaseVoEntityTest{
????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在實(shí)體類上生成單元測(cè)試,然后繼承我上面寫的基類。vo的單元測(cè)試代碼略有更改,如下所示

觀看運(yùn)行后,覆蓋率為100%,這是合適的。通過這兩種解決方案,我們可以在一天內(nèi)實(shí)現(xiàn)60%以上的覆蓋率。不要太激動(dòng)。你可以嘗試一下。當(dāng)然,這不是一個(gè)專門為跑腿而編寫的單元測(cè)試。我們還可以使用這個(gè)工具在后續(xù)開發(fā)中生成和測(cè)試我們自己的代碼,這也提高了我們的工作效率!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:IDEA懶人必備插件:自動(dòng)生成單元測(cè)試,太爽了!-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article2/degsic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、ChatGPT、虛擬主機(jī)、商城網(wǎng)站搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管