测试是来表明bug的存在而不是不存在。
前方
很多小伙伴们一提起单元测试,就会说啊这个好这个好,然后又紧接着一串自动化
、覆盖率
等等一串名词出来……
可是到实际使用的时候,却很少使用,当然原因多种多样,比如说:
- 代码测试用例各种细节太麻烦了
- 没有时间、项目太多
- 不知道怎么写
- 公司有专门的测试
- 在SpringMVC/SpringBoot 下运行单元测试还要启动容器,不如手动点点点,还能多测点其他功能
总之,原因是各种各样的,博主也都能理解,事实上对于很多公司来说,单元测试确实就是一个不重要的事情。
可能公司已经招了专业测试;也可能自己身兼多职,忙不过来,等等等等……
不过,关于怎么做单元测试,各位小伙伴还是要了解了解的~
准备
本文以一个 SpringBoot 项目为例,版本号为 3.0.1
。 Maven 项目。
假设你已经有了一个 SpringBoot 项目(如果没有的话可以创建一个,本文跳过创建项目的步骤)。
想要做单元测试的话,需要先检查依赖,没有的话则加入,依赖如下:
<!-- JUnit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- PowerMock -->
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
PS
版本号可以以最新的为准
开始
新建了一个 DemoService, 如下:
public interface DemoService {
String queryStr();
Article queryArticle();
}
现在我要对这个DemoService中的queryStr 进行测试,先创建测试类:
@SpringBootTest
@ExtendWith(SpringExtension.class)
@Slf4j
class DemoServiceTest {
@Autowired
private DemoService demoService;
@Test
void
queryStr() {
String str = demoService.queryStr();
log.info("DemoServiceTest -> queryStr -> str -> {}",str);
Assert.notNull(str);
}
}
一个基本、简单的单元测试就写好了
其中:
- @SpringBootTest 注解声明此类为一个SpringBoot单元测试类
- @ExtendWith 则是因为我们需要测试Spring框架功能,如果是Junit 4 , 则使用 @RunWith 注解
- @Slf4j 日志注解
- @Test 标明方法函数为测试方法函数
- Assert#notNull 断言,没有断言的单元测试没有意义
在 Idea 中, queryStr
方法 左侧会有小图标,点击执行便可:
一般来说,推荐使用 Run 'queryStr()' with Coverage
,会进行覆盖率测试
结果
使用 with Coverage ,就会弹出覆盖率的模态框,内容如下:
如图所示,默认展示了 Class / Method / Line 的覆盖率
至此,一个简单的单元测试就写好了