关于单元测试及项目质量管理的总结-创新互联
摘要:如果没写单元测试,如若在branch中对之前代码重构的话,则没有移回trunck上的勇气,有了单元测试,全部运行通过后则有信心合并。互联网公司更是需要重视单元测试,因为版本迭代比较迅速。因此一个好的单元测试框架及一个好的项目质量管理非常重要。本文即是我对这些的心得体会。关键词:java, 单元测试, TestNG, DbUnit, Spring, 项目管理, 质量管理, PMP解决问题:单元测试该如何实施?项目质量管理该如何执行?
在开发数据访问对象DAO层时,我们需要直接对数据层进行增删改查CRUD操作。单元测试非常重要,因为在开发期间经常需要进行代码重构,怎样才能保证代码重构的正确性呢,怎样给代码重构者以信心让他放手去做呢,需要执行单元测试,只要能保证接口功能不发生任何变化,与代码重构前完全相同,并且能直观的感受到这一一致性,开发者便能大胆地去干了。功能开发容易,单元测试难做。第一,单元测试间相互影响:单元测试1对数据A新增的一条数据可能会影响到单元测试2验证的正确性,你可能会想到在每个单元测试的起始时手动做一遍初始化,比如清理一遍表中数据,以清除其他单元测试的影响,这样笨且增加工作量。第二,开发者间相互影响:如果有多人同时需要执行测试用例,使用以上的办法后还是会发生问题,这时我们可能会选择每个开发者自己搭建一套数据库(内存或大型),以避免多人间的干扰,这样还是过于麻烦,且消耗资源。 下面是基于TestNG和DbUnit的单元测试框架,它的基本思想是管理事务,在单元测试起始时使用事务,在单元测试逻辑的最后将事务回滚,因此每个单元测试内对数据库的操作将不会实际对数据库有实质性影响,这样在单元测试中既可以测试逻辑的正确性,又避免影响到了其他单元测试和其他开发者,并且只需要依赖于统一的开发数据库即可,使用还很方便。以下还使用MyBatis的功能抽象出了一个统一平台,该统一平台提供了大多数的公共接口,如增删改查及批量操作等,大部分的基础操作可以通过调用这些接口就能完成,不通用的操作传入SQL语句也可执行。 一、MyBatis统一平台:MyBatisAngelWang.class
当前文章:关于单元测试及项目质量管理的总结-创新互联
当前链接:http://lswzjz.com/article/dgojjo.html
在开发数据访问对象DAO层时,我们需要直接对数据层进行增删改查CRUD操作。单元测试非常重要,因为在开发期间经常需要进行代码重构,怎样才能保证代码重构的正确性呢,怎样给代码重构者以信心让他放手去做呢,需要执行单元测试,只要能保证接口功能不发生任何变化,与代码重构前完全相同,并且能直观的感受到这一一致性,开发者便能大胆地去干了。功能开发容易,单元测试难做。第一,单元测试间相互影响:单元测试1对数据A新增的一条数据可能会影响到单元测试2验证的正确性,你可能会想到在每个单元测试的起始时手动做一遍初始化,比如清理一遍表中数据,以清除其他单元测试的影响,这样笨且增加工作量。第二,开发者间相互影响:如果有多人同时需要执行测试用例,使用以上的办法后还是会发生问题,这时我们可能会选择每个开发者自己搭建一套数据库(内存或大型),以避免多人间的干扰,这样还是过于麻烦,且消耗资源。 下面是基于TestNG和DbUnit的单元测试框架,它的基本思想是管理事务,在单元测试起始时使用事务,在单元测试逻辑的最后将事务回滚,因此每个单元测试内对数据库的操作将不会实际对数据库有实质性影响,这样在单元测试中既可以测试逻辑的正确性,又避免影响到了其他单元测试和其他开发者,并且只需要依赖于统一的开发数据库即可,使用还很方便。以下还使用MyBatis的功能抽象出了一个统一平台,该统一平台提供了大多数的公共接口,如增删改查及批量操作等,大部分的基础操作可以通过调用这些接口就能完成,不通用的操作传入SQL语句也可执行。 一、MyBatis统一平台:MyBatisAngelWang.class
@Repository publicclassMyBatisAngelWangimplementsIRepository{ @Autowired privateGeneralDAO generalDAO; public
T get(Class clz,Long id){ HashMap hashMap= generalDAO.getLogically(clz, id); T ret=this.convert(hashMap, clz); return ret; } }
10年积累的成都网站建设、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有尉犁免费网站建设让你可以放心的选择与我们合作。import org.testng.annotations.Test; //@DatabaseSetup(value= "/dbunitData/TestAngelEntity.xml")publicclassMyBatisAngelWangTestextendsAbstractRollbackTest{ @Autowired privateMyBatisAngelWang myBatisAngelWang; @Test(enabled=false) publicvoid testGet(){ } }
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; @ContextConfiguration(locations={"classpath:spring-datasource-dbunit.xml", "classpath*:spring-services.xml"}) @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class,TransactionalTestExecutionListener.class}) @Transactional publicclassAbstractRollbackTestextendsAbstractTestNGSpringContextTests{ }
@ContextConfiguration("/config/Spring-db.xml") @Transactional @ActiveProfiles("test") publicclassMyBatisAngelWangTestextends AbstractTransactionalTestNGSpringContextTests{}
spring-datasource-configuration classpath*:props/datasource_dev.properties 这样大家测试的数据库都是同一个了,也不会有任何的相互影响了。因为事务回滚了,不信的话可以提交一条Insert测试哦,执行完后查看数据库中并没有插入任何数据。然而,在一个单元测试中,先Insert再get是可以取到数据的,神奇吧?!
publicclassApplicationContextAwareHelperimplementsApplicationContextAware{ privatestaticApplicationContext context; @Override publicvoid setApplicationContext(ApplicationContext applicationContext){ context= applicationContext; } publicstaticApplicationContext getContext(){ return context; } }
DruidDataSource dataSource =ApplicationContextAwareHelper.getBean("dataSource_"+ dataSources[i]);
当然,这不属于单元测试的范畴了,有点跑题,但是蛮有用的,在这里记一下。
王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。
Email:aitanjupt@hotmail.com
QQ:289770363
当前文章:关于单元测试及项目质量管理的总结-创新互联
当前链接:http://lswzjz.com/article/dgojjo.html