leoht/erlenmeyer

一个用于测试PHP功能或版本的库,以用户样本为基础

dev-master 2016-01-26 14:00 UTC

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组件。您可以使用表达式来定义投票者应返回的布尔条件。在表达式作用域内,提供了两个数组contextoptions

我们的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']
));