`
fish_no7
  • 浏览: 28069 次
文章分类
社区版块
存档分类
最新评论

项目中单元测试容易出现的普遍问题归纳(Junit/Spring/Spring-test/Dubbo/RocketMQ/JAVA)

阅读更多

   最近公司要求项目在使用maven构建的时候不能跳过test的生命周期,也就是通过mvn test命令需要将整个项目运行起来。因为之前项目组的成员都是在eclipse中去执行的unit test,在maven对所有模块构建的都是直接-Dmaven.test.skip=true的方式直接跳过UT的。
   这次刚好借这个机会把项目所有模块中的UT整理下,在整理的过程中遇到了很多的问题,这边我把几个比较严重的问题记录了下。
   先介绍下公司使用的基本中间件:DUBBO,RocketMQ,Spring。

(一) 环境问题

    1. 问题描述:由于项目中含有多个子模块,但是基础的环境比如DUBBO和RocketMQ,甚至基本的Spring启动环境都是相同的,但是目前的项目中并没有抽象出统一的启动环境,导致的问题就是每个新加入的团队成员做单元测试的时候都需要自己去了解每个中间件环境的细节,这些与业务无关的细节会严重拖累新加入成员的开发进度。最后为了赶进度,也为了减少学习的成本,后加入的成员,就直接把其他子工程的环境直接复制放入到自己的工程中来启动UT。最后导致的问题就是由于对细节的不了解,最后按了葫芦起了瓢,不仅没起到快速启动的效果,反而在解决各种启动报错的问题中耗费了时间。而由于是复制别人的环境,所以环境中启动了很多自己工程中在运行中其实不要启动的组建。最糟糕的就是复制了全环境,有时我们的单测其实只需要运行一个简单的service的某个方法的细节,最后导致启动了各种DUBBO服务,RocketMQ的服务和客户端,各种数据库连接池,扫描了所有的bean等等,最后的问题就是一个很简答的UT都启动的特别慢。

    2. 解决思路:针对项目抽象出一个单独的工程,提供给业务模块需要的时候引入。此独立的工程只需要提供基本统一的环境就,并且对外提供抽象接口供业务测试单元继承。可以借助spring-test帮你构建。

(二) DAO层数据插入问题(不能二次执行)

    1.问题描述:很多人在测试DAO层的数据插入时,简单的构造了条数据当时插入成功了,程序员觉得万事大吉了,但是他们忘了项目的UT是要经过一次次的执行的,这样当你下次重复执行的是不是就会发现数据库抛出duplicate primary key的错误。

    2. 解决思路:关于此类问题的解决方法有很多,但是一般有个原则就是单测的数据不应该污染数据库,也就是不应该持久化到数据库中的,可以使用事务控制整个UT,并在测试方法结束的时候回滚,目前Spring已经提供了此类事务的支持(有兴趣的可以看下spring的@TransactionConfiguration和@Tranactional以及AbstractTransactionalJUnit4SpringContextTests抽象类);
    就算不用事务支持的话,也应该在插入前对数据库进行一次删除操作,最起码不应该让UT二次执行的时候就会抛出错误,这是最基本的要求。

(三) 对外部依赖的问题

    1. 问题描述:现在很多工程都是基于SOA的架构设计的,各业务模块是以服务的方式对外提供服务。这样在UT的时候基本很难避免对其他业务接口的调用。大家知道测试环境那个的服务都是不稳定的,也许在你们调试的时候可用,下次执行的时候对方测试的接口不可用了,如果是基于DUBBO的服务,那么你在执行单测的时候就得眼巴巴的等到对方超时返回,或者返回不符合预期,测试不通过。

    2.解决思路:Mock 还是Mock,Mock框架的话我首选的还是Easy Mock。

(四) 数据过期超时导致的异常

    1.问题描述:严格来说这个不算问题,但是如果你向我一样,要在后期去优化整个项目的UT工程的时候你就会崩溃,最简单的场景:你要查某个时间段的数据,而且期望的是数据的条数大于0,也许当时你能测试通过,但是这个业务场景可能是依赖于时间段的,我后面来执行的时候数据过了有效期,此时UT是不能被通过的。

    2.解决思路:对可能出现数据超时的情况进行异常处理。

    以上是我在整理和重构的时候遇到的几个比较频繁和严重的问题,所以就归纳出来了。
我觉得一个合格的单元测试最起码的要求是能重复执行,并且不应该对外部的执行时有强依赖,UT只是测试项目中最小的逻辑甚至是代码单元的,所以应该小而简单。希望以后大家在构建单测的时候能够尽量避免我上面列出的几个问题,养成良好的习惯,提高单测质量!

    
分享到:
评论

相关推荐

    dubbo单元测试maven项目

    【标题】"dubbo单元测试maven项目"指的是在基于Maven构建的Java项目中,对采用Dubbo框架实现的服务进行单元测试的过程。Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务治理功能,包括服务注册、服务...

    spring-dubbo 整合demo

    在IT行业中,Spring框架和Dubbo是两个非常重要的组件,它们在分布式系统开发中发挥着关键作用。Spring是一个全面的Java应用开发框架,提供了一种模块化和简化的方式来构建企业级应用。而Dubbo则是阿里巴巴开源的一款...

    dubbo-zookeeper

    ### dubbo-zookeeper知识点解析 #### 一、dubbo与Zookeeper概述 - **Dubbo**:是一款高性能、轻量级的开源Java RPC框架。它提供了三大核心能力:面向接口的远程方法调用、智能容错和恢复能力、以及服务自动注册与...

    dubbo自动化测试

    此外,一些工具和库可以简化dubbo自动化测试,如dubbo-test、Mockito的dubbo插件等,它们提供了更方便的API来构造和验证Dubbo调用。在实际项目中,合理利用这些工具能够大大提高测试的效率和质量。 总结来说,dubbo...

    dubbo-spring-boot:dubbo和springboot学习演示

    在【压缩包子文件的文件名称列表】"dubbo-spring-boot-master"中,"master"通常指的是项目的主分支,这可能包含了一个完整的项目结构,包括源代码、配置文件、测试用例等。我们可以预期在这个项目中找到以下关键部分...

    maven的优缺点 项目

    将Service层以下的代码放到一个新创建的java项目中,在部署的时候将Service(java项目)打成一个jar包,分别放到两个web服务中;编译的时候让web项目依赖与Service(java项目)_source folder;配置麻烦,项目与项目之间的...

    1-1.Spring基础.md

    - **方便程序测试**:Spring框架提供了丰富的测试支持,使得单元测试和集成测试变得更加容易。 - **易于与其他框架整合**:Spring可以轻松地与MyBatis、Dubbo等其他流行框架进行集成。 - **简化事务操作**:Spring...

    JavaEE求职简历-姓名-JAVA开发工程师.doc

    - **澳欧惠品项目**:这是一个B/C商城系统,涵盖前端销售和后台管理,采用的技术栈包括SpringBoot、iBatis、Maven,利用dubbo进行分布式通信,ZooKeeper做服务注册,SpringTest、dbunit、EasyMock进行测试,前端...

    后端开发Java自学项目demo

    3. **src/test/java**:包含测试类,用于验证服务的正确性和性能。 4. **pom.xml** 或 **build.gradle**:项目构建文件,定义依赖关系和构建过程。 5. **README.md**:项目说明文档,介绍如何运行和测试项目。 通过...

    springboot_dubbo_server.rar

    【标题】"springboot_dubbo_server.rar"是一个与Spring Boot和Dubbo相关的项目压缩包,主要涉及的内容是如何在Spring Boot应用中集成Dubbo,并实现双数据源的事务管理。 【描述】描述中提到的是一个实战案例,即...

    Java基础学习31.pdf

    JUnit 是一个流行的Java单元测试框架,它提供了一系列注解来简化测试用例的编写和管理。以下是一些关键的JUnit注解: - `@Test`: 标记为测试方法,表示该方法会作为单元测试执行。 - `@Ignore`: 忽略指定的测试方法...

    JavaEE求职简历-姓名-JAVA开发工程师.docx

    7. **测试框架**:SpringTest+JUnit用于简化DAO层测试,EasyMock则用于Service层的逻辑测试,确保代码质量。 8. **文件存储**:fastDFS文件存储系统用于储存文件,提高文件上传和下载的效率。 9. **负载均衡与动静...

    dubbo、dubbox编译所需jar包

    spring-test-3.2.16.RELEASE.jar spring-tx-3.2.16.RELEASE.jar spring-web-3.2.16.RELEASE.jar spring-webmvc-3.2.16.RELEASE.jar surefire-api-2.17.jar surefire-booter-2.17.jar surefire-grouper-2.17.jar ...

    【Java项目开源源码】资源JAVA版商城系统源码

    11. **测试**:单元测试和集成测试可能采用JUnit和Mockito,确保代码质量和功能的正确性。 12. **版本控制**:项目源代码可能托管在GitHub或GitLab等版本控制系统上,便于团队协作和版本管理。 13. **文档与日志**...

    dubboAutoTest:dubbo接口自动化测试

    对于Dubbo接口的自动化测试,可能还需要Spring Boot Test库来处理Spring环境的初始化和配置。 2. **Mock服务**:在接口测试中,往往需要模拟(mock)服务提供者的响应,以避免实际网络请求带来的复杂性。可以使用...

    springboot-mybatis-sample

    这些测试类使用JUnit或者Spring Boot的TestRunner,模拟数据库操作,检查Mybatis的查询、增删改等功能是否正常工作。 5. **Log4j2** Log4j2是Apache的下一代日志库,提供了丰富的日志功能和高性能。在SpringBoot中...

    demo:Spring启动演示项目

    service 集成了dubbo,test目录下有dubbo消费者 Junit单元测试 service-api 接口 utils 工具类,简单封装了okhttp 3.0 web 使用的是spring推荐的模板引擎 thymeleaf ,优点是前后端可以很好的分离,理念界面即原型,...

    test-project:SpringBoot,SpringCloud,Alibaba等整合项目实例,写一些代码示例。才疏学浅,勿喷。。

    标题中的“test-project”是一个基于Java技术栈的测试项目,主要使用了SpringBoot、SpringCloud和Alibaba的相关组件。这个项目旨在提供一个整合了这些框架的实际应用案例,帮助开发者理解和学习如何在实际开发环境中...

Global site tag (gtag.js) - Google Analytics