今天,我們將介紹一個工具Squaretest,它是一個用于自動生成單元測試的插件。它也將被使用,因為該公司最近實施了代碼質量控制指標,以評估各種項目的單元測試覆蓋率和聲納掃描的各種問題。
許多舊項目和舊代碼,或者需要匆忙交付的項目,都嚴重缺少單元測試,覆蓋率不到5%。所以最近幾天,幾個小伙伴一直在瘋狂地堆積單元測試。三個人把兩天的單元測試累積到30%。所以我也來幫忙寫了兩篇。當我寫第二篇時,我發現這項工作不應該由人來做。我們應該查看原始代碼,然后根據邏輯編寫各種模擬,我覺得有一些東西可以遵循,所以我檢查了一下,發現有插件可以幫助我們做到這一點。然后我看了一眼。
我使用這個想法。首先,讓我們下載插件。文件-->設置-->插件,搜索Squaretest,然后安裝它。安裝插件后,需要重新啟動它


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

首先,我們開一個類,這是我們要測試的類。這個類有七個公共方法,因為Squaretest生成的單元測試方法只能生成public。當然,這是合理的!畢竟,私人電話必須由公眾撥打。

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

然后您將看到兩個熟悉的圖標。第一次選擇第二個選項時,它將允許您為單元測試選擇模板。因為我已經選擇了它,所以我不會再次彈出演示,但稍后我會告訴您如何更改模板。

選擇第二項后,將彈出一個框。在這里,它將自動識別需要Mock的當前類的成員變量。直接單擊“確定”

將使用類的真實目錄層次結構在測試文件夾中自動創建單元測試類。類名是原始類名,后跟Test

我會把代碼發給你,看看它生成了什么。讓我們看看它是否可怕、可怕、可怕。七種單元測試方法將在幾秒鐘內發布。你要寫多長時間?畢竟,時間就是金錢!那我們試試吧!
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);
????}
} 不要驚慌。這個斷言是為了檢查單元測試的結果是否符合預期。

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

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

好了,上面的SQUARETEST部分結束了。當然,拉動并不為時過早。這個類是一個比較成功的案例,您仍然需要做一些小的修改。畢竟,它生成的測試數據可能與if-else數據不匹配,對嗎?但這很容易改變。這從if else的自我分析變為調試,查看生成的數據是否有問題。更改數據將被傳遞。無論如何,我對它很滿意,我可以適當地節省70%的工作量。
解決了上述問題后,發現了另一個問題。對于VO、DTO、entity、Command和Model等實體類,我們通常使用lombok注釋,如get、set和約束構造函數。但是,該工具只能為這些實體類的構造函數生成單元測試,而不能為get set方法生成單元測試。因此,我們編寫一個由實體類繼承的基方法,只需編寫兩行磁帶。請參見以下代碼:
@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在實體類上生成單元測試,然后繼承我上面寫的基類。vo的單元測試代碼略有更改,如下所示

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

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網站標題:IDEA懶人必備插件:自動生成單元測試,太爽了!-創新互聯
當前路徑:http://www.js-pz168.com/article2/degsic.html
成都網站建設公司_創新互聯,為您提供外貿網站建設、營銷型網站建設、ChatGPT、虛擬主機、商城網站、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