当前位置:   article > 正文

IDEA懒人必备插件:自动生成单元测试,太爽了!_idea单元测试插件

idea单元测试插件

今天,我们将介绍一个工具Squaretest,它是一个用于自动生成单元测试的插件。它也将被使用,因为该公司最近实施了代码质量控制指标,以评估各种项目的单元测试覆盖率和声纳扫描的各种问题。
许多旧项目和旧代码,或者需要匆忙交付的项目,都严重缺少单元测试,覆盖率不到5%。所以最近几天,几个小伙伴一直在疯狂地堆积单元测试。三个人把两天的单元测试累积到30%。所以我也来帮忙写了两篇。当我写第二篇时,我发现这项工作不应该由人来做。我们应该查看原始代码,然后根据逻辑编写各种模拟,我觉得有一些东西可以遵循,所以我检查了一下,发现有插件可以帮助我们做到这一点。然后我看了一眼。
我使用这个想法。首先,让我们下载插件。文件-->设置-->插件,搜索Squaretest,然后安装它。安装插件后,需要重新启动它

 

重新启动后,菜单栏会有一个额外的方形测试。让我们来讨论一下如何使用它。通过查看菜单的最后一项:生成测试方法(帮助),您也可以看到它的演示,但演示尚未完成。我将在下面截图,向您展示如何使用它和一些经验。

 

首先,我们开一个类,这是我们要测试的类。这个类有七个公共方法,因为Squaretest生成的单元测试方法只能生成public。当然,这是合理的!毕竟,私人电话必须由公众拨打。

 

如果我们要手工编写这个类的单元测试,那么需要一段时间来研究它。现在让我们来看看我的操作。打开类,将光标放在代码中,然后右键单击鼠标以选择Generate…

然后您将看到两个熟悉的图标。第一次选择第二个选项时,它将允许您为单元测试选择模板。因为我已经选择了它,所以我不会再次弹出演示,但稍后我会告诉您如何更改模板。

选择第二项后,将弹出一个框。在这里,它将自动识别需要Mock的当前类的成员变量。直接单击“确定”

 

将使用类的真实目录层次结构在测试文件夹中自动创建单元测试类。类名是原始类名,后跟Test

 

