工作这么久,单元测试和集成测试还傻傻分不清楚吗?

发布时间:2023-01-26 08:00

工作这么久,单元测试和集成测试还傻傻分不清楚吗?_第1张图片

点击卡片“大数据实战演练”,选择“设为星标”或“置顶”

回复“资料”可领取独家整理的学习资料!

00d2c210e299b8e31cc0e9832748017e.png

工作这么久,单元测试和集成测试还傻傻分不清楚吗?_第2张图片

作者:JMCui

原文链接:https://cloud.tencent.com/developer/article/1623689

一、前言

相信做过开发的同学,都多多少少写过下面的代码,很长一段时间我一直以为这就是单元测试...

@SpringBootTest
@RunWith(SpringRunner.class)
public class UnitTest1 {

    @Autowired
    private UnitService unitService;

    @Test
    public void test() {
        System.out.println("----------------------");
        System.out.println(unitService.sayHello());
        System.out.println("----------------------");
    }
}

但这是单元测试嘛?unitService 中可能还依赖了 Dao 的操作;如果是微服务,可能还要起注册中心,那么这个“单元”也太大了吧!如果把它称为集成测试,可能更恰当一点,那么有没有可能最小粒度进行单元测试呢?

单元测试应该是一个带有隔离性的功能测试。在单元测试中,应尽量避免其他类或系统的副作用影响。

单元测试的目标是一小段代码,例如方法或类。方法或类的外部依赖关系应从单元测试中移除,而改为测试框架创建的 mock 对象来替换依赖对象。

单元测试一般由开发人员编写,通过验证或断言目标的一些行为或状态来达到测试的目的。

二、JUnit框架

JUnit 是一个测试框架,它使用注解来标识测试方法。JUnit 是 Github 上托管的一个开源项目。

一个 JUnit 测试指的是一个包含在测试类中的方法,要定义某个方法为测试方法,可以使用 @Test 注解标注该方法。该方法执行被测代码,可以使用 JUnit 或另一个 Assert 框架提供的 assert 方法来检查预期结果与实际结果是否一致,这些方法调用通常称为断言或断言语句。

public class UnitTest2 {

    @Test
    public void test() {
        String sayHello = "Hello World";
        Assert.assertEquals("Hello World", sayHello);
    }
}

以下是一些常用的 JUnit 注解:

注解

描述

@Test

将方法标识为测试方法

@Before

在每次测试之前执行。用于准备测试环境(例如,读取输入数据,初始化类)

@After

每次测试之后执行。用于清理测试环境(例如,删除临时数据,恢复默认值)

@BeforeClass

用于 static方法,在所有测试开始之前执行一次。它用于执行耗时的活动,例如:连接到数据库

@AfterClass

用于 static方法,在完成所有测试之后,执行一次。它用于执行清理活动,例如:与数据库断开连接

@Ignore

指定要忽略的测试

@Test(expected = Exception.class)

如果该方法未引发命名异常,则失败

@Test(timeout=100)

如果该方法花费的时间超过100毫秒,则失败

以下是一些常用的 Assert 断言:

声明

描述

fail([message])

使方法失败。在执行测试代码之前,可用于检查未到达代码的特定部分或测试失败

assertTrue([message,]布尔条件)

检查布尔条件是否为真

assertFalse([message,]布尔条件)

检查布尔条件是否为假

assertEquals([message,]预期,实际)

测试两个值是否相同。注意:对于数组,会检查引用而不是数组的内容

assertNull([message,]对象)

检查对象是否为空

assertNotNull([message,]对象)

检查对象是否不为空

assertSame([message,]预期,实际)

检查两个变量是否引用同一对象

assertNotSame([message,]预期,实际)

检查两个变量是否引用了不同的对象

三、Mockito 框架

从上面的介绍我们可以认识到,如何减少对外部的依赖才是实践单元测试的关键。而这正是 Mockito 的使命,Mockito 是一个流行的 mock 框架,可以与 JUnit 结合使用,Mockito 允许我们创建和配置 mock 对象,使用 Mockito 将大大简化了具有外部依赖项的类的测试开发。spring-boot-starter-test 中默认集成了 Mockito,不需要额外引入。

在测试中使用 Mockito,通常会:

  • mock 外部依赖关系并将 mock 对象插入待测代码

  • 执行被测代码

  • 验证代码是否正确执行

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号