锁定老帖子 主题:如何TDD,我对TDD的疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-08-11
一直很向往,可是在今天写了一天test case之后,开始产生很多问题。 1,database的问题,应该如何模拟DB,我现在没有模拟,,在test case中连接真正的数据库读内容。这样产生两个问题: 1,每次运行test,因为要连接数据库,速度慢了。 2,如何模拟DaoException? 记得robbin说过这就成了集成测试,而不是真正意义的单元测试。 2,对于参数,是否都应该完备的检查一边。目前基本上是所有可能的null ""我都会在Unit中写入参数非法的情况。但是总这么检查,总是有xx == null || xx.eequals("")这种代码,写的多了就有点恶心,譬如我现在就很恶心了。 不测吧,觉得不应该,而且客户要求测试覆盖率90%。测吧,是在有点恶心。 3,算是以上两者的总结吧,如何写最少的测试效果,达到最好的测试目的。发现更多的bug。 TDD早的大牛们来谈谈吧:)小弟先拜拜啦 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-08-11
1、DAO的测试还是要连接数据库。要不然意义不大。尽管这已经是集成测试了。用spring的那个AbstractTransactionalDataSourceSpringContextTests,优化一下数据库,如果用hibernate的话可以使用内存数据库。速度还是可以接受的。
异常的模拟还是要靠EasyMock。可以跟连接数据库的写到一块也可以不写到一块。 2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。 |
|
返回顶楼 | |
发表时间:2006-08-11
2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。
请问这个该怎么做? 譬如: getXXX(BB b, CC c) 这个方法。 我想测试他 这个方法要求是 BB != null CC != null BB.getT() !=null !BB.getT().equals("") CC.getU() !=null !CC.getU().equals("") 请问这种情况如何来作? 我现在在这个方法内用的Objct != null && StringUtils.isEmpty(String s)来检查,可是仅仅减少了一点点代码。还是有太多的地方。 |
|
返回顶楼 | |
发表时间:2006-08-12
冉翔 写道 2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。
请问这个该怎么做? 譬如: getXXX(BB b, CC c) 这个方法。 我想测试他 这个方法要求是 BB != null CC != null BB.getT() !=null !BB.getT().equals("") CC.getU() !=null !CC.getU().equals("") 请问这种情况如何来作? 我现在在这个方法内用的Objct != null && StringUtils.isEmpty(String s)来检查,可是仅仅减少了一点点代码。还是有太多的地方。 减少这种代码量有意义吗? |
|
返回顶楼 | |
发表时间:2006-08-12
冉翔 写道 到了新公司,新项目用TDD开发。
一直很向往,可是在今天写了一天test case之后,开始产生很多问题。 1,database的问题,应该如何模拟DB,我现在没有模拟,,在test case中连接真正的数据库读内容。这样产生两个问题: 1,每次运行test,因为要连接数据库,速度慢了。 2,如何模拟DaoException? 记得robbin说过这就成了集成测试,而不是真正意义的单元测试。 robbin说的对. 你是测试实现DAO的代码还是调用DAO的代码? 冉翔 写道 2,对于参数,是否都应该完备的检查一边。目前基本上是所有可能的null ""我都会在Unit中写入参数非法的情况。但是总这么检查,总是有xx == null || xx.eequals("")这种代码,写的多了就有点恶心,譬如我现在就很恶心了。 不测吧,觉得不应该,而且客户要求测试覆盖率90%。测吧,是在有点恶心。 这就叫完备的检查一遍? design by contract 冉翔 写道 3,算是以上两者的总结吧,如何写最少的测试效果,达到最好的测试目的。发现更多的bug。 搞清楚什么叫"单元测试" ,搞清楚什么叫mockobject和它正确的使用法. 我记得junit.org上有很多文章的. |
|
返回顶楼 | |
发表时间:2006-08-12
冉翔 写道 2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。
请问这个该怎么做? 譬如: getXXX(BB b, CC c) 这个方法。 我想测试他 这个方法要求是 BB != null CC != null BB.getT() !=null !BB.getT().equals("") CC.getU() !=null !CC.getU().equals("") 请问这种情况如何来作? 我现在在这个方法内用的Objct != null && StringUtils.isEmpty(String s)来检查,可是仅仅减少了一点点代码。还是有太多的地方。 这都是该在BB/CC内部自己检查的。 |
|
返回顶楼 | |
发表时间:2006-08-13
try{
}cache(NullException e){ final(""); } gigix说的对,但有时候我的testcases里面有很多重复测试,没什么问题吧。 |
|
返回顶楼 | |
发表时间:2006-08-13
冉翔 写道 2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。
请问这个该怎么做? 譬如: getXXX(BB b, CC c) 这个方法。 我想测试他 这个方法要求是 BB != null CC != null BB.getT() !=null !BB.getT().equals("") CC.getU() !=null !CC.getU().equals("") 请问这种情况如何来作? 我现在在这个方法内用的Objct != null && StringUtils.isEmpty(String s)来检查,可是仅仅减少了一点点代码。还是有太多的地方。 分支,测试用例,测试用例的简化 以你的这种情况这种情况为例,假设代码这么写的(这里只关心测试,不关心其他方面) public String getXXX(BB b, CC c); { String result = null; if (b != null && c != null && b.getT(); != null && !b.getT();.equals(""); && c.getU(); !=null && !c.getU();.equals("");); { result = "xxx"; } return result; } 这段程序分支数是2,测试用例却需要7个,怎么简化呢?看下面 public String getXXX(BB b, CC c); { String result = null; if (StringUtil.isAllNotNull(b, c); && StringUtil.isAllNotEmpty(b.getT();, c.getU();); { result = "xxx"; } return result; } 这段程序分支数仍然是2,但是测试用例却只需要3个了,减少了一半以上。 上面只是抛个砖,希望能引来大牛们的玉,呵呵。 |
|
返回顶楼 | |
发表时间:2006-08-13
zkj_beyond 写道 try{
}cache(NullException e){ final(""); } gigix说的对,但有时候我的testcases里面有很多重复测试,没什么问题吧。 这就不是测试的问题了,是class的设计就有问题。一个参数应该符合什么条件(例如不为null,不为空字符串),要么主调方检查,要么被调方检查,这是接口契约的一部分,要弄清楚的。如果两边都在检查,第一是重复代码,第二是契约弄不清,叫别人看了你的代码不能肯定到底应该怎么去用一个东西。 |
|
返回顶楼 | |
发表时间:2006-08-13
gigix 写道 一个参数应该符合什么条件(例如不为null,不为空字符串),要么主调方检查,要么被调方检查,这是接口契约的一部分,要弄清楚的。如果两边都在检查,第一是重复代码,第二是契约弄不清,叫别人看了你的代码不能肯定到底应该怎么去用一个东西。
gigix说的对,这也正是契约的作用。我比较倾向于主调方检查,被调方尽可能地不要分心去想20%的参数错误情况,只要默认所有的参数都正确,集中精力完成该完成的事情就行叻,不然写起来要烦死。 |
|
返回顶楼 | |