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