ash / abtest
PhœnixCorp 的简单 AB 测试包
此包的规范存储库似乎已消失,因此该包已被冻结。
Requires
- monolog/monolog: 1.*
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 测试的工作流程如下