如何测试多个ajax请求创建的竞争条件?

我正在使用
PHP在数据库中创建一些对象.有时,如果用户在创建对象时请求对象,则可以看到部分创建的对象(主数据库条目存在但尚未插入所有子对象).我最近实现了一个修复,我的代码只有在通过向db条目添加’creating’标志完全创建后才能提供对象.

我该如何测试?我正在使用phpunit.我认为这两个问题是我需要并行线程来同时创建和获取请求,我需要确保时间正确,这样我才能真正测试竞争条件(而不仅仅是获取对象)完全创建后).我希望我的测试看起来像这样,但我愿意接受以下建议:

>线程1:创建对象
>线程2:尝试在完全创建之前获取对象(应该返回错误)
>线程1:在创建对象后获取对象(应该工作)

最佳答案 在实际支持线程的语言中,对竞争条件的测试已经很难了 – 使用PHP,这甚至更难.在单线程上下文中,您必须并行触发多个请求,维护这些请求的正确顺序,以便测试不会随机失败.

我做了一次测试,检查PHP会话锁定是否正常工作:

在PHPUnit中,我创建了一个curl_multi_query,在一个特殊的PHP脚本中针对Web服务器发出三个请求,这些脚本基本上只启动一个会话,然后休眠一秒钟.

如果三个请求的执行持续时间超过约2.5秒(不询问该时间),则测试成功.

我假设请求将以任何(可能是随机的)顺序回答.我不确定卷曲扩展是否能保证按特定顺序启动请求.此外,我不确定网络服务器在几乎立即收到三个请求时将如何行动.我必须假设检测锁定成功的唯一方法是测量通过的时间.

特别是我不确定创建一个将触发两个并行请求的测试,期望第一个请求成功,第二个总是失败,就像你想要的那样,将可靠地成功.唯一的期望是两个中的一个请求将失败.

点赞