论坛首页 综合技术论坛

如何TDD,我对TDD的疑问

浏览 10515 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-11  
到了新公司,新项目用TDD开发。
一直很向往,可是在今天写了一天test case之后,开始产生很多问题。

1,database的问题,应该如何模拟DB,我现在没有模拟,,在test case中连接真正的数据库读内容。这样产生两个问题:
1,每次运行test,因为要连接数据库,速度慢了。
2,如何模拟DaoException?
记得robbin说过这就成了集成测试,而不是真正意义的单元测试。

2,对于参数,是否都应该完备的检查一边。目前基本上是所有可能的null ""我都会在Unit中写入参数非法的情况。但是总这么检查,总是有xx == null ||   xx.eequals("")这种代码,写的多了就有点恶心,譬如我现在就很恶心了。
不测吧,觉得不应该,而且客户要求测试覆盖率90%。测吧,是在有点恶心。

3,算是以上两者的总结吧,如何写最少的测试效果,达到最好的测试目的。发现更多的bug。

TDD早的大牛们来谈谈吧:)小弟先拜拜啦
   发表时间:2006-08-11  
1、DAO的测试还是要连接数据库。要不然意义不大。尽管这已经是集成测试了。用spring的那个AbstractTransactionalDataSourceSpringContextTests,优化一下数据库,如果用hibernate的话可以使用内存数据库。速度还是可以接受的。

异常的模拟还是要靠EasyMock。可以跟连接数据库的写到一块也可以不写到一块。

2、??难道没有公用的参数非法检查模块?这个模块只要有相应的单元测试就不会对覆盖率有影响亚。
0 请登录后投票
   发表时间: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)来检查,可是仅仅减少了一点点代码。还是有太多的地方。
0 请登录后投票
   发表时间: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)来检查,可是仅仅减少了一点点代码。还是有太多的地方。

减少这种代码量有意义吗?
0 请登录后投票
   发表时间: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上有很多文章的.
0 请登录后投票
   发表时间: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内部自己检查的。
0 请登录后投票
   发表时间:2006-08-13  
try{

}cache(NullException e){
    final("");
}

gigix说的对,但有时候我的testcases里面有很多重复测试,没什么问题吧。
0 请登录后投票
   发表时间: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个了,减少了一半以上。
上面只是抛个砖,希望能引来大牛们的玉,呵呵。
0 请登录后投票
   发表时间:2006-08-13  
zkj_beyond 写道
try{

}cache(NullException e){
    final("");
}

gigix说的对,但有时候我的testcases里面有很多重复测试,没什么问题吧。

这就不是测试的问题了,是class的设计就有问题。一个参数应该符合什么条件(例如不为null,不为空字符串),要么主调方检查,要么被调方检查,这是接口契约的一部分,要弄清楚的。如果两边都在检查,第一是重复代码,第二是契约弄不清,叫别人看了你的代码不能肯定到底应该怎么去用一个东西。
0 请登录后投票
   发表时间:2006-08-13  
gigix 写道
一个参数应该符合什么条件(例如不为null,不为空字符串),要么主调方检查,要么被调方检查,这是接口契约的一部分,要弄清楚的。如果两边都在检查,第一是重复代码,第二是契约弄不清,叫别人看了你的代码不能肯定到底应该怎么去用一个东西。


gigix说的对,这也正是契约的作用。我比较倾向于主调方检查,被调方尽可能地不要分心去想20%的参数错误情况,只要默认所有的参数都正确,集中精力完成该完成的事情就行叻,不然写起来要烦死。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics