我有一个用c#
编写的测试,我使用的是SpecRun
版本1.5.2。
我的部分Default.srprofile
如下所示:
<Execution stopAfterFailures="20" testThreadCount="5" testSchedulingMode="Sequential" retryFor="Failing" retryCount="3" />
有一堆测试正在使用数据库中的一些数据,因此测试首先创建该数据。不幸的是,当 5 个线程并行运行时,我偶尔会得到一个sql deadlock error
这很好,因为这些线程尝试同时写入数据。
是否有机会添加线程执行延迟?比线程应该在 5 秒间隔内开始或类似的东西要说什么?
没有延迟开始的选择,我不会接受这个想法。这只是一个快速解决方案。当以后的测试同时执行时,您将再次收到此错误。
我想到了解决问题的 2 个选项:
-
捕获死锁异常并尝试再次添加数据。
-
对每个线程使用不同的数据库。可以使用配置转换部署步骤更改连接字符串,以访问每个线程的单独数据库。文档在这里: http://specflow.org/plus/documentation/SpecFlowPlus-Runner-Profiles/#DeploymentTransformation 有不同值的占位符:http://specflow.org/plus/documentation/SpecFlowPlus-Runner-Profiles/#Placeholders
完全披露:我是SpecFlow和SpecFlow+的开发人员之一。
除了前面的答案之外,如果您继续捕获死锁和重试,我还会在尝试之间添加一些随机时间间隔,这样您就不会在每次重试迭代时获得相同的死锁。我们对 API/DB 并发请求这样做,它对我们来说效果很好,因为多个数据库/环境需要更多的资源和资金来参与。