我会把代码发给你,看看它生成了什么。让我们看看它是否可怕、可怕、可怕。七种单元测试方法将在几秒钟内发布。你要写多长时间?毕竟,时间就是金钱!那我们试试吧!

  1. public class CrawlerScreenShotServiceImplTest {
  2.     @Mock
  3.     private CrawerScreenShotTaskMapper mockCrawerScreenShotTaskMapper;
  4.     @Mock
  5.     private CrawerScreenShotTaskLogMapper mockCrawerScreenShotTaskLogMapper;
  6.     @InjectMocks
  7.     private CrawlerScreenShotServiceImpl crawlerScreenShotServiceImplUnderTest;
  8.     @Before
  9.     public void setUp() {
  10.         initMocks(this);
  11.     }
  12.     @Test
  13.     public void testReceiveData() {
  14.         // Setup
  15.         final CrawlerScreenShotVO vo = new CrawlerScreenShotVO();
  16.         vo.setUrl("url");
  17.         vo.setPcFlag(false);
  18.         vo.setMembergroup("membergroup");
  19.         vo.setTaskType(0);
  20.         vo.setUrlType(0);
  21.         when(mockCrawerScreenShotTaskLogMapper.saveSelective(any(CrawerScreenShotTaskLog.class))).thenReturn(0);
  22.         when(mockCrawerScreenShotTaskMapper.saveBatch(Arrays.asList(new CrawlerScreenShotTask(0L, "url""imageOssUrl"falsefalse"memberGroup"00"fileName", new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime(), new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime(), false"skuCode""state""operater")))).thenReturn(0);
  23.         // Run the test
  24.         final Result<String> result = crawlerScreenShotServiceImplUnderTest.receiveData(vo);
  25.         // Verify the results
  26.     }
  27.     @Test
  28.     public void testListJobScreenShotTask() {
  29.         // Setup
  30.         // Configure CrawerScreenShotTaskMapper.listJobScreenShotTask(...).
  31.         final CrawlerScreenShotTaskDto crawlerScreenShotTaskDto = new CrawlerScreenShotTaskDto();
  32.         crawlerScreenShotTaskDto.setId(0L);
  33.         crawlerScreenShotTaskDto.setUrl("url");
  34.         crawlerScreenShotTaskDto.setSkuCode("skuCode");
  35.         crawlerScreenShotTaskDto.setPcFlag(false);
  36.         crawlerScreenShotTaskDto.setMemberGroup("memberGroup");
  37.         crawlerScreenShotTaskDto.setUrlType(0);
  38.         crawlerScreenShotTaskDto.setFileName("fileName");
  39.         crawlerScreenShotTaskDto.setTaskType(0);
  40.         crawlerScreenShotTaskDto.setState("state");
  41.         final List<CrawlerScreenShotTaskDto> crawlerScreenShotTaskDtos = Arrays.asList(crawlerScreenShotTaskDto);
  42.         when(mockCrawerScreenShotTaskMapper.listJobScreenShotTask(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime())).thenReturn(crawlerScreenShotTaskDtos);
  43.         // Run the test
  44.         final List<CrawlerScreenShotTaskDto> result = crawlerScreenShotServiceImplUnderTest.listJobScreenShotTask();
  45.         // Verify the results
  46.     }
  47.     @Test
  48.     public void testQuery() {
  49.         // Setup
  50.         final NikeScreenShotListRequestVo requestVo = new NikeScreenShotListRequestVo();
  51.         requestVo.setUrl("url");
  52.         requestVo.setUrlType(0);
  53.         requestVo.setStartTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  54.         requestVo.setEndTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  55.         requestVo.setStatus(0);
  56.         requestVo.setPcFlag(0);
  57.         requestVo.setPageNum(0);
  58.         requestVo.setPageSize(0);
  59.         // Configure CrawerScreenShotTaskMapper.query(...).
  60.         final PimScreenShotVo pimScreenShotVo = new PimScreenShotVo();
  61.         pimScreenShotVo.setId(0L);
  62.         pimScreenShotVo.setUrl("url");
  63.         pimScreenShotVo.setImageOssUrl("imageOssUrl");
  64.         pimScreenShotVo.setStatus(0);
  65.         pimScreenShotVo.setPcFlag(false);
  66.         pimScreenShotVo.setCreateTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  67.         pimScreenShotVo.setUrlType(0);
  68.         pimScreenShotVo.setMsg("msg");
  69.         final List<PimScreenShotVo> pimScreenShotVos = Arrays.asList(pimScreenShotVo);
  70.         when(mockCrawerScreenShotTaskMapper.query(any(NikeScreenShotListRequestVo.class))).thenReturn(pimScreenShotVos);
  71.         // Run the test
  72.         final PageInfo<PimScreenShotVo> result = crawlerScreenShotServiceImplUnderTest.query(requestVo);
  73.         // Verify the results
  74.     }
  75.     @Test
  76.     public void testQuerySelectBoxData() {
  77.         // Setup
  78.         // Configure CrawerScreenShotTaskMapper.query(...).
  79.         final PimScreenShotVo pimScreenShotVo = new PimScreenShotVo();
  80.         pimScreenShotVo.setId(0L);
  81.         pimScreenShotVo.setUrl("url");
  82.         pimScreenShotVo.setImageOssUrl("imageOssUrl");
  83.         pimScreenShotVo.setStatus(0);
  84.         pimScreenShotVo.setPcFlag(false);
  85.         pimScreenShotVo.setCreateTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  86.         pimScreenShotVo.setUrlType(0);
  87.         pimScreenShotVo.setMsg("msg");
  88.         final List<PimScreenShotVo> pimScreenShotVos = Arrays.asList(pimScreenShotVo);
  89.         when(mockCrawerScreenShotTaskMapper.query(any(NikeScreenShotListRequestVo.class))).thenReturn(pimScreenShotVos);
  90.         // Run the test
  91.         final PimScreenShotTaskParamsDto result = crawlerScreenShotServiceImplUnderTest.querySelectBoxData();
  92.         // Verify the results
  93.     }
  94.     @Test
  95.     public void testFindExecutionScreenShotTaskCount() {
  96.         // Setup
  97.         when(mockCrawerScreenShotTaskMapper.findExecutionScreenShotTaskCount()).thenReturn(0);
  98.         // Run the test
  99.         final Integer result = crawlerScreenShotServiceImplUnderTest.findExecutionScreenShotTaskCount();
  100.         // Verify the results
  101.         assertEquals(0, result);
  102.     }
  103.     @Test
  104.     public void testFindCrawerScreenshotTaskByCreateTime() {
  105.         // Setup
  106.         final CrawlerScreenShotTaskSyncDto crawlerScreenShotTaskSyncDto = new CrawlerScreenShotTaskSyncDto();
  107.         crawlerScreenShotTaskSyncDto.setId(0L);
  108.         crawlerScreenShotTaskSyncDto.setUrl("url");
  109.         crawlerScreenShotTaskSyncDto.setSkuCode("skuCode");
  110.         crawlerScreenShotTaskSyncDto.setTaskType(0);
  111.         crawlerScreenShotTaskSyncDto.setStatus(0);
  112.         crawlerScreenShotTaskSyncDto.setLastModifyTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  113.         crawlerScreenShotTaskSyncDto.setOperater("operater");
  114.         crawlerScreenShotTaskSyncDto.setMsg("msg");
  115.         final List<CrawlerScreenShotTaskSyncDto> expectedResult = Arrays.asList(crawlerScreenShotTaskSyncDto);
  116.         // Configure CrawerScreenShotTaskMapper.findCrawerScreenshotTaskByCreateTime(...).
  117.         final CrawlerScreenShotTaskSyncDto crawlerScreenShotTaskSyncDto1 = new CrawlerScreenShotTaskSyncDto();
  118.         crawlerScreenShotTaskSyncDto1.setId(0L);
  119.         crawlerScreenShotTaskSyncDto1.setUrl("url");
  120.         crawlerScreenShotTaskSyncDto1.setSkuCode("skuCode");
  121.         crawlerScreenShotTaskSyncDto1.setTaskType(0);
  122.         crawlerScreenShotTaskSyncDto1.setStatus(0);
  123.         crawlerScreenShotTaskSyncDto1.setLastModifyTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  124.         crawlerScreenShotTaskSyncDto1.setOperater("operater");
  125.         crawlerScreenShotTaskSyncDto1.setMsg("msg");
  126.         final List<CrawlerScreenShotTaskSyncDto> crawlerScreenShotTaskSyncDtos = Arrays.asList(crawlerScreenShotTaskSyncDto1);
  127.         when(mockCrawerScreenShotTaskMapper.findCrawerScreenshotTaskByCreateTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime())).thenReturn(crawlerScreenShotTaskSyncDtos);
  128.         // Run the test
  129.         final List<CrawlerScreenShotTaskSyncDto> result = crawlerScreenShotServiceImplUnderTest.findCrawerScreenshotTaskByCreateTime(new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  130.         // Verify the results
  131.         assertEquals(expectedResult, result);
  132.     }
  133.     @Test
  134.     public void testQueryCrawlerDashboard() {
  135.         // Setup
  136.         when(mockCrawerScreenShotTaskMapper.queryCrawlerDashboard(000, new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime(), new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime())).thenReturn(0);
  137.         // Run the test
  138.         final Integer result = crawlerScreenShotServiceImplUnderTest.queryCrawlerDashboard(000, new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime(), new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime());
  139.         // Verify the results
  140.         assertEquals(0, result);
  141.     }
  142. }

