gpt4 book ai didi

rest - 使用内存中的H2数据库在Grails 2.4.4中执行REST API功能测试时,表锁定超时

转载 作者:行者123 更新时间:2023-12-02 16:02:28 24 4
gpt4 key购买 nike

我正在尝试使用funky-spockrest-client-builder插件为我的REST API创建一组功能测试。

我的H2 DB连接字符串如下所示:

url = "jdbc:h2:mem:testDb:MVCC=true;LOCK_TIMEOUT=5000"

首先,我初始化h2数据库,在setup()方法中引入一些记录。
而且一切正常。
def setup() {
// Clean elasticsearch index
elasticSearchService.reinitialiseIndex()

// Initialize the DB
// 1st question
questionService.createQuestionFromOccurrence(
'181718e6-fd3b-4a1b-8b40-3f83fd2965e5',
QuestionType.IDENTIFICATION,
['kangaroo', 'grey'],
userMick,
'1st question 1st comment'
)
}

但是当我执行测试并执行POST请求时:
RestResponse response = rest.post("http://localhost:8080/${grailsApplication.metadata.'app.name'}/ws/question") {
json([
source : 'biocache',
occurrenceId: 'f6f8a9b8-4d52-49c3-9352-155f154fc96c',
userId : userKeef.alaUserId,
tags : 'octopus, orange',
comment : 'whatever'
])
}

该过程在第一个数据库操作中失败,在这种情况下,数据库操作是 get(),但以下情况除外:
ERROR errors.GrailsExceptionResolver  - JdbcSQLException occurred when processing request: [POST] /taxon-overflow/ws/question
Timeout trying to lock table "QUESTION"; SQL statement:

最佳答案

看起来Grails测试中的所有数据库操作都是在事务中执行的,该事务在每次测试后都会回滚。显然,它还锁定了数据库,并且由于REST请求将在与TEST分开的线程中执行,这意味着它无法访问数据库。即使未锁定,该进程也不会看到数据,因为它永远不会提交。

进行这项工作的一种方法是通过将属性添加到测试中来使测试“不具有事务性”:

class RestAPISpec extends IntegrationSpec {
static transactional = false
...
}

这种方法的问题之一是,您必须在每次测试后手动 cleanup()数据库。这是我发现的最简单方法:
def grailsApplication
def sessionFactory
...
def cleanup() {
(grailsApplication.getArtefacts("Domain") as List).each {
it.newInstance().list()*.delete()
}
sessionFactory.currentSession.flush()
sessionFactory.currentSession.clear()

sourceService.init()
}

另一种方法是通过在集成测试中测试 Controller 来测试您的REST API,这也很麻烦,并且不是真正的Web服务端到端测试。另一方面,它的执行比功能测试要快一些。

关于rest - 使用内存中的H2数据库在Grails 2.4.4中执行REST API功能测试时,表锁定超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com