公司对于系统单元测试覆盖率有要求,需要达到50%或80%以上才可以,但是对于之前的老项目或者是前期赶进度未添加单元测试用例的项目来说,手动添加单元测试耗时又费力,这时候我们就需要一款能够提高效率的一款插件来帮助我们提高单元测试覆盖率,经过对比temstMe、Squaretest、Diffblue三个插件,最终选择了一款免费的testMe来作为我们自动化单元测试用例生成插件。
优点:
缺点:
优点:
缺点:
优点:
缺点:
File——>Settings——>Plugins——>marketplace,搜索testMe,然后install就好了,插件安装完成后需要重启一下。
org.mockito
mockito-core
3.5.0
org.mockito
mockito-inline
4.5.1
test
我们找到需要生成单元测试的类,然后右键点击Generate。
在弹窗中选择testMe。
继续选择Junit4 & Mockito来生成单元测试用例。
我们看下生成的单元测试用例。
这个单元测试用例有几点柑橘不是很好,第一点是生成的类没有类注释头,第二是Mock 注解 和InjectMocks注解挨在一起,希望能空一行,第三是生成的脚注有点多余,我们不需要。所以这时候我们需要通过自定义模板来修改这些。
File——>Settings——>TestMe——>TestMe template 找到testMe的模板。
我们找到Junit4 & Mockito这个模板,点击上面菜单拷贝一份模板。
我们在此拷贝的模板基础上进行修改。
首先我们添加一下类注释。
/**
* @author author
* @date ${DATE} ${TIME}
*/
其次我们在测试类上添加RunWith注解。
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
第三我们添加Mock和InjectMocks添加空行及删除脚注。
以下为本人使用的完整模板代码。
#parse("TestMe macros.java")
#set($hasMocks=$MockitoMockBuilder.hasMockable($TESTED_CLASS.fields))
#if($PACKAGE_NAME)
package ${PACKAGE_NAME};
#end
import org.junit.Assert;
import org.junit.Test;
#if($hasMocks)
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
//import static org.mockito.Mockito.*;
#end
/**
* @author author
* @date ${DATE} ${TIME}
*/
#parse("File Header.java")
@RunWith(MockitoJUnitRunner.class)
public class ${CLASS_NAME} {
#renderMockedFields($TESTED_CLASS.fields)
#renderTestSubjectInit($TESTED_CLASS,$TestSubjectUtils.hasTestableInstanceMethod($TESTED_CLASS.methods),$hasMocks)
#if($hasMocks)
@Before
public void setUp() {
MockitoAnnotations.${MockitoMockBuilder.initMocksMethod}(this);
}
#end
#foreach($method in $TESTED_CLASS.methods)
#if($TestSubjectUtils.shouldBeTested($method))
@Test
public void #renderTestMethodName($method.name)() {
#if($MockitoMockBuilder.shouldStub($method,$TESTED_CLASS.fields))
#renderMockStubs($method,$TESTED_CLASS.fields)
#end
#renderMethodCall($method,$TESTED_CLASS.name)
#if($method.hasReturn()) Assert.#renderJUnitAssert($method)#end
}
#end
#end
}
我们在使用同样的流程来根据自定义模板生成单元测试用例。
我们看下生成的新的测试用例格式如下。
代码格式会比之前好一点,但是生成的单元测试用例还是需要我们微调一下才能跑。
如果只是注重单元测试覆盖率,那么按照上面的方法生成即可,如果还需要单元测试用例跑通,那么基本上需要我们在微调一下代码。