leoht / erlenmeyer
一个用于测试PHP功能或版本的库,以用户样本为基础
Requires
This package is not auto-updated.
Last update: 2024-09-14 18:47:38 UTC
README
Erlenmeyer 是一个PHP库,允许您根据不同的策略,向用户样本启动或限制应用程序的功能。您还可以启动同一功能的多个版本,采用A/B测试方法。
安装
使用composer安装
composer require leoht/erlenmeyer
简介
Erlenmeyer 使用功能和方法的概念
- 功能代表您希望向用户启动或测试的不同功能或变体(在A/B测试方法中)。
- 方法定义了一种计算结果值的方法,这取决于配置的选项和运行时上下文。
方法独立于功能定义,也可以用于不同的功能。
一个非常基本的方法示例是一个计算0到100之间的随机数的方法,并根据一个表示百分比的阈值配置的选项返回布尔值。然后,这样的策略会在随机值小于阈值时返回true,在随机值大于阈值时返回false。
更复杂的方法,例如,可以通过配置IP地址的“白名单”范围来配置,然后使用应用程序的运行时上下文来获取用户的IP地址,并将其与该范围进行比较,再次返回布尔值。
使用方法
所有配置都可以通过代码使用主要的 Erlenmeyer
单例来完成。
注册功能
功能是表示新功能、改进或用户体验测试的一种简单方式,它是您应用程序的一部分,并且您想要管理(禁用、启用或测试该功能的多个变体)。
use LeoHt\Erlenmeyer\Erlenmeyer;
$erlenmeyer = Erlenmeyer::build();
$erlenmeyer->feature('new_call_to_action');
定义方法
默认情况下,未指定任何方法的已注册功能始终在单个版本中“启用”。要使功能根据用户上下文或其他参数而变化,您可以定义方法并创建具有特定方法的特征,以定义功能和其变体应该如何表现。
例如,内置的 percent 方法可以使功能仅对定义的百分比用户启用。此百分比阈值在创建功能时使用选项数组进行配置。要使之前的功能仅对30%的用户启用,代码将类似于以下内容
$erlenmeyer->feature('new_call_to_action', 'percent')
->setOptions(array('threshold' => 30));
另一个类似的自定义方法 distribute,其行为类似于 percent,但与仅有两个可能状态不同,您可以定义多个用户段。
$erlenmeyer->feature('header_color', 'distribute')
->setVariants(['blue','green','black'])
->setOptions(array(
'distribution' => array(
'blue' => 30,
'green' => 30,
'black' => 40
)
));
对于此功能,变体“蓝色”将用于大约30%的用户,变体“绿色”也用于30%,变体“黑色”用于40%。
###创建自定义方法
还可以创建其他策略,这些策略最适合您的应用程序或营销理念。例如,考虑我们之前的IP地址白名单示例,此类策略可以这样定义
$strategy = $erlenmeyer->strategy('ip_whitelist', function ($context, $options) {
return in_array($context['current_ip'], $options['whitelist']);
});
这创建了我们的策略。在运行时,要决定应该使用哪个功能变体,提供的回调(我们称之为 投票者)将执行并返回所选的变体值。参数 $context
是您在评估功能状态时提供的上下文值数组。参数 $options
是与您的策略相关的任意选项数组。
在此示例中,我们定义了作为策略选项的一部分的 whitelist
键,该键包含一个有效的IP地址数组
$strategy->setOptions(array(
'whitelist' => ['127.0.0.1', '82.192.46.20']
));
您甚至可以更加具体,通过功能特性来定义这些选项,而不是通过策略来定义。在运行时,测试的功能选项将与策略选项合并,功能选项的键将覆盖策略选项的键。
$strategy->setOptions(array(
'whitelist' => ['127.0.0.1', '82.192.46.20']
));
$feature = $erlenmeyer->feature('top_secret', 'ip_whitelist', ['enabled', 'disabled'])
->setOptions(array(
'whitelist' => ['127.0.0.1'] // will override strategy option
));
// At runtime
$variant = $erlenmeyer->vary('top_secret', array('current_ip' => $_SERVER['REMOTE_ADDR'])); // will return true or false
###为投票者使用表达式
如果您不想为投票者使用PHP回调函数,Erlenmeyer提供了Symfony ExpressionLanguage组件。您可以使用表达式来定义投票者应返回的布尔条件。在表达式作用域内,提供了两个数组context
和options
。
我们的ip_whitelist
策略的投票者可以这样定义
$strategy = $erlenmeyer->strategy('ip_whitelist', 'context.current_ip in options.whitelist');
是不是简单多了?
使用配置文件
定义很多功能和策略可能会在某个时刻变得繁琐。一种更好的方法是使用配置文件。Erlenmeyer可以读取YAML配置文件来构建其功能和策略的清单。
以下是一个配置文件的示例
features:
home_button:
strategy: distribute
variants: [red, blue, green]
options:
distribution:
red: 33
blue: 33
green: 33
使用配置文件为策略投票者使用表达式可以变得非常方便
features:
top_secret:
strategy: ip_whitelist
variants: [enabled, disabled]
options:
whitelist: [127.0.0.1, 10.2.3.5]
strategies:
ip_whitelist:
voter: "context.current_ip IN options.whitelist"
投票者表达式将在运行时使用提供的选项和上下文值进行评估,以返回布尔结果。然后您可以在代码中测试该功能
<?php
$result = $erlenmeyer->vary('top_secret', array(
'current_ip' => $_SERVER['REMOTE_ADDR']
));