我在节点项目中使用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.
}
答案 0 :(得分:0)
您的测试需要保护或验证的基本行为是什么?你需要测试你的mysql驱动程序吗?还是MySql本身?我认为@ k0pernikus确定了最高价值测试:
假设数据库客户端由于死锁而导致异常,您的应用程序代码如何处理它?</ strong>
您应该可以使用模拟库或依赖注入和测试存根来模拟客户端驱动程序返回死锁异常,从而轻松创建测试工具。除了初步调查之外,这不应该要求与mysql进行任何交互,以查看mysql客户端驱动程序的返回代码/错误异常传播。
这不是100%完美的测试,并且在mysql客户端库发生更改的情况下仍会让您的易受攻击。
由于时间安排,确定性地再现并发问题通常非常困难。但是使用SELECT ... FOR UPDATE
和多个事务应该能够确定性地在mysql上重现死锁,以验证客户端库代码。