ash/abtest

PhœnixCorp 的简单 AB 测试包

此包的规范存储库似乎已消失,因此该包已被冻结。

0.1.2 2014-09-08 15:59 UTC

This package is not auto-updated.

Last update: 2022-05-09 15:00:12 UTC


README

定义

AB 测试、AZ 测试或多变量测试是一种测试技术,它允许在特定环境下展示和测量多个变体,以便隔离最有效的变体。

实例化

最简单实例化测试的方法是在 AB 命名空间中实例化 Test 类,并给它赋予一个名称

$myTest = new AB\Test('Simple test');

现在测试已准备就绪。只需将其执行到您希望使用它的地方即可,通过简单的 echo 命令

echo $myTest;

在此示例中,显然没有任何操作。您需要提供一些变体,或者至少提供一个默认变体,以闭包的形式

$myTest = new AB\Test('Simple test');

$myTest->addDefaultVariant(function(){

    echo sprintf('<h1>%s</h1>', 'Default title');

});

echo $myTest;

默认变体也可以在实例化 Ab\Test 时提供

$myTest = new AB\Test('Simple test', function(){

    echo sprintf('<h1>%s</h1>', 'Default title');

});

echo $myTest;

因此,前面的测试将在所有情况下显示以下代码

<h1>默认标题</h1>

变体

要向测试添加变体,只需使用相应的方法即可

$myTest->addVariant('variant number one', function(){

    echo sprintf('<h1>%s</h1>', 'Fancy variant');

});

此方法返回一个 AB\Variant 对象,我们可以为其分配权重,以细化测试中看到特定变体的机会

$variant = $myTest->addVariant('variant number one', function(){

    echo sprintf('<h1>%s</h1>', 'Fancy variant');

});

$variant->withWeight(8);

完全可以链式调用这些调用以使代码更具可读性

$myTest->addVariant('variant number one', function(){

    echo sprintf('<h1>%s</h1>', 'Fancy variant');

})->withWeight(8);

可以添加任意数量的变体。它们将根据分配的权重(如果有)随机选择

$myTest->addVariant('variant number one', function(){

    echo sprintf('<h1>%s</h1>', 'Fancy variant');

})->withWeight(8);

$myTest->addVariant('second variant', function(){

    echo sprintf('<h1>%s</h1>', 'Nice variant');

});

$myTest->addVariant('variant #3', function(){

    echo sprintf('<h1>%s</h1>', 'Bright variant');

})->withWeight(5);

触发器

在某些情况下,最好将 AB 测试的执行条件为特定上下文。这正是 setTrigger 方法所能提供的:该方法接收一个函数作为参数。这个函数必须返回一个布尔值,它实际上对应于触发器的状态:如果它返回 false,则触发器将使用默认变体。如果触发器相反返回 true,则将随机选择一个变体,并根据定义的权重进行选择。

例如,我们仅在下午触发我们的 AB 测试

$myTest->setTrigger(function(){

    $date = new DateTime();
    return ( $date->format('H') > 12 );

});

结果

没有对结果的分析,多变量测试几乎没有意义。为了使任何数据都能被处理,AB\Test 类提供了一个 setReport 方法,该方法就像触发器一样,接收一个函数作为参数。这个函数也可以使用一个可选参数,它是当前的 AB 测试。因此,处理测试结果的自由度几乎是完全的。

例如,我们尝试将 AB 测试的执行结果传递到我们的 Beanstalkd 队列服务器

$myTest->setReport(function ($ABTest) use ($pheanstalk) {

    $job = new stdClass();
    $job->function = 'store_ab_result';
    $job->ab_data = array(
        $name       => $ABTest->getName(),
        $variant    => $ABTest->getSelectedVariant()->getName(),
        $stamp      => time(),
        $user       => Application::getUserID()
    );
    $pheanstalk->useTube('abteststube')->put($job);

});

流程图

总结来说,AB 测试的工作流程如下

Workflow