软件质量的保证:单元测试与集成测试的重要性

单元测试

一个模块测试,针对最小可测单元来进行代码逻辑正确性的测试。(没有任何依赖的测试,在本测试类中的关注于对代码的逻辑正确性和功能实现进行验证)

集成测试

模拟真实开发环境,对多个类或者过个模块功能之间交互的整体功能进行验证的过程。

总之单元测试是对最小可测试单元的验证,而集成测试是对多个模块之间的交互和整体功能的验证。两者都是测试中的重要环节,可以互相补充,确保软件的质量和稳定性。

为什么做单元测试

好处:

   1.提高系统稳定性,利于迭代。

   2.有利于深度了解技术与业务。

   3.单测成本低,速度快。(最直观的理解,故:在早期的单元测试就能发现bug,不仅可以省时省力,在开发流程上提高效率,也能降低反复修改出现的风险以及时间成本)

   4.单测是最佳的、自动化的、可执行的文档。

   5.单测驱动设计,提升代码简洁度和规范性,确保安全重构,代码修改后,单测仍然能通过,能够增强开发者的信心。

   6.快速反馈,更快的发现问题,定位缺陷比集成测试更快更准确,降低修复成本。

单元测试框架

import java.util.Objects;
 
/**
 * 单元测试
 * @author yl
 * @date 2024/01/23
 */
public class Demo {
    public static final int INT_ZERO = 0 ;
    public static boolean isPositive(Integer value) {
        return Objects.nonNull(value)&&Integer.compare(value,INT_ZERO)>0;
    }
    public static boolean isLargerThan(Integer input,Integer compareTo){
        if (!Objects.nonNull(input) || !Objects.nonNull(compareTo)){
            return false;
        }
 
        return input.compareTo(compareTo)>0;
    }
}
Junit: 

Junit是最常用的Java单元测试框架之一,它提供了一组简单易用的API,可以方便地编写和运行单元测试。

class DemoTest {
    @Test
    void isPositive() {
        assertTrue(Demo.isPositive(1));
        assertFalse(Demo.isPositive(-1));
        assertFalse(Demo.isPositive(0));
        assertTrue(Demo.isPositive(Integer.MAX_VALUE));
        assertFalse(Demo.isPositive(Integer.MIN_VALUE));
    }
    @Test
    void isLargerThan() {
        assertTrue(Demo.isLargerThan(1, 0));
        assertFalse(Demo.isLargerThan(0, 1));
        assertFalse(Demo.isLargerThan(1, 1));
        assertTrue(Demo.isLargerThan(Integer.MAX_VALUE, 0));
        assertFalse(Demo.isLargerThan(Integer.MIN_VALUE, 0));
        assertFalse(Demo.isLargerThan(null, 0));
        assertFalse(Demo.isLargerThan(0, null));
    }
}

断言:在程序中用于检查某个条件是否为真的语句

assertTrue:如果条件为真,则程序继续执行;如果条件为假,则程序会抛出一个 AssertionError 异常(反之亦然)。

Mockito

Mockito是一个用于模拟对象的Java单元测试框架,它可以帮助开发人员创建和管理模拟对象,从而进行真正的单元测试。(功能强大、易于学习和使用、支持扩展等,但它可能会带来一些性能问题)

class DemoTest {
    @Test
    void isPositive() {
        Demo demo = Mockito.mock(Demo.class);
        Mockito.when(demo.isPositive(1)).thenReturn(true);//模拟方法调用的方法
        Mockito.when(demo.isPositive(-1)).thenReturn(false);
        Mockito.when(demo.isPositive(0)).thenReturn(false);
        Mockito.when(demo.isPositive(Integer.MAX_VALUE)).thenReturn(true);
        Mockito.when(demo.isPositive(Integer.MIN_VALUE)).thenReturn(false);
        assertTrue(demo.isPositive(1));
        assertFalse(demo.isPositive(-1));
        assertFalse(demo.isPositive(0));
        assertTrue(demo.isPositive(Integer.MAX_VALUE));
        assertFalse(demo.isPositive(Integer.MIN_VALUE));
    }
    @Test
    void isLargerThan() {
        Demo demo = Mockito.mock(Demo.class);
        Mockito.when(demo.isLargerThan(1, 0)).thenReturn(true);
        Mockito.when(demo.isLargerThan(0, 1)).thenReturn(false);
        Mockito.when(demo.isLargerThan(1, 1)).thenReturn(false);
        Mockito.when(demo.isLargerThan(Integer.MAX_VALUE, 0)).thenReturn(true);
        Mockito.when(demo.isLargerThan(Integer.MIN_VALUE, 0)).thenReturn(false);
        Mockito.when(demo.isLargerThan(null, 0)).thenReturn(false);
        Mockito.when(demo.isLargerThan(0, null)).thenReturn(false);
        assertTrue(demo.isLargerThan(1, 0));
        assertFalse(demo.isLargerThan(0, 1));
        assertFalse(demo.isLargerThan(1, 1));
        assertTrue(demo.isLargerThan(Integer.MAX_VALUE, 0));
        assertFalse(demo.isLargerThan(Integer.MIN_VALUE, 0));
        assertFalse(demo.isLargerThan(null, 0));
        assertFalse(demo.isLargerThan(0, null));
    }
}

单侧开发规范

AIR原则:自动化 独立性 可重复

FIRST原则:快速的 独立的 可重复的 自我验证 及时的(T-Timely)

BCDE原则

B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。

C:Correct,正确的输入,并得到预期的结果。

D:Design,与设计文档相结合,来编写单元测试。

E:Error,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得到预期的结果

举例

public class DemoUtil {
    public static final int INT_ZERO = 0;
 
    public static boolean isPositive(Integer value) {
        //整数返回true
        return Objects.nonNull(value) && Integer.compare(value, INT_ZERO) > 0;
    }
 
    public static boolean isLargerThan(Integer input, Integer compareTo) {
        if (!Objects.nonNull(input) || !Objects.nonNull(compareTo)) {
            return false;
        }
 
        return input.compareTo(compareTo) > 0;
 
    }
}

上述例子的单元测试应该如下所示

public class DemoUtilTest {
 
    @Autowired
    DemoUtil demoUtil;
    @Test
    //TODO 最简单的 Helper/Util/Validation 层
    public void testIsPositive()  {
 
        Assert.assertFalse("返回值不为假",demoUtil.isPositive(-1));
        Assert.assertFalse("返回值不为假",demoUtil.isPositive(0));
        Assert.assertTrue("返回值不为真",demoUtil.isPositive(1));
        Assert.assertFalse("返回值不为假",demoUtil.isPositive(null));
        Assert.assertFalse("返回值不为假",demoUtil.isPositive(Integer.valueOf(-1)));
        Assert.assertFalse("返回值不为假",demoUtil.isPositive(Integer.valueOf(0)));
        Assert.assertTrue("返回值不为假",demoUtil.isPositive(Integer.valueOf(1)));
 
    }
 
    @Test
    public void testIsLargerThan()  {
        Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(null,null));
        Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(null,1));
        Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(1,null));
        Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(1,1));
        Assert.assertTrue("返回值不为真",demoUtil.isLargerThan(1,0));
        Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(-1,0));
    }
 
}
总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

      视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值