用于Laravel 5框架的A/B/n测试包

v3.0.0 2019-03-22 06:32 UTC

This package is auto-updated.

Last update: 2024-09-18 17:53:06 UTC


README

PHP 7的a/b/n测试包。

要求

  • PHP >= 7.0

安装

由于引入了"包发现",Laravel v5.4和v5.5+的安装过程略有不同。请参考下面的适当安装部分。

Laravel 5.5+的安装

  1. 将 "heaps-good-services/variant": "^2.0" 添加到您的 composer.json 文件中。
  2. 运行 "composer update"。

配置

Variant需要存储聚合结果和执行用户实验时的缓存,但该包中不包含实现。需要创建UserVariationRepository和CacheInterface的实现。

既有聚合结果的存储机制,也有用户结果的存储机制。聚合结果存储用于存储系统实验和经过验证的用户结果。还需要一个用户存储来缓存用户结果,直到它们满足验证要求,然后结果将自动迁移到聚合结果。

用户结果通常存储在会话中,而聚合结果可以存储在数据库或持久化缓存中。

注意事项

如果使用服务容器,您需要将Experiments类的实例绑定为一个单例以使实验持久化。

用法

实验在VariantServiceProvider的boot方法中注册。然后,这些实验在应用程序的整个生命周期中都可以使用。

注册实验

注册一个实验以测试某个文本对注册页面转换率的影响。

$variant->registerExperiment('sign_up_message')
    ->addVariation('welcome')// A welcoming message.
    ->addVariation('free_ipad')// Free IPad on sign up.
    ->addVariation('not_welcome', 9);// Deter the user from signing up.

权重

权重越高,特定变体被从随机池中选择的可能性就越高。

...
$variant->registerExperiment('sign_up_message')
    ->addVariation('welcome', 3)
    ->addVariation('free_ipad')
    ->addVariation('deter', 9);
...

权重对应于该变体在彩票中拥有的门票数量。在上面的示例中,'welcome'变体有3/13的概率被选中。

实验类型

有用户实验和系统实验。用户实验在将数据传播到聚合结果之前需要验证。系统实验直接存储在聚合结果中。

要注册系统实验,请将'isSystemExperiment'参数设置为true。

...
$variant->registerExperiment('sms_gateway_reliability', true)
    ->addVariation('superstar_sms_company')
    ->addVariation('hindenburg_sms_systems');
...

用法

可以使用辅助函数'variant()'在任何地方使用Variant外观。

添加验证标签

验证标签有助于验证人类请求并阻止机器人扭曲结果。

交互

交互表示特定实验实例的开始。**交互限制为每个用户实验一个,无论交互被触发多少次**。

转换

app/Http/Controllers/SignUpController.php

function store(Request $request) {
    ...
    convert('sign_up_message');
    ...
}

转换限制为每个用户实验一个,无论转换被触发多少次。

示例系统实验

app/Factories/SmsGatewayFactory.php

function makeSmsGateway(string $smsGatewayName): SmsGatewayInterface {
    ...
    switch($smsGatewayName) {
        case 'superstar_sms_company':
            return new SuperStarSMSGateway(...);
        case 'hindenburg_sms_systems':
            return new HindenburgSMSGateway(...);
        default:
            ...
    }
    ...
}

app/Jobs/SendSmsMessage.php

function handle(SmsGatewayFactory $smsGatewayFactory) {
    $variation = variant()->getExperiment('sms_gateway_reliability')
        ->getVariation()
        ->addInteraction();
    if($smsGatewayFactory->makeSmsGateway($variation->getName())->send(...)) {
        $variation->addConversion();
    }
}

注意

函数'interact'和'convert'将抑制异常,而函数'interact_or_fail'和'convert_or_fail'则不会抑制异常。