Dao层的测试实践

发表于:2012-8-07 11:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:方世玉    来源:51Testing软件测试网采编

  1、Dao单元测试的问题

  Dao层主要工作数据库访问,是非常重要的模块。为了保证SQL的正确执行,单元测试是必须的。但是一直以来Dao层的单元测试很难进行,主要因为几个问题

  1)单元测试必须是执行隔离的环境代码,而隔离数据库非常困难,不得不放弃这个念头。所以Dao层需要和数据库直接打交道,但是单元测试要求每次重复的动作结果都是一致,但是由于外部数据库环境的问题,测试环境无法稳定。

  2)现阶段的Dao层一般都会利用Spring的容器组装Dao对象,在辅以一些Support对象。这样的结果就是没有Spring容器,无法测试Dao。

  3)每个测试之前,数据库必须处于一个稳定的已知的状态,这就需要数据准备,而单元测试的数据如果要手工插入到数据库中,工作量过大。

  4)测试用例必须有断言,我们需要通过断言来判断数据是否插入数据,每个字段是否相同,这个如果没有辅助工具,而手工去一个个断言,工作量不能接受的

  2、解决方案

  为了解决以上问题,我们选择了Unitils来集成Spring、Dbunit等,完成Dao层的单元测试工作,并和Maven工程结合完成配置。

  Unitils的使用很简单,以下面的一个例子来说明。

  Dao的代码很简单,是查询、更新一个用户的账户信息

  Java代码

public class AccountDao extends JdbcDaoSupport {

    public Account getAccount(String accountId) {
        List<Account> list = null;

        list = getJdbcTemplate().query("select account_id,balance from tb_account where account_id=?",
                new Object[] { accountId }, new RowMapper<Account>() {

                    @Override
                    public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
                        Account acc = new Account();
                        acc.setAccountId(rs.getString("account_id"));
                        acc.setBalance(rs.getInt("balance"));
                        return acc;
                    }
                });
        if (list.size() > 0) {
            return list.get(0);
        } else {
            return null;
        }
    }

    public int updateAccount(String accountId, int balance) {
        int ret = getJdbcTemplate().update("update tb_account set balance = ? where account_id =?",
                new Object[] { balance, accountId });
        return ret;
    }
}

  1)Maven的POM文件修改

  在Dao工程中的POM文件加入如下

  Java代码

  <dependency>
   <groupId>org.unitils</groupId>
   <artifactId>unitils-dbunit</artifactId>
   <version>${unitils.version}</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.unitils</groupId>
   <artifactId>unitils-spring</artifactId>
   <version>${unitils.version}</version>
   <scope>test</scope>
  </dependency>

  unitils.version目前最新的为3.3版本

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号