【问题标题】:PHP - data access concurrency testingPHP - 数据访问并发测试
【发布时间】:2014-04-07 00:31:37
【问题描述】:

假设您有描述应用程序数据访问层的接口。您还没有决定要使用哪种存储机制,您只是想确保无论您选择什么,它都能很好地处理并发请求。为此,您必须针对这些接口编写并发测试。

我认为示意性并发测试应该是这样的:

public function testMoneyIsNotLostByConcurrentTransfers(){
    $accountRepository = DataAccessLayer::getBankAccountRepository();
    $accountOfTom = $accountRepository->create(array(
        'owner' => 'Tom',
        'balance' => new Money(10000)
    ));
    $accountOfBob = $accountRepository->create(array(
        'owner' => 'Bob',
        'balance' => new Money(10000)
    ));
    $accountOfSusanne = $accountRepository->create(array(
        'owner' => 'Susanne',
        'balance' => new Money(10000)
    ));

    $this->concurrentExecution(
        function () use ($accountOfTom, $accountOfBob){
            $accountOfTom->transfer($accountOfBob, new Money(5000));
        },
        function() use ($accountOfTom, $accountOfSusanne){
            $accountOfSusanne->transfer($accountOfTom, new Money(5000));
        }
    );

    $this->assertEquals($accountOfTom->getBalanceAmount(), 10000);
    $this->assertEquals($accountOfBob->getBalanceAmount(), 15000);
    $this->assertEquals($accountOfSusanne->getBalanceAmount(), 5000);
}

是否可以在 PHP 中编写这样的测试、测试运行程序?或者是否有任何现有的工具可以帮助 PHP 中的并发测试?

【问题讨论】:

    标签: php testing concurrency automated-tests


    【解决方案1】:

    我找不到此类并发测试的任何测试运行程序。我发现只有paratest,它可以运行独立测试,比如并行单元测试。

    根据PHP - parallel task runner,我认为最好的选择是使用pthreadsdebug_backtrace。我认为即使这样也很难。我期待着安装问题,线程安全,资源共享困难,回溯错误等......我肯定会玩得很开心......:S

    我在 pthreads 示例中找到了async calls

    如果我能解决这个问题,我会在 github 上分享并在此处添加链接。到那时……

    更新

    我刚刚意识到我不需要多线程或多进程应用程序来测试并发性。例如,我可以从同一个 php 文件使用 2 个数据库连接启动两个事务。我需要的是为 db 驱动程序执行的语句添加事件触发,因此我可以添加断点并在任何我想要的地方等待其他任务。文件锁定是一样的......所以协程或一些手工制作的多任务和语句记录就足够了......

    【讨论】:

      【解决方案2】:

      并发应该内置到您的保存机制中,而不是执行层中。

      例如,如果您使用 SQL,则不要设置变量,而是使用 += 和 -=。

      【讨论】:

      • 对不起,我不在乎应该在哪里构建并发。问题是关于如何在不知道实现的情况下对其进行测试。例如,我可以保存到 json 文件而不是数据库等...
      猜你喜欢
      • 1970-01-01
      • 2020-11-26
      • 2016-11-07
      • 2020-05-02
      • 1970-01-01
      • 2012-02-18
      • 2015-03-15
      • 2013-07-04
      相关资源
      最近更新 更多