锁定老帖子 主题:吹弹得破是重回一人犯错,全家光荣的老路
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-04-21
robbin 写道 简单谈谈这个问题我的想法:
1、今天晚上下载了springside代码简单浏览了一下,基本上明白白衣同学为什么有这样的抱怨了。上面不理解的诸位也去看看他下载包里面的plugin子目录就会明白。 springside的plugin机制就是让你自己去写一个spring配置文件和bean类,然后他应用程序用统配符的方法加载所有classpath下面的*-context.xml文件。也就是说但凡有人的plugin里面的配置不对,整个应用就load不起来了。 这里根本问题在于plugin机制这样去设计就是错误的。plugin本身不应该直接使用一个紧密的核心机制直接拆分出来作为plugin。 robbin能不能给点改进的意见?因为springside的插件定位是让大家可以各取所需,快速定位到自己关心的东西上,而且尽量降低其他东西对他的干扰。 在这种前提下,设计目标就是尽量使用目前的机制,大家可以直接copy到自己项目中的,而不是自己搞一个tonic之类的插件机制,别人如果要copy ss里的东西还要装个插件框架就不合算了。 |
|
返回顶楼 | |
发表时间:2006-04-21
zkj_beyond 写道 引用 robbin
1 团队开发时先进行哪个层,还是平行的. 是按照模块分工呢,还是逻辑分层来分工? 2 *-context.xml 是按照模块划分,还是层划分. 这些配置是否对团队开发人员可见? 3 生产环境下与运行环境下*-context.xml是否一套? 隐隐感觉,人数越多的团队,用spring开发问题会多起来? 回到白衣问题的根上,看了半天贴,还是没得出好的办法来. 白衣的问题就是不应该拿spring load xml的机制来当plugin来用。这种plugin本来用起来就太危险,把你应用完全依赖到plugin上面去了。一个合理的plugin机制必须能够有良好的验证机制,验证插上来的plugin是否符合要求的格式。而且plugin提供的功能也不应该是无限制的,必须基于你的plugin manager提供出来的API接口上。所以plugin机制不好做。我觉得可以好好研究一下tonic和confluence。特别是应该看看Mike Cannon-Brookes的ppt: http://www.iteye.com/pages/viewpage.action?pageId=968 spring配置文件首先起码需要按照层去划分,然后如果模块比较多,还可以继续按照模块划分 生产环境和测试环境的大部分xml配置都可以公用,但是数据库配置分开各用各的。 |
|
返回顶楼 | |
发表时间:2006-04-21
江南白衣 写道 robbin 写道 简单谈谈这个问题我的想法:
1、今天晚上下载了springside代码简单浏览了一下,基本上明白白衣同学为什么有这样的抱怨了。上面不理解的诸位也去看看他下载包里面的plugin子目录就会明白。 springside的plugin机制就是让你自己去写一个spring配置文件和bean类,然后他应用程序用统配符的方法加载所有classpath下面的*-context.xml文件。也就是说但凡有人的plugin里面的配置不对,整个应用就load不起来了。 这里根本问题在于plugin机制这样去设计就是错误的。plugin本身不应该直接使用一个紧密的核心机制直接拆分出来作为plugin。 robbin能不能给点改进的意见?因为springside的插件定位是让大家可以各取所需,快速定位到自己关心的东西上,而且尽量降低其他东西对他的干扰。 在这种前提下,设计目标就是尽量使用目前的机制,大家可以直接copy到自己项目中的,而不是自己搞一个tonic之类的插件机制,别人如果要copy ss里的东西还要装你的插件框架就不合算了。 那你需要的就不是plugin机制,而是一个模板生成工具,我选择需要的功能,然后你生成包含我选择功能的那些代码。 |
|
返回顶楼 | |
发表时间:2006-04-21
引用 目前DAO测试由于每个test都需要初始化spring容器和创建/drop 表,所以运行速度有点慢,差不多一个test需要1-2秒时间才能执行完毕(在我笔记本电脑上面),但是我目前也找不到更快的办法了。 我以前也是这么做的,感觉不够快,不能随心所欲地运行test,现在我用spring的org.springframework.test.AbstractTransactionalDataSourceSpringContextTests,创建/drop表,导入测试数据,初始化spring容器都只需要一次,在我这59个操作数据库的integration test method只需要不到9秒就完成,完整的一次编译/测试/生成测试报告只需要17秒左右,包含99个java class,27个test class(98个test method) |
|
返回顶楼 | |
发表时间:2006-04-21
stillanother 写道 引用 目前DAO测试由于每个test都需要初始化spring容器和创建/drop 表,所以运行速度有点慢,差不多一个test需要1-2秒时间才能执行完毕(在我笔记本电脑上面),但是我目前也找不到更快的办法了。 我以前也是这么做的,感觉不够快,不能随心所欲地运行test,现在我用spring的org.springframework.test.AbstractTransactionalDataSourceSpringContextTests,创建/drop表,导入测试数据,初始化spring容器都只需要一次,在我这59个操作数据库的integration test method只需要不到9秒就完成,完整的一次编译/测试/生成测试报告只需要17秒左右,包含99个java class,27个test class(98个test method) 你这不叫做单元测试。你启动数据库以后,连续做59个测试,前面的测试数据会影响到后面的测试结果。 我之所以慢一点,其实并不是慢在初始化spring容器上面了,而是慢在每个test都需要反复drop/create table上面了。 当然,也可以我每次test之后,test方法自己负责清理测试数据。但是你只要hold spring容器,就无法避免Hibernate二级缓存的影响。所以还是test之间有相关性,最好的办法就是每个test drop/create db. |
|
返回顶楼 | |
发表时间:2006-04-21
看了robbin的测试方法,感觉很不错,和我测试的思路差不多。不过目前在对Service层的测试中,那些Checked Exception有时候令我比较头痛。因为我是比较喜欢在Service层抛Checked Exception,然后由Webwork的Interceptor去截获处理的。我认为Checked Exception应该作为一个异常事件流的表现方式而存在。那么在Service层的测试中,如何能保证测试的完整性呢?具体的说,就是如何让一个测试既能覆盖到正常事件流,又能覆盖到异常时间流?
|
|
返回顶楼 | |
发表时间:2006-04-21
不过我也可以考虑试一下这样的办法,一直hold spring容器,然后test自己清理数据,清理缓存。
|
|
返回顶楼 | |
发表时间:2006-04-21
robbin 写道 stillanother 写道 引用 目前DAO测试由于每个test都需要初始化spring容器和创建/drop 表,所以运行速度有点慢,差不多一个test需要1-2秒时间才能执行完毕(在我笔记本电脑上面),但是我目前也找不到更快的办法了。 我以前也是这么做的,感觉不够快,不能随心所欲地运行test,现在我用spring的org.springframework.test.AbstractTransactionalDataSourceSpringContextTests,创建/drop表,导入测试数据,初始化spring容器都只需要一次,在我这59个操作数据库的integration test method只需要不到9秒就完成,完整的一次编译/测试/生成测试报告只需要17秒左右,包含99个java class,27个test class(98个test method) 你这不叫做单元测试。你启动数据库以后,连续做59个测试,前面的测试数据会影响到后面的测试结果。 我之所以慢一点,其实并不是慢在初始化spring容器上面了,而是慢在每个test都需要反复drop/create table上面了。 当然,也可以我每次test之后,test方法自己负责清理测试数据。但是你只要hold spring容器,就无法避免Hibernate二级缓存的影响。所以还是test之间有相关性,最好的办法就是每个test drop/create db. spring会帮你回滚事务的,所以不会相互影响。 二级缓存我倒没有考虑,我想开启/关闭两种情况都可以测一下,我现在是只测了开启的情况,应该也可以了,毕竟真正生产的时候是开启的。 |
|
返回顶楼 | |
发表时间:2006-04-21
stillanother 写道 robbin 写道 stillanother 写道 引用 目前DAO测试由于每个test都需要初始化spring容器和创建/drop 表,所以运行速度有点慢,差不多一个test需要1-2秒时间才能执行完毕(在我笔记本电脑上面),但是我目前也找不到更快的办法了。 我以前也是这么做的,感觉不够快,不能随心所欲地运行test,现在我用spring的org.springframework.test.AbstractTransactionalDataSourceSpringContextTests,创建/drop表,导入测试数据,初始化spring容器都只需要一次,在我这59个操作数据库的integration test method只需要不到9秒就完成,完整的一次编译/测试/生成测试报告只需要17秒左右,包含99个java class,27个test class(98个test method) 你这不叫做单元测试。你启动数据库以后,连续做59个测试,前面的测试数据会影响到后面的测试结果。 我之所以慢一点,其实并不是慢在初始化spring容器上面了,而是慢在每个test都需要反复drop/create table上面了。 当然,也可以我每次test之后,test方法自己负责清理测试数据。但是你只要hold spring容器,就无法避免Hibernate二级缓存的影响。所以还是test之间有相关性,最好的办法就是每个test drop/create db. spring会帮你回滚事务的,所以不会相互影响。 二级缓存我倒没有考虑,我想开启/关闭两种情况都可以测一下,我现在是只测了开启的情况,应该也可以了,毕竟真正生产的时候是开启的。 你没有理解我的意思,不过也没有关系,我可以手工清理 sessionFactory.evict(...); |
|
返回顶楼 | |
发表时间:2006-04-21
downpour 写道 看了robbin的测试方法,感觉很不错,和我测试的思路差不多。不过目前在对Service层的测试中,那些Checked Exception有时候令我比较头痛。因为我是比较喜欢在Service层抛Checked Exception,然后由Webwork的Interceptor去截获处理的。我认为Checked Exception应该作为一个异常事件流的表现方式而存在。那么在Service层的测试中,如何能保证测试的完整性呢?具体的说,就是如何让一个测试既能覆盖到正常事件流,又能覆盖到异常时间流?
根据我们以前对于异常的讨论,我想有一点是明确的,所有的业务异常都应该是RuntimeException的。 不过不管是不是CheckedException,你当然可以测试异常流了,例如 try { ... fail(...); }catch (...Exception e) { } 一旦无法捕获异常,assert就fail了。 |
|
返回顶楼 | |