我正在使用 PHP 在数据库中创建一些对象。有时,如果用户在创建对象时请求对象,他们可以看到部分创建的对象(主数据库条目存在但尚未插入所有子对象)。我最近实现了一个修复程序,我的代码将仅在通过向数据库条目添加“创建”标志完全创建对象后提供该对象。
我如何测试它?我正在使用 phpunit。我看到的两个问题是我需要并行线程来同时发出创建和获取请求,并且我需要确保时机正确以便我可以实际测试竞争条件(而不仅仅是获取对象完全创建之后)。我希望我的测试看起来像这样,但我愿意接受建议:
- 线程 1:创建对象
- 线程 2:尝试在对象完全创建之前获取对象(应返回错误)
- 线程 1:在对象创建后获取对象(应该可以)
最佳答案
在实际支持线程的语言中测试竞态条件已经很困难了——对于 PHP,这就更难了。在单线程上下文中,您必须并行触发多个请求,保持这些请求的正确顺序,以便测试不会随机失败。
我做过一次检查 PHP session 锁定是否正常工作的测试:
在 PHPUnit 中,我创建了一个 curl_multi_query,在一个专门准备的 php 脚本中向网络服务器发出三个请求,该脚本基本上只启动一个 session ,然后休眠一秒钟。
如果三个请求的执行持续时间超过2.5秒左右(不要问那个时间),则测试成功。
我假设请求将以任何(可能是随机的)顺序得到答复。我不确定 curl 扩展是否能保证按特定顺序启动请求。此外,我不确定网络服务器在几乎立即收到三个请求时将如何操作。我必须假设检测锁定是否成功的唯一方法是测量耗时。
特别是我不确定创建一个将触发两个并行请求的测试,期望第一个请求成功,第二个请求总是失败,就像你想要的那样,是否会可靠地成功。唯一的期望是两个请求中的一个会失败。
关于php - 如何测试由对 php 的多个 ajax 请求创建的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21880277/