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

标签 php testing phpunit race-condition

我正在使用 PHP 在数据库中创建一些对象。有时,如果用户在创建对象时请求对象,他们可以看到部分创建的对象(主数据库条目存在但尚未插入所有子对象)。我最近实现了一个修复程序,我的代码将仅在通过向数据库条目添加“创建”标志完全创建对象后提供该对象。

我如何测试它?我正在使用 phpunit。我看到的两个问题是我需要并行线程来同时发出创建和获取请求,并且我需要确保时机正确以便我可以实际测试竞争条件(而不仅仅是获取对象完全创建之后)。我希望我的测试看起来像这样,但我愿意接受建议:

  1. 线程 1:创建对象
  2. 线程 2:尝试在对象完全创建之前获取对象(应返回错误)
  3. 线程 1:在对象创建后获取对象(应该可以)

最佳答案

在实际支持线程的语言中测试竞态条件已经很困难了——对于 PHP,这就更难了。在单线程上下文中,您必须并行触发多个请求,保持这些请求的正确顺序,以便测试不会随机失败。

我做过一次检查 PHP session 锁定是否正常工作的测试:

在 PHPUnit 中,我创建了一个 curl_multi_query,在一个专门准备的 php 脚本中向网络服务器发出三个请求,该脚本基本上只启动一个 session ,然后休眠一秒钟。

如果三个请求的执行持续时间超过2.5秒左右(不要问那个时间),则测试成功。

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

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

关于php - 如何测试由对 php 的多个 ajax 请求创建的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21880277/

相关文章:

除非我禁用监听按钮,否则不会触发带有 PhpStorm 断点的 PHPUnit Xdebug

php - 如何测试 PHP PDO 单例类?

php - php构造函数中的父/子类型提示?

javascript - 使用 JQuery 或 JavaScript 自动提交

php - Yii2:如何使验证规则消息不被编码?

php - Symfony 3 PhpUnit 提交表单

php - Codeigniter:更改模型中的 SQL 查询会导致 "failed to open stream"警告。但是,使用简单的 select * 查询进行测试是可行的

java - 在上课前使用 jmockit (1.5) 模拟静态方法

ruby-on-rails - Rails 集成测试

go - 为什么这个测试使用 reflect.deepEqual 会失败?