《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(1)

简介: 《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(1)

案例集锦:Java单元测试典型案例集锦


前言

 

近期,阿里巴巴CTO线卓越工程小组举办了阿里巴巴第一届单元测试比赛《这!就是单测》并取得了圆满成功。本人有幸作为评委,在仔细地阅读了各个小组的单元测试用例后,发现了两大单元测试问题:

 

无效验证问题:

 

不进行有效地验证数据对象、抛出异常和调用方法。

 

测试方法问题:

 

不知道如何测试某些典型案例,要么错误地测试、要么不进行测试、要么利用集成测试来保证覆盖率。比如:

 

错误地测试:利用测试返回节点占比来测试随机负载均衡策略;

不进行测试:没有人针对虚基类进行单独地测试;

利用集成测试:很多案例中,直接注入真实依赖对象,然后一起进行集成测试。

 

针对无效验证问题,在我的ATA文章《那些年,我们写过的无效单元测试》中,介绍了如何识别和解决单元测试无效验证问题,这里就不再累述了。在本文中,作者收集了一些的Java单元测试典型案例,主要是为了解决这个测试方法问题。

 

一、 如何测试不可达代码

 

在程序代码中,由于无法满足进入条件,永远都不会执行到的代码,我们称之为“不可达代码”。不可达代码的危害主要有:复杂了代码逻辑,增加了代码运行和维护成本。不可达代码是可以由单元测试检测出来的——不管如何构造单元测试用例,都无法覆盖到不可达代码。

 

 

 

1. 案例代码

 

在下面的案例代码中,就存在一段不可达代码。

 

/**
 * 交易订单服务类
 */
@Service
public class TradeOrderService {
    /** 注入依赖对象 */
    /** 交易订单DAO */
    @Autowired
    private TradeOrderDAO tradeOrderDAO;
    /**
     * 查询交易订单
     * 
     * @param orderQuery 订单查询
     * @return 交易订单分页
     */
    public PageDataVO<TradeOrderVO> queryTradeOrder(TradeOrderQueryVO orderQuery) {
        // 查询交易订单
        // 查询交易订单: 总共数量
        Long totalSize = tradeOrderDAO.countByCondition(orderQuery);
        // 查询交易订单: 数据列表
        List<TradeOrderVO> dataList = null;
        if (NumberHelper.isPositive(totalSize)) {
            List<TradeOrderDO> tradeOrderList = tradeOrderDAO.queryByCondition(orderQuery);
            if (CollectionUtils.isNotEmpty(tradeOrderList)) {
                dataList = convertTradeOrders(tradeOrderList);
            }
        }
        // 返回分页数据
        return new PageDataVO<>(totalSize, dataList);
    }
    /**
     * 转化交易订单列表
     * 
     * @param tradeOrderList 交易订单DO列表
     * @return 交易订单VO列表
     */
    private static List<TradeOrderVO> convertTradeOrders(List<TradeOrderDO> tradeOrderList) {
        // 检查订单列表
        if (CollectionUtils.isEmpty(tradeOrderList)) {
            return Collections.emptyList();
        }
        // 转化订单列表
        return tradeOrderList.stream().map(TradeOrderService::convertTradeOrder)
            .collect(Collectors.toList());
    }
    /**
     * 转化交易订单
     * 
     * @param tradeOrder 交易订单DO
     * @return 交易订单VO
     */
    private static TradeOrderVO convertTradeOrder(TradeOrderDO tradeOrder) {
        TradeOrderVO tradeOrderVO = new TradeOrderVO();
        tradeOrderVO.setId(tradeOrder.getId());
        // ...
        return tradeOrderVO;
    }
}

由于方法convertTradeOrders(转化交易订单列表)传入的参数tradeOrderList(交易订单列表)不可能为空,所以“检查订单列表”这段代码是不可达代码。

image.png

1. 方案1:删除不可达代码(推荐)

 

最简单的方法,就是删除方法convertTradeOrders(转化交易订单列表)中的不可达代码。

 

image.png


1. 方案2:利用不可达代码(推荐)

 

还有一种方法,把不可达代码利用起来,可以降低方法queryTradeOrder(查询交易订单)的代码复杂度。

 image.png

1. 方案3:测试不可达代码(不推荐)

 

对于一些祖传代码,有些小伙伴不敢删除代码。在某些情况下,可以针对不可达代码进行单独测试。

image.png



《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(2) https://developer.aliyun.com/article/1232057?groupCode=java

相关文章
|
1天前
|
前端开发 测试技术 数据安全/隐私保护
软件测试 —— 案例系统缺陷报告
软件测试 —— 案例系统缺陷报告
6 1
|
1天前
|
监控 数据可视化 IDE
python自动化测试实战 —— 单元测试框架
python自动化测试实战 —— 单元测试框架
9 2
|
6天前
|
测试技术
测试基础 Junit单元测试框架
测试基础 Junit单元测试框架
12 2
测试基础 Junit单元测试框架
|
7天前
|
前端开发 JavaScript Java
java测试链接超时返回前端
java测试链接超时返回前端
17 0
|
12天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
29 4
|
14天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
17 1
|
14天前
|
Java 测试技术 Maven
Spring Boot单元测试报错java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]
Spring Boot单元测试报错java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]
|
14天前
|
监控 JavaScript 前端开发
【TypeScript技术专栏】TypeScript的单元测试与集成测试
【4月更文挑战第30天】本文讨论了在TypeScript项目中实施单元测试和集成测试的重要性。单元测试专注于验证单个函数、类或模块的行为,而集成测试关注不同组件的协作。选用合适的测试框架(如Jest、Mocha),配置测试环境,编写测试用例,并利用模拟和存根进行隔离是关键。集成测试则涉及组件间的交互,需定义测试范围,设置测试数据并解决可能出现的集成问题。将这些测试整合到CI/CD流程中,能确保代码质量和快速响应变化。
|
17天前
|
Java 测试技术 Android开发
Java 测试和调试:提高代码质量的实用策略
【4月更文挑战第27天】测试和调试是软件开发中确保应用稳定、高效且可靠的关键步骤。对于 Java 开发者来说,掌握有效的测试和调试技巧可以大大提高代码质量和减少生产环境下的问题。
23 2
|
17天前
|
IDE 测试技术 持续交付
【专栏】利用Python自动化测试与单元测试框架提升代码质量与效率
【4月更文挑战第27天】本文探讨了Python自动化测试与单元测试框架在提升代码质量与效率中的作用。Selenium、Appium用于Web和移动应用自动化测试,pytest提供强大、易扩展的测试支持。unittest是Python标准的单元测试框架,支持结构化测试用例和丰富的断言。实践中,应制定测试计划,编写高质量测试用例,实行持续集成与测试,并充分利用测试报告。这些工具和策略能有效保障代码质量和提升开发效率。