如何使用PHP单元测试避免竞争条件
让我们从证明这是我在这里面临的比赛条件开始: 失败的测试用例❌ 下面是运行和成功的相同测试,没有任何代码更改: 成功的测试用例✅如何使用PHP单元测试避免竞争条件,php,laravel,testing,laravel-5,phpunit,Php,Laravel,Testing,Laravel 5,Phpunit,让我们从证明这是我在这里面临的比赛条件开始: 失败的测试用例❌ 下面是运行和成功的相同测试,没有任何代码更改: 成功的测试用例✅ 在失败发生的地方我有这样的测试,没有种族条件问题 $response = $this->get('/some/api/call'); $response->assertSessionHas('order'); $this-assertDatabaseHas('orders', [ 'collect_cash' => $order->
在失败发生的地方我有这样的测试,没有种族条件问题
$response = $this->get('/some/api/call');
$response->assertSessionHas('order');
$this-assertDatabaseHas('orders', [
'collect_cash' => $order->final_total + $chargeFare,
'id' => $order->id,
'final_total' => $order->final_total,
]);
有趣。。你能提供
assertDatabaseHas
的文档参考吗?该死的人。。这仅在Laravel 5.5中提供!我在5点3分。。。这是升级的另一个原因。但这还不够好。。如果您告诉我在使用assertDatabaseHas
之前您有比赛条件,我会更高兴。。用这种方法解决了你的问题。。现在你只是告诉我:嘿,伙计,我没有比赛条件!好吧,这对你有好处:)我认为你有竞争条件是因为执行请求的方式,而不是数据库断言。类似于发送此请求并检查数据库,即使请求尚未完成
$ phpunit --filter method class path/to/testFile.php
PHPUnit 5.7.26 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
You should really fix these slow tests (>500ms)...
1. 1631ms to run testClass::testMethod
Time: 1.68 seconds, Memory: 22.00MB
$response = $this->get('/some/api/call');
$response->assertSessionHas('order');
$this-assertDatabaseHas('orders', [
'collect_cash' => $order->final_total + $chargeFare,
'id' => $order->id,
'final_total' => $order->final_total,
]);