不要惊慌。这个断言是为了检查单元测试的结果是否符合预期。

 

怎样这并不令人兴奋,也不酷。每秒超过90行的代码覆盖率超过90%。

如上所述,第一次进来时,您将被要求选择单元测试模板。如果要切换,可以在单元测试类中按快捷键Alt+M,或者在Squaretest菜单中按倒数第一个。按下快捷键的效果如下。我选择了这个模板,您也可以使用它作为参考。

好了,上面的SQUARETEST部分结束了。当然,拉动并不为时过早。这个类是一个比较成功的案例,您仍然需要做一些小的修改。毕竟,它生成的测试数据可能与if-else数据不匹配,对吗?但这很容易改变。这从if else的自我分析变为调试,查看生成的数据是否有问题。更改数据将被传递。无论如何,我对它很满意,我可以适当地节省70%的工作量。
解决了上述问题后,发现了另一个问题。对于VO、DTO、entity、Command和Model等实体类,我们通常使用lombok注释,如get、set和约束构造函数。但是,该工具只能为这些实体类的构造函数生成单元测试,而不能为get set方法生成单元测试。因此,我们编写一个由实体类继承的基方法,只需编写两行磁带。请参见以下代码:

  1. @SpringBootTest
  2. @RunWith(MockitoJUnitRunner.class)
  3. public abstract class BaseVoEntityTest<T> {
  4.     protected abstract T getT();
  5.     private void testGetAndSet() throws IllegalAccessException, InstantiationException, IntrospectionException,
  6.             InvocationTargetException {
  7.         T t = getT();
  8.         Class modelClass = t.getClass();
  9.         Object obj = modelClass.newInstance();
  10.         Field[] fields = modelClass.getDeclaredFields();
  11.         for (Field f : fields) {
  12.             boolean isStatic = Modifier.isStatic(f.getModifiers());
  13.             // 过滤字段
  14.             if (f.getName().equals("isSerialVersionUID") || f.getName().equals("serialVersionUID") || isStatic || f.getGenericType().toString().equals("boolean")
  15.                     || f.isSynthetic()) {
  16.                 continue;
  17.             }
  18.             PropertyDescriptor pd = new PropertyDescriptor(f.getName(), modelClass);
  19.             Method get = pd.getReadMethod();
  20.             Method set = pd.getWriteMethod();
  21.             set.invoke(obj, get.invoke(obj));
  22.         }
  23.     }
  24.     @Test
  25.     public void getAndSetTest() throws InvocationTargetException, IntrospectionException,
  26.             InstantiationException, IllegalAccessException {
  27.         this.testGetAndSet();
  28.     }
  29. }

同样,我们通过Squaretest在实体类上生成单元测试,然后继承我上面写的基类。vo的单元测试代码略有更改,如下所示

 

观看运行后,覆盖率为100%,这是合适的。通过这两种解决方案,我们可以在一天内实现60%以上的覆盖率。不要太激动。你可以尝试一下。当然,这不是一个专门为跑腿而编写的单元测试。我们还可以使用这个工具在后续开发中生成和测试我们自己的代码,这也提高了我们的工作效率!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/37793
推荐阅读
相关标签
  

闽ICP备14008679号