跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 大家在做单元测试的时候如何准备数据库环境?
未分類
2020 年 6 月 29 日

大家在做单元测试的时候如何准备数据库环境?

大家在做单元测试的时候如何准备数据库环境?

資深大佬 : shazh520 64

例如说需要测试一个删除功能,大家是在测试方法的开头插入一条记录以供删除吗?还是什么其他方法?

还有一种情况是,例如一个电商系统,想测删除 SKU 接口,准备数据的时候就得先准备产品,然后再准备 SKU,大家是如何准备的?

大佬有話說 (49)

  • 主 資深大佬 : shazh520

    V 友求教 求教

  • 資深大佬 : Hanggi

    测试没有 before 和 after 吗?通常都是要在测试开头创建数据,结束的时候删掉的。

  • 資深大佬 : BruceLi

    mock 一下,单元测试一般不依赖其他接口或者系统。

  • 主 資深大佬 : shazh520

    @Hanggi 用 jpa 插入数据吗?还是用 SQL 脚本?

  • 主 資深大佬 : shazh520

    @BruceLi 就是自己的系统啊,测试删除产品接口,那得有一个产品 ID 啊,如何准备这个产品 ID 的问题

  • 資深大佬 : Ahaochan

    用 h2database,准备初始化 sql 脚本

  • 主 資深大佬 : shazh520

    @Ahaochan 项目已经用 MySQL 了,现在好像换不了

  • 資深大佬 : KentY

    google 下 flyway 和 h2

  • 資深大佬 : lihongjie0209

    有数据库就不叫单元测试了

  • 資深大佬 : zunceng

    dao 层做一个 mock 当然也可以用 sqlmock

  • 資深大佬 : chendy

    既然是单元测试,那就 mock 掉 dao
    否则就脚本塞数据,直接测接口,做集成测试

  • 資深大佬 : greenlaw110

    mock 是常见的方式, 不过涉及到数据库操作的情况下,mock 总感觉不靠谱. 啥都 mock 了,函数里面也没有什么逻辑, 测试也失去了应有的作用.

    这也是我一直很纠结单元测试的原因之一.

    后来自己折腾出了一套 functional 测试工具, 数据准备与清理工作也不成问题了. 有兴趣的同学可以参考一下这里:
    https://gitee.com/actframework/act-doc/blob/master/cn/test.md#-82-%E5%87%86%E5%A4%87%E6%B8%85%E7%90%86%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE

  • 主 資深大佬 : shazh520

    @lihongjie0209
    @chendy 感谢 认识上的一个误区

  • 主 資深大佬 : shazh520

    @KentY 有了新思路

  • 資深大佬 : killergun

    自己 mock 数据进行单元测试。不实际连接数据库

  • 資深大佬 : phpcxy

    我都是开始测试的时候创建一些记录,然后测试完回滚 大家在做单元测试的时候如何准备数据库环境?

  • 資深大佬 : abcbuzhiming

    想问一下,你们本地完全没有数据库的吗?这种涉及到数据库的难道不应该至少本地建个库(或者专门一个数据库服务器)测试一下吗

  • 資深大佬 : fkdog

    spring 在测试类上打上 @transactional 注解。
    这样运行完测试方法会自动回滚数据,比 before after 清理资源方式更简单

  • 資深大佬 : mingoing

    sqlite 内存模式了解下

  • 資深大佬 : liuzhaowei55

    spring boot + jpa 可使用 @DataJpaTest 注解,会自动回滚。

  • 資深大佬 : lazyfighter

    我今天刚提问这个问题,之前依赖 mysqlServer,目前依赖 embeddedH2

  • 資深大佬 : slyang5

    @Test
    @SqlGroup({
    @Sql(“/sql/sql_logic_delete.sql”),
    @Sql(scripts = “/sql/sql_logic_delete_clear.sql”, executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD) })
    public void featuresLogicDeleteTest() {
    // do ….
    }

  • 資深大佬 : slyang5

    @slyang5 语言 JAVA, 框架 spirng

  • 資深大佬 : dengtongcai

    mock 哇

  • 資深大佬 : janxin

    单测目前都是 Mock

  • 資深大佬 : kaneg

    如果不依赖特定数据库的特性,可以用 h2,完全不依赖运行环境,一次编写,随处运行。

  • 資深大佬 : luozic

    Java 有不少集成版本的测试 demo 数据库,H2,monogodb,redis 都有对应的,即使没有,按 JDBC 也可以 mock

  • 資深大佬 : daimazha

    内嵌

  • 資深大佬 : hantsy

    终于看到一个技术帖子了。

    写 Java 测试离不开 JUnit。在 Spring 下写测试比较简单些,Spring 自身带的测试工具很全。
    https://github.com/hantsy/building-restful-apis-with-springmvc-gitbook/blob/master/testing.md (比较老了一点)
    Spring Boot 1.4 中增加了大量工具简化测试: https://github.com/hantsy/building-restful-apis-with-springmvc-gitbook/blob/master/boot-1.4.md

    数据库相关的单元测试可以 Mock 相应的操作(比如 Mock JpaRepsoitory ),集成测试时也需要创建数据库,初始化数据为测试准备,Spring Boot 可以使用嵌入式数据库代替(不用清理数据)。

    Java EE 的测试参考:
    Java EE 6: https://github.com/hantsy/signup-app/tree/master/src/test/java/org/company/test
    Java EE 7: https://github.com/hantsy/ee7-jaxrs-sample/tree/master/vanilla/src/test/java/com/hantsylab/example/ee7/blog
    Java EE 8: https://github.com/hantsy/javaee8-jaxrs-sample/tree/master/backend/src/test/java/com/github/hantsy/ee8sample/rest

  • 資深大佬 : lihuayang

    用 h2。单测前准备好 ddl (新建表)、dml (数据),每次运行单测都加载这两个文件。干净,不会污染测试环境的库。

  • 資深大佬 : p1094358629

    我自己写了一个 basicTemplateTest 基类。模板方法:
    提供了编程式事务,配置 setRollBackOnly().即用 spring 的 jdbc 自动回滚。

  • 資深大佬 : zhuzhibin

    你这种场景应该叫验收测试吧 通常是 before 前初始化 after 清除掉咯

  • 資深大佬 : springz

    启动一个 docker,用完关闭。

  • 資深大佬 : springz

    模拟 dao 我也是我纠结的点,还是尽量真实吧。

  • 資深大佬 : AbrahamGreyson

    主流的方式是在 setup teardown 里准备数据, 清空数据库。

    上面说 mock 的, 主就是要测数据库。

  • 資深大佬 : des

    +1 感觉本来就是 curd,mock 了 dao 层就没啥好测的了

  • 資深大佬 : springz

    我一直反对 dao 层单元测试 mock

  • 資深大佬 : avalon0624

    用 migrate,开始前清空数据库,生成符合条件的测试数据

  • 資深大佬 : x66

    “`
    单元测试( unit testing ),是指对软件中的最小可测试单元进行检查和验证。
    “`
    都连数据库了,还叫单元测试吗?

  • 資深大佬 : FrankD

    可以用本地数据库

  • 資深大佬 : akira

    @x66 测试测试,没必要纠结称呼

  • 資深大佬 : xuanbg

    SQL 语句本来就或多或少包含逻辑,另外数据结构的调整甚至数据库版本的升级,单元测试都不管的么? mock 数据做单元测试的,怕是没更新过数据库结构吧

  • 資深大佬 : dilu

    如果修改了数据库里面的数据 这就叫数据库测试了。当然并没有严格区分,你非要测试也没问题的。

  • 資深大佬 : hmxxmh

    @x66 单元测试不都是造假数据吗,要连数据库直接开个测试环境测试吧

  • 資深大佬 : ebingtel

    我是先 dump 一份测试数据库(不含数据),跑单元测试之后,再 drop 掉……

  • 資深大佬 : zhenjiachen

    这不是很简单吗?如果用了 Spring 的注解事务,不管是 jpa 还是 mybatis 使用单元测试在方法或者类上面加事务注解测试执行完了不管是失败还是成功都会回滚的啊。注意要用 Spring tx 里面的 Transactional。

  • 資深大佬 : zclHIT

    mock repository 的返回结果,单元测试,顾名思义就是测一个单元。
    (整套流程全跑通那是集成测试。。。

  • 資深大佬 : PoetAndPoem

    一般 afterclass 做回滚

  • 主 資深大佬 : shazh520

    我想做的那就是集成测试了,调接口,然后 controller service dao 全部跑,之前误解了,sorry 大伙;
    我现在是单独建一个测试库(现存开发库、测试库、正式库),然后每次启动测试都通过 jpa 自动生成表( hibernate ),然后在 spring boot 的启动任务(放在 test 包中,不会打包到正式代码)中利用 repo 往里面塞准备的数据。
    我不想用 SQL 的原因是我想我在改动 Entity 类的时候能够及时的发现错误,容易维护一些,SQL 的话就只能等执行的时候报错了。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具