每次在开发和测试业务逻辑biz时老是碰到这样那样似曾相识的问题,现在记一下备忘。
1、使用JPA/Hibernate/Ebean等ORM时来存取数据库时,不另外增加DAO层。理由是ORM已经封装和统一了不同数据库的基础访问、存取操作,不需要重复劳动,除非有特殊需要。
2、事务处理就是在biz层上定义的,推荐使用Spring容器来管理事务。
3、在使用事务注解时要注意@Transactional注解只能使用在public方式上才有效。放在protected/private方法上不会报错。另外只需要在要启动事务的最外层方法上加这个注解,内部方法是不需要的。
4、在对查询数据库操作,应使用只读事务,对数据加共享锁,以避免其他事务修改该数据。同时注意注解应使用这种形式:
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
使用Propagation.REQUIRED以确保事务的正常启动,如果使用propagation=Propagation.NOT_SUPPORTED则不会启动事务,readOnly属性实际上就失效了。
5、在使用Spring来管理Ebean的事务时,记得要设置<property name="defaultServer" value="true" />。否则死活不会成功。Ebean的Spring例子上好像有错。
6、在使用Spring来管理事务时,有两种生成代理方式。默认是Jdk自带的代理实现。推荐cglib方式,因为这种方式是使用的enhancer代理方式,是在原有XXXBizImpl上产生了一个增强的继承类,所以代理对象可以转换成XXXBizImpl。这样在测试时就更方便。因为我们业务接口方法肯定少于实现的方法。要测试实现上的各个方法,只有用cglib才能注入实现类。Jdk proxy只能注入接口。
要使用cglib除了增加相关依赖包,还要在spring中增加<aop:config proxy-target-class="true" />。
至于两种方式的性能,可参考http://budairenqin.iteye.com/blog/1500366,如果被测的cglib版本比较低。
7、使用unitils来对biz层进行测试,并使用dbunit来初始化测试数据。使用dbunit也会有几个问题:
使用@ExpectedDataSet注解时,会出现org.dbunit.dataset.RowOutOfBoundsException: 1 > (1)异常,但不影响结果,只需要换用新版本的dbunit就行了。出错的版本是dbunit2.2.2。
(2)在配置Spring事务后,本来测试时还正常的dataset测试文件,会报出org.dbunit.dataset.NoSuchColumnException: HIP_PERSON.BASIC_ADDR_ID - (Non-uppercase input column: BASIC_ADDR_ID) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.异常。
出错的原因是第一条测试数据有8个字段,第二条测试数据只有3个,dbnit会用第一条数据的字段去要求第二条数据的,结果就报错了。结果这不是一个bug,可以看这里http://www.dbunit.org/components.html#flatxmlDataSet,
如果要想测试通过,需要把每条记录的字段都弄成一样多,但是这样太麻烦了。unitils也一直未更新解决该问题。结果只有自己重写了MultiSchemaXmlDataSetFactory。另:可自己通过DatabaseUnitils类来生成DataSet的XSD。
(3)需要注意的@ExpectedDataSet注解只验证dataset xml文件中对应的数据。不对数据库所有的数据进行验证。
8、在使用Spring管理事务时,会碰到Service/Biz实现类因调用自身方法而导致事务错误的情况。如下:
Class ABiz{
@Resource
private bBiz;
@Transaciton
public void add(){}
public void addAll(){
this.add(); //这里因为直接调用的this.add(),所以spring代理并不启动事务
bBiz.xxx(); //这里的事务有效
}
}
所以,需要在ABiz中注入自身,通过spring代理来调用带事务的业务方法。
代码修改如下:
Class ABiz{
@Resource
private bBiz;
@Resource
private aBiz;
@Transaciton
public void add(){}
public void addAll(){
aBiz.add(); //现在,事务注解就生效了
bBiz.xxx(); //这里的事务有效
}
}
分享到:
相关推荐
视频可能包含关于如何编写单元测试和集成测试的指导,以确保业务逻辑的正确性。 7. **异常处理与错误报告**:在业务逻辑层中,必须妥善处理可能出现的异常,以避免程序崩溃。视频可能会讲解如何使用try-catch语句...
测试开发需要在业务测试的基础上,具备开发能力和质量改进思惟。 二、测试开发技能要求 测试开发需要具备广泛的知识面,包括: 1. 良好的编程语言基础 2. 计算机基础知识,如数据库、Linux、计算机网络 3. 软件...
报告主要关注如何提升服务端业务测试的效率,通过引入人工智能(AI)和自动化测试策略,推动测试流程的优化,从而赋能开发团队,提高整体软件质量和性能。 在报告中,董十月可能涵盖了以下几个关键知识点: 1. **...
使用MFC开发测试客户端的好处在于它可以方便地创建与系统交互的界面,同时MFC提供了丰富的类和函数,可以快速构建网络通信功能。开发人员可以通过这个客户端模拟不同的输入条件,触发服务器的不同逻辑分支,观察...
在IT行业中,MVC(Model-View-Controller)框架是一种广泛应用的设计模式,尤其在Web开发领域,它将应用程序的业务逻辑、数据模型和用户界面分离,使得各部分职责明确,易于维护和扩展。本测试题涉及到的是使用MVC...
通过有效的工具支持,开发者可以更专注于业务逻辑的实现,减少在基础架构层面上的困扰,从而提高整体项目的开发质量和速度。在实际工作中,我们应该熟练掌握并灵活运用这些工具,以应对各种开发挑战。
业务逻辑漏洞是指由于软件系统的设计或实现上的缺陷导致的、使得攻击者能够绕过正常的验证机制或权限控制机制,从而执行非预期操作的安全问题。这类漏洞往往难以被传统的安全扫描工具发现。 **2. 产生原因** - **...
### 基于React的企业管理系统开发经验:抽象复杂业务逻辑以提升团队效能 #### 前言 在当今数字化转型的时代背景下,企业管理系统扮演着至关重要的角色。它们不仅需要高效地处理日常运营中的大量数据,还要能灵活...
1. **独立测试能力**:独立分析需求,建立和维护测试环境,编写和执行测试脚本,开发测试工具。 2. **编程技能**:熟悉多种编程语言,如Python、Ruby和Java,能理解和审查代码,确保测试的全面性。 三、持续交付 ...
功能测试专注于检查软件的各个功能模块是否按预期工作,确保逻辑正确,并且直接对应于业务需求和用例。它主要采用黑盒测试方法,通过图形用户界面或测试脚本来验证输入、处理和输出的准确性,以及业务规则的执行。 ...
基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征...
《基于Openbiz 让PHP实现极致业务逻辑重用》是一份深入探讨如何通过Openbiz框架提升PHP开发效率和代码复用性的技术文档。Openbiz是一款强大的企业级PHP应用框架,其设计目标是提供一个灵活、高效且易于维护的平台,...
本毕业设计首先对Jsp日记本系统的基本情况进行了分析,提出开发本系统要实现的功能和需要解决的问题,对系统进行了详细的需求分析。 系统的主要功能是提供用户日记的记录和管理功能。用户可以通过本系统进行日记的写作...
3. **测试代码编写**:测试代码通常包括单元测试、集成测试和系统测试,用于验证业务逻辑、接口交互和数据一致性。 4. **代码版本控制**:在实际项目中,代码会通过版本控制系统(如Git)进行管理,标签可能是版本...
在本项目中,云开发可能被用来存储和管理MBTI测试的相关数据,如问题、答案选项、用户选择记录以及测试结果。数据库可能包含不同性格类型的描述,而云函数可能负责处理用户的输入,计算出相应的性格类型,并将结果...
在软件开发过程中,软件测试是不可或缺的一环,它确保了产品的质量、稳定性和可靠性。面试时,面试官通常会提出一系列软件测试相关的题目来评估应聘者的技能和经验。以下是一些可能出现在“软件测试面试题-收集了...
总之,TestSteps 是一个强大的工具,旨在提升 Python 开发和测试团队的工作效率,通过其结构化的测试用例编写方式和详尽的日志记录,它可以帮助团队更快地定位和解决问题,确保软件质量。对于任何涉及 Python 测试...
- **正交表测试**是一种统计学方法,用于生成覆盖所有输入组合的最小测试用例集。 - **特点**: - 可以有效减少测试用例的数量。 - 适用于参数较多且相互独立的情况。 - 有助于识别参数间的交互影响。 #### 5. ...