gpt4 book ai didi

mysql - 在 node.js 上单元测试 mysql 回滚

转载 作者:行者123 更新时间:2023-11-30 21:52:57 25 4
gpt4 key购买 nike

我在 Node 项目中使用 mysql。

我想对进行 sql 事务的 javascript 函数进行单元测试。如果事务成为锁定监视器的牺牲品,则该函数具有处理失败的代码。

或者是吗?

因为我正在进行单元测试,我一次只在本地数据库上进行一个事务,所以永远不会出现死锁,对吗?如果它永远不会发生,我如何测试死锁处理?有什么办法可以强制它发生吗?

例子:

thisMustBeDoneBeforeTheQuery();
connection.queryAsync(/*This is an update*/).catch(function(err) {
undoThatStuffIDidBeforeTheQuery();
// I hope that function worked, because my unit tests can't
// make a deadlock happen, so I can't know for sure.
}

最佳答案

您的测试需要保护或验证的基本行为是什么?您需要测试您的 mysql 驱动程序吗?还是 MySql 本身?我认为@k0pernikus 确定了最高值(value)的测试:

假设数据库客户端由于死锁导致异常,您的应用程序代码如何处理它?<​​/strong>

您应该能够使用模拟库或依赖注入(inject)和测试 stub 轻松创建测试工具,以模拟客户端驱动程序返回死锁异常。这应该不需要与 mysql 进行任何交互,除了初步调查以查看 mysql 客户端驱动程序的返回代码/错误异常传播是什么样子。

这不是一个 100% 完美的测试,并且在 mysql 客户端库发生变化的情况下仍然会让您容易受到攻击。


由于时间的原因,确定性地重现并发问题通常非常困难。但是使用 SELECT ... FOR UPDATE并且多个事务应该能够确定性地在 mysql 上重现死锁,以验证您的客户端库代码。

关于mysql - 在 node.js 上单元测试 mysql 回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46406315/

25 4 0