如何配置Hibernate进行开发测试

时间:2009-07-27 05:46:14

标签: java hibernate testing

我们是9个程序员在java Web应用程序上使用hibernate框架的工作, 但是我们每次想要测试项目时运行(在运行模式,调试模式)项目都有问题我们必须等待Hibernate创建SessionFactory和所有Relational Query! 我该怎么做才能让Hibernate更快地工作?

2 个答案:

答案 0 :(得分:3)

你能详细说明所需的时间:

  • 是一次,还是每次测试?
  • 你到底在说什么?
  • 什么是Hibernate负载? (表的数量,或更好的总列数等...)

根据您的答案,可以调查几个方向,例如通过巧妙配置实际减少(只有几个百分点,我害怕)时间......

但我最初的猜测是,你可能会有一个更聪明的举动,实际上并没有为你的测试实现Hibernate。这会解决所有问题,不是吗?虽然这样看似愚蠢,但这就是我们的进展:

  • 我们将JUnit测试分成几个类别(基于项目,或源目录,或其他......)。每个都可以单独运行(如果需要,请询问)。
  • 我们称之为一个测试类别 IntegrationTesting ,它需要访问昂贵的(慢速或其他)资源,例如数据库,外部Web服务或其他启动的软件(可能没有并发访问) ,线程,IO,JMS,DLL,昂贵的许可证,x509证书,负载测量,超时......设置这些测试更复杂,可能无法从每个工作站执行,执行它们需要更多时间。每当开发人员正在研究这样的特征时,他经常进行适当的测试(或更多),并接受延迟。我们的自动构建每天运行所有这些,这就是我们确保回归检测的方式。
  • 我们将一个测试类别称为 UnitTesting 。它不需要访问昂贵的资源,因此例如它不会触发Hibernate初始化。每个开发人员都会一直执行这些测试,并且它们可以快速点亮(几秒钟就可以用于大型项目)!我们不打扰只选择其中一个......

确实,这种测试组织会影响应用程序设计和代码,但这也是当前最佳实践所规定的,因此我们可以从中获得许多优势。示例:

  • BEFORE:调用dao进行数据库通信的业务算法可以如下:
    1. one = dao.readOne()
    2. a = do algo A
    3. two = dao.readTwo()
    4. b =做algo B
    5. if(b)dao.save(one,two,a,b)
  • 之后:我们在不同的班级或方法中分担更多不同的责任:
    1. one = dao.readOne()
    2. two = dao.readTwo()
    3. (a,b)= 做algo AB(一,二)
      • a =做算法A(一)
      • b =做算法B(两个)
    4. if(b)dao.save(one,two,a,b)

之前,我们无法独立于数据库测试“do algo AB”,因为它是包含数据库访问的全局流程的一部分(更多的是,访问与逻辑混合在一起)。

之后,“do algo AB”很容易在UnitTesting中测试。

我们还发现首先使用只读数据库操作,处理,然后只写数据库操作有许多优点。

  1. JUnit性能:如前所述。

    请注意,可以使用IntegrationTesting完成Daos测试。实际上,在我们的项目中,我们将JUnit集中在UnitTesting上,并且几乎没有IntegrationTests,我们直接从UI测试它们中的大部分...... IntegrationTesting ROI不是那么好; - )

  2. 简短而专注的交易:例如,我们可以有两个交易(和会话),享受复杂只读阶段的Hibernate身份保证。当算法修改实体时,Hibernate不会触发隐式更新(我们项目中的早期开发人员不知道这可能会发生!)。如果算法决定不更新数据库,没有时间花在将数据发送到数据库上,则无需取消该事务......

  3. 算法的可重用性:我们有很多情况下,计算的相应数据已经被之前调用的算法加载,因此从数据库重新加载它是一种浪费。此外,重新加载可能会携带不同的数据,导致计算脆弱。

  4. ......其他我现在不记得了; - )

  5. Junit.org网站有很多很好的测试策略资源。 我也很喜欢优秀的Rainsberger书籍(http://www.manning.com/rainsberger/),我绝对推荐它用于任何使用自动化测试且有多个开发人员的项目。 : - )

答案 1 :(得分:0)

需要多长时间?我知道这需要一段时间但不会那么久。如果花费那么多时间,我不知道你能在这里做些什么。

你确定你的应用程序中的sessionfactory在启动时被初始化了吗?

您可以使用单元测试来测试代码的某些部分,从而减少整个应用程序的启动。