IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

用YAML构建数据测试DAO层

龙浩的blog 2011-10-17 22:40:21 累计浏览 2,931 次
本机暂存

     测试DAO层最常见的就是直接组织数据,调用相关的方法,然后查看数据库,看看相关数据是否在DB中正确的展示。这样测试,效率低下,容易出错,过多的依赖了人肉。如果选择测试数据来配置,根据配置的测试数据验证相关信息,或许能够达到事半功倍的效果。

测试数据配置选择(YAML)

        在JavaBean中,传统的对象set是这样的:

    pvs.setId(100L);
    pvs.setCookieAdvert(1);
    pvs.setCookieAdList("1");

       对象属性多时,对象的set显得有些复杂,自动代码生成工具生成的代码较多都是set数据的,代码看起来不够雅观,需要把测试数据和测试代码分离。可以提供参考的又xml,wiki的方式。xml的方式读取大家都比较清楚,这里介绍一下wiki:

    wiki语法

|table|表名称|
|字段名称1|字段名称2|字段名称3|
|字段值|字段值|字段值|
|字段值|字段值|字段值|
|字段值|字段值|字段值|

     通过wiki配置的方式,和表字段一一对应,看起来比较直观,只是在字段较多时容易造成混淆,同时需要自己写代码支持wiki语法,框架级别的支持不够。xml配置也麻烦,数据阅读也不够直观。

     yaml简单,直观,方便阅读,java支持框架(http://yaml.org/)较多,所以选择yaml来配置测试数据。和TestNg保持一致,使用snakeyaml (http://code.google.com/p/snakeyaml/)

测试过程:

     测试数据包括BaseDao对DB的基本操作:insert , update , find , findById , list , listCount , delete。由于findById和delete都是只有一个字段,所以测试数据基本生成只有insert , update ,delete , list这四个,业务模块可以根据自己的需求添加相关的Dao层测试数据。

     测试修改示例:

insert: !!com.longtask.analysis.report.domain.entity.User
  pv: 1
  uv: 1
  ip: 1
  liveTime:
  isDate: 1
  startTime: 1
  endTiem: 1
  addTime: 1
update: !!com.longtask.analysis.report.domain.entity.User
  pv: 1
  uv: 1
  ip: 1
find: !!com.longtask.analysis.report.domain.entity.User
  pv: 1
  uv: 1
  ip: 1
list: !!com.longtask.analysis.report.domain.entity.User
  pv: 1
  uv: 1
  ip: 1

    说明:

  • 字段会自动转换成需要类型,所以long设置后面不用加L
  • 为空的数据不用设置,也不用删除相关的属性(尤其是insert,后面可以作为复制粘贴的参考)
  • 时间设置createdTime: 2011-09-23 15:03:17
  • 数据读取的代码

        读取yaml配置文件数据,放置到map中的代码:

        public Map getYamlData(String name){

                 try {

                     Yaml yaml = new Yaml();

                     @SuppressWarnings("unchecked")

                     Map data = (Map)yaml.load(this.getClass()

                             .getResourceAsStream("/" + name));

                     return data;

                 } catch (Exception e) {

                     logger.error("init yaml error : " , e);

                     throw new RuntimeException("init yaml error : " , e);

                 }

             }

        子类中测试代码

        @BeforeMethod

             public void setBefore() {

                 String pg = this.getClass().getPackage().getName().replace(".", "/");

                 data = super.getYamlData( pg + "/UserDaoTest.yaml");

             }

        private Map  data;

        调用data中的属性,获取到相关对象

        User user = data.get("insert");

         代码生成工具如果用yaml配置,彻底分离了测试数据准备和代码,会让测试更加简单!

    同分类推荐文章

    1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
    2. Go 实验特性详解 (2026-06-21 10:05:27)
    3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

    查看更多 后端 文章 →

    建议继续学习

    1. Facebook 网站架构 (累计阅读 11,112)
    2. Instagram的技术架构 (累计阅读 9,894)
    3. 腾讯php程序员面试题目答案 (累计阅读 8,974)
    4. 分布式系统的事务处理 (累计阅读 7,384)
    5. PHP Extension开发基础 (累计阅读 6,644)
    6. 如何设计用户登录 (累计阅读 6,643)
    7. MySQL 5.6 测试之 Replication(主从复制) (累计阅读 6,268)
    8. 用 redis 实现和保护 12306 (累计阅读 5,626)
    9. 数据库的堆表与索引组织表的数据存储格式讨论 (累计阅读 5,598)
    10. 给学PHP、工作中在用PHP的朋友们推荐几本书 (累计阅读 5,363)