本文目录导读:

我来详细介绍Shell脚本实现A/B测试策略的几种方法:
基础A/B测试分配策略
基于随机数分配
#!/bin/bash
# A/B测试分配函数
assign_ab_test() {
local user_id=$1
# 基于用户ID生成确定性分组
local hash=$(echo -n "$user_id" | md5sum | cut -c1-8)
local group=$((16#${hash} % 2))
if [ $group -eq 0 ]; then
echo "A"
else
echo "B"
fi
}
# 使用示例
user_id="user123"
group=$(assign_ab_test "$user_id")
echo "User $user_id assigned to group: $group"
带比例的A/B测试
#!/bin/bash
# 支持自定义比例分配
assign_custom_ratio() {
local user_id=$1
local ratio_a=$2 # A组比例(如70表示70%)
# 使用确定性哈希
local hash=$(echo -n "$user_id" | sha256sum | cut -c1-4)
local hash_num=$((16#${hash}))
local total_divisions=100
if [ $((hash_num % 100)) -lt $ratio_a ]; then
echo "A"
else
echo "B"
fi
}
# 示例:70%用户进A组,30%进B组
assign_custom_ratio "user456" 70
多层A/B测试(多变量)
#!/bin/bash
# 多变量A/B测试
declare -A AB_CONFIG
# 配置不同测试维度
configure_ab_test() {
# [维度名]="A组比例 B组比例"
AB_CONFIG["ui_version"]="50 50"
AB_CONFIG["algorithm"]="30 70"
AB_CONFIG["price_model"]="60 40"
}
# 多维度分配
assign_multivariate() {
local user_id=$1
configure_ab_test
for dimension in "${!AB_CONFIG[@]}"; do
local ratios=(${AB_CONFIG[$dimension]})
local hash=$(echo -n "${user_id}_${dimension}" | md5sum | cut -c1-8)
local group_num=$((16#${hash} % 100))
if [ $group_num -lt ${ratios[0]} ]; then
echo "$dimension: A"
else
echo "$dimension: B"
fi
done
}
# 使用示例
echo "=== 多变量A/B测试分配 ==="
assign_multivariate "user789"
完整的A/B测试框架
#!/bin/bash
# 完整的A/B测试框架
AB_TEST_DIR="/var/log/ab_test"
EXPERIMENT_NAME="ui_redesign"
# 初始化测试环境
init_ab_test() {
mkdir -p "${AB_TEST_DIR}/${EXPERIMENT_NAME}"
}
# 获取用户分组
get_user_group() {
local user_id=$1
local experiment=$2
local cache_file="${AB_TEST_DIR}/${experiment}/assignments.cache"
# 检查缓存
if [ -f "$cache_file" ]; then
local cached_group=$(grep "^${user_id}:" "$cache_file" | cut -d: -f2)
if [ -n "$cached_group" ]; then
echo "$cached_group"
return
fi
fi
# 分配新用户
local hash=$(echo -n "${user_id}_${experiment}" | sha256sum | cut -c1-8)
local group_num=$((16#${hash} % 2))
if [ $group_num -eq 0 ]; then
echo "A"
else
echo "B"
fi
# 缓存分配结果
echo "${user_id}:$(echo $?)" >> "$cache_file"
}
# 执行A/B测试逻辑
execute_ab_logic() {
local user_id=$1
local group=$(get_user_group "$user_id")
echo "User: $user_id, Group: $group"
case $group in
"A")
# 控制组 - 原有逻辑
echo "执行控制组逻辑"
# 原有功能代码
;;
"B")
# 实验组 - 新逻辑
echo "执行实验组逻辑"
# 新功能代码
;;
esac
}
# 记录测试结果
log_ab_result() {
local user_id=$1
local group=$2
local event=$3
local timestamp=$(date +%s)
log_file="${AB_TEST_DIR}/${EXPERIMENT_NAME}/events.log"
echo "${timestamp},${user_id},${group},${event}" >> "$log_file"
}
# 测试执行
test_user="user_$(date +%s)"
init_ab_test
execute_ab_logic "$test_user"
log_ab_result "$test_user" "$(get_user_group "$test_user")" "page_view"
高级特性:动态流量调整
#!/bin/bash
# 动态调整A/B测试比例
DYNAMIC_CONFIG_FILE="/tmp/ab_test_config"
# 更新配置
update_ab_config() {
local experiment=$1
local new_ratio=$2
cat > "$DYNAMIC_CONFIG_FILE" << EOF
{
"experiment": "$experiment",
"ratio_a": $new_ratio,
"enabled": true
}
EOF
}
# 读取动态配置
get_ab_config() {
if [ -f "$DYNAMIC_CONFIG_FILE" ]; then
cat "$DYNAMIC_CONFIG_FILE" | python3 -c "
import json,sys
config = json.load(sys.stdin)
print(config['ratio_a'])
"
else
echo "50" # 默认50%
fi
}
# 带动态配置的分配
dynamic_assign() {
local user_id=$1
local ratio_a=$(get_ab_config)
local hash=$(echo -n "$user_id" | md5sum | cut -c1-4)
local hash_num=$((16#${hash}))
if [ $((hash_num % 100)) -lt $ratio_a ]; then
echo "A"
else
echo "B"
fi
}
统计分析脚本
#!/bin/bash
# A/B测试结果分析
analyze_ab_results() {
local experiment=$1
local log_file="${AB_TEST_DIR}/${experiment}/events.log"
echo "=== A/B测试结果分析 ==="
echo "实验: $experiment"
echo ""
# 统计各组用户数
echo "用户分布:"
awk -F',' '{group_count[$3]++} END {for(g in group_count) print g": "group_count[g]}' "$log_file"
echo ""
# 计算转化率
echo "转化率统计:"
awk -F',' '
{
if($4 == "page_view") views[$3]++
if($4 == "conversion") conversions[$3]++
}
END {
for(g in views) {
rate = (conversions[g] / views[g]) * 100
printf "%s: %.2f%% (views:%d, conversions:%d)\n", g, rate, views[g], conversions[g]
}
}' "$log_file"
}
# 使用示例
analyze_ab_results "ui_redesign"
使用建议
- 一致性: 使用确定性哈希确保同一用户始终分配到同一组
- 持久化: 将分配结果缓存,避免重复计算
- 日志记录: 详细记录用户行为用于后续分析
- 监控告警: 添加监控检查各组用户数量是否均衡
- 灰度发布: 支持动态调整比例,实现灰度发布
这个框架可以根据具体需求进行扩展,比如添加更多维度、支持嵌套测试或实现复杂的分流规则。