我是不会,所以只能友情UP了。
o                    .  .- .-
                                                        ./    .--...
                                   o          .-------- $    .--
                              o  分    o     /                 .......
                                    分       '                  ..    
                             o   o    o      '........            ----
                                       o 分           .          --..
                            o 分   o         o           .   .---..   -
                                 分      o               .  '     -.
                                    o   o             /   '
                               分    o  分               / ' ' '
                                   \-----/....... . '  ' '  '
                                    \ __/ -      - -'  '  ' '
                                                    '  '  ' '
                                     o              '   ' ' '
                                                    '   '  '
                                                     -..'.----------.
                                                        I   ----------
                                                 /////////.

解决方案 »

  1.   

    1数据库中需要建立测试用表吧,有没有什么讲究?比如类型需不需要齐全之类的,数据量多大等

    一般是在测试的时候,建立测试数据库,好像没有建立测试表吧?
    2查询类支持多种数据库,针对不同的数据库会生成不同的SQL语句,那是不是每种数据库都要进行测试?比如具体的一个取数据的方法,是不是针对每种数据库都要写个测试方法?

    这个倒不用。
    一般JUnit是用来保证方法能成功执行的。
    而具体的执行是在你的方法里的。
    你可以使用配置文件来指定数据库一般开发时,也不会老换数据库。
    就是换数据库,与数据库操作的代码也一般是不会太大改变的。
    3对于重载函数,不同的参数都要写一个单独的测试方法,还是在同一个方法中进行多个判断?
    最好,一个测试对应一个方法4查询结果会存在一个object型二维数组中,在测试方法中是否数组中每个元素都要进行判断?这个根据具体情况来决定。
      

  2.   

    不是测试用表,而是关键在于测试数据状态的设置。
    可以使用工具dbunit来辅助你的数据库测试。
      

  3.   

    新年快乐! 第一
    接分      第二
    问题我不会
         o                    .  .- .-
                                                            ./    .--...
                                       o          .-------- $    .--
                                  o  分    o     /                 .......
                                        分       '                  ..    
                                 o   o    o      '........            ----
                                           o 分           .          --..
                                o 分   o         o           .   .---..   -
                                     分      o               .  '     -.
                                        o   o             /   '
                                   分    o  分               / ' ' '
                                       \-----/....... . '  ' '  '
                                        \ __/ -      - -'  '  ' '
                                                        '  '  ' '
                                         o              '   ' ' '
                                                        '   '  '
                                                         -..'.----------.
                                                            I   ----------
                                                     //////////.
      

  4.   

    用DBUnit吧,它是Junit的一个扩展,专门用来测试操作数据库的类的这是他的网站http://dbunit.sourceforge.net/我前段时间用过,感觉不错
      

  5.   

    多谢各位,但还是有一些不太明白,请再指教一下
    to Leemaasn
    第一点,测试的是查询数据库中数据的类,不需要测试表的话查询什么数据呢?第二点,因为不同的数据库在某些sql语句的写法上不同,因此在查询类中会针对不同的类别拼装不同的sql语句,如果只测试一个数据库类型只能进行一种拼装,那是不是有些代码测试不到?(用junit进行测试要不要求面面俱到?)第三点,我举个具体例子,比如有int getValue()和int getValue(String s)两个方法,那应该怎么写testGetValue()?写几个?第四点的具体情况是什么,能举些例子吗
    to xiaohaiz:
    不是测试用表,而是关键在于测试数据状态的设置。
    这句话能解释一下吗?
    另:DBUnit我听说过但没用过,我去找找资料
      

  6.   

    dbunit,没怎么听过,看来有点落伍了,要找点资料看看,顺便接粉
      

  7.   

    新年快乐!
    接分
    junit + ant 不错,我们都用他:)
      

  8.   

    首先,楼主学习态度好,有钻研精神,令人佩服第一点,测试的是查询数据库中数据的类,不需要测试表的话查询什么数据呢?一般,开发产品/项目,总有一个真实运行环境和模拟测试环境;
    我说的测试数据库是指运行在模拟测试环境上的测试数据库。
    数据库里当然还要建立对应的表了。
    第二点,因为不同的数据库在某些sql语句的写法上不同,因此在查询类中会针对不同的类别拼装不同的sql语句,如果只测试一个数据库类型只能进行一种拼装,那是不是有些代码测试不到?(用junit进行测试要不要求面面俱到?)关于数据库,我的看法是:
    应该用封装的办法,对不同的数据库作封装,留出业务接口;
    你的程序调用的是接口,不是数据库。
    你的程序看到的只是一个数据库,并不是多个数据库。对于对数据库作调用封装的代码,你再分别用JUnit作测试。第三点,我举个具体例子,比如有int getValue()和int getValue(String s)两个方法,那应该怎么写testGetValue()?写几个?testGetValue()
    {
    assertEquals(1, getValue());
    assertEquals(1, getValue(String));
    }
    第四点的具体情况是什么,能举些例子吗打字太累了。
    :)楼主心态好,很好。
    不过似乎对JUnit是初接触,把它当万能了?
    有多种XUnit工具,比如binny提到的DBUnit,善用他们吧。
      

  9.   

    多谢Leemaasn,确实是初次接触junit,对怎样使用没有很形象的概念,可能有些东西一时理解不了,多包涵:)上面讲的大部分我都理解了,有一点比较困惑的是:用junit进行测试要不要求面面俱到?举个简单的例子:
    String getStr(int i){
        String str;
        switch(i){
            case 1 : str = "first"; break;
            case 2 :str = "second"; break;
            ……
            default: str = "no"; break;
        }
        str = str + " number";
        return str;
    }
    那么在写testGetStr()时要不要判断i取所有可能值时的输出?换成条件语句也一样,要不要判断条件成立和不成立时两种情况?我觉得如果需要的话测试代码会很多,如果不需要的话不能保证测试的正确性(特别是在case后面代码复杂的情况下),不知道一般是如何处理这种问题的?PS:不知道这个问题有没有钻牛角尖了
      

  10.   

    <<
    to xiaohaiz:
    不是测试用表,而是关键在于测试数据状态的设置。
    这句话能解释一下吗?
    >>
    俺们先来简要看一下测试样例的前要条件吧。一般来说,每一个测试样例运行都可以说有三个依赖的条件,分别是:
    (1) 测试环境:主要是硬件/网络/部署等;
    (2) 运行状态:系统的运行状态,比如模块A运行依赖模块B,那么B就是测试A的必要条件;
    (3) 数据状态:这个状态描述测试样例运行的时候必须有哪些数据。俺们下面来简单看一下这三点:第一个测试环境,变化的频率很低,特别对于单元测试来说,主要以功能测试为主,几乎在很大部分情况下不需要修改测试环境。第二点,运行状态的变化频率相对稍高,但是也不会是主要变化因素。极少的情况下才会产生测试运行时变化运行状态,所以,不需要花很大的精力来考虑这个。第三个数据状态的变化频率就非常频繁了,而且对于测试样例来说,对于数据状态的要求也是非常直接的,必须你需要测试一个销户的功能,从系统中删除一个登陆名为abc的用户,那么数据状态要求什么?必须要求事先存在一个abc用户,这就是这个测试样例的数据状态。很多测试就是围绕着数据状态的维护来展开的(当然,数据状态并不简单是指数据库的数据状态,这是一个相对广义的概念)现在,俺们拿你的例子来说事:
    比如有一张表 CUSTOMER_T,字段为ID NUMBER和NAME VARCHAR2,用来描述用户信息,每一个ROW就是一个用户。有一个JAVA的数据结构类来表示:
    public final class Customer {
        private long id;
        private String name;
        // getter and setter...
    }
    为了能够从数据库查询出来,比如需要查询所有的用户,假设有这么一个方法:
    Customer[] queryAll() throws SQLException;
    那么现在问题就是如何针对测试queryAll方法来定义数据状态了。那么就可以定义一个数据状态:
    测试queryAll之前,表CUSTOMER_T中就只有两条记录{1, name1}和{2, name2}。
    有个这个我们就可以做断言了,单元测试如下:
    public void testQueryAll() throws Exception {
        // 这个expects是期望的数据
        List expects = Arrays.asList(new Customer[]{
                       new Customer(1, "name1"), new Customer(2, "name2")});
        Customer[] actuals = queryAll();
        assertEquals(expects.size(), actuals.length); // 断言结果数目是一致的
        for(int i=0;i<actuals.length;++i) {
            assertTure(expects.contains(actuals[i])); // 断言结果在期望中
        }
        // other ....
    }
    这样就完成了一个基本的单元测试。
    但是这个测试还有缺陷。缺陷在什么地方?数据状态的维持还必须靠“手动”的方式来执行,根本无法让测试样例能够自动重复运行,这样递归测试是无法保证的。因为queryAll测试所以来的数据状态很容易被修改掉(其他的样例)。
    所以俺们现在的工作就是要在这个样例被运行之前,保证这个数据状态。
    于是,如果俺们直接写,就可以写成这样:
    public class TestCustomerQueryer extends TestCase {
        protected void setUp() throws Exception {
            // 假设在setUp处来保证数据状态
            Connection conn = ...; // 申请数据库连接
            Statement stat = conn.createStatement();
            stat.addBatch("DELETE FROM CUSTOMER_T");
            stat.addBatch("INSERT INTO CUSTOMER_T (ID,NAME) VALUES (1,'name1')");
            stat.addBatch("INSERT INTO CUSTOMER_T (ID,NAME) VALUES (2,'name2')");
            stat.executeBatch();
            stat.close();
            conn.close();
        }
        public void testQueryAll() throws Exception {
            // ....
        }
    }
    这样就相对完善了。每次在测试queryAll之前,都能保证数据状态。剩下的话题就是,俺们如果自己写这些东西,可以否?可以。但是很累。所以应该找工具来辅助俺们。dbunit是其中一个不错的选择。
    楼主看看dbunit的文档,看看它作什么的?主要就是维护数据状态。
      

  11.   

    就楼上的例子来说 我会偷懒写成assertEquals("first", obj.getStr(1));就写这么一条。还有 并不是所有的方法都需要写测试的 getter setter都不必
    当然 楼上这个名字是getter 内容不是getter 还是需要的
      

  12.   

    老土的回答真敬业!佩服! btw...老土忘记写tearDown了btw...偶还第一次知道dbunitnnd java咋这么多工具
      

  13.   

    楼主,
    对于这个函数:
    String getStr(int i){
        String str;
        switch(i){
            case 1 : str = "first"; break;
            case 2 :str = "second"; break;
            ……
            default: str = "no"; break;
        }
        str = str + " number";
        return str;
    }我觉得应该进行如下测试(至少):
    assertEquals(first, 1);
    assertEquals(second, 2);
    assertEquals(no, other0);
    assertEquals(no, other1);
    assertEquals(no, other2);
    在这里,主要是other这种情况,上面两种只是例行验证而已。还有,简单的getter和setter就不用了如 jigsaw(jigsaw)所说的。。楼主还应该多参考
     xiaohaiz(城里的老土,两眼依然通红!) 
      jigsaw(jigsaw) 
      binny(骑个破车看夕阳) 
    的说法。新年快乐