第三方API模拟测试服务:按请求次数与概率触发异常的数学公式
实现基于概率的异常触发逻辑(含数学公式与代码示例)
核心思路与数学公式
你需要的异常触发逻辑分为两种常见实现方式,对应不同的数学模型:
1. 纯随机概率触发(不依赖请求次数N)
这是最符合“概率百分比”定义的实现,核心利用均匀分布随机数判断:
- 设目标概率为
P(将百分比转为小数,如10%对应0.1) - 生成范围在
[0, 1)的均匀随机数R - 数学判断公式:
如果 R < P,则触发异常
这种方式下,请求次数N无需参与计算,因为每次请求都是独立随机事件,长期统计下来触发频率会趋近于设定概率。
2. 基于次数的精确概率触发(依赖请求次数N)
如果需要保证统计周期内严格符合触发比例(比如每100次请求必触发10次),可采用周期取模的方式:
- 设周期大小为100(对应百分比基数),目标触发次数为
K = 概率百分比(如10%对应K=10) - 计算当前请求次数N在周期内的位置:
pos = N % 100 - 数学判断公式:
如果 pos < K,则触发异常
这种方式能确保每100次请求中刚好有K次触发异常,适合需要稳定触发比例的测试场景。
代码实现示例
纯随机触发版本(Java)
import java.util.Random; public class ExceptionSimulator { // 全局单例随机数生成器,避免重复初始化 private static final Random RANDOM = new Random(); /** * 判断是否应抛出异常 * @param probabilityPercent 触发概率(0-100的整数) * @param currentCount 当前总请求次数(纯随机模式下可忽略) * @return true=抛出异常,false=正常响应 */ public static boolean shouldThrow(int probabilityPercent, long currentCount) { if (probabilityPercent <= 0) return false; if (probabilityPercent >= 100) return true; double probability = probabilityPercent / 100.0; return RANDOM.nextDouble() < probability; } }
精确次数触发版本(Java)
public class PreciseExceptionSimulator { private final int targetTriggersPerCycle; private static final int CYCLE_SIZE = 100; public PreciseExceptionSimulator(int probabilityPercent) { this.targetTriggersPerCycle = Math.max(0, Math.min(probabilityPercent, 100)); } /** * 判断是否应抛出异常 * @param probabilityPercent 触发概率(0-100的整数) * @param currentCount 当前总请求次数 * @return true=抛出异常,false=正常响应 */ public boolean shouldThrow(int probabilityPercent, long currentCount) { int positionInCycle = (int) (currentCount % CYCLE_SIZE); return positionInCycle < targetTriggersPerCycle; } }
注意事项
- 纯随机模式:短期请求中触发次数可能偏离设定概率,但请求量增加后会逐渐趋近目标概率,适合模拟真实API的随机异常场景。
- 精确次数模式:触发比例完全符合设定概率,但缺乏随机性,适合需要可控触发次数的测试场景。
内容的提问来源于stack exchange,提问作者Stanislav Tun
相关产品推荐
相关产品推荐

