【问题标题】:Testing a random number function in JavaScript with Mocha and Chai使用 Mocha 和 Chai 在 JavaScript 中测试随机数函数
【发布时间】:2017-12-12 14:07:43
【问题描述】:

假设我有一个函数,它返回一个数字乘以 2。

function double(number){
  return number * 2;
}

使用MochaChai 对其进行测试很容易。

var expect = require("chai").expect;

describe("#double", function(){
  it("should double a number", function(){
    expect(double(2)).to.equal(4);
    expect(double(4.5)).to.equal(9);
    expect(double(-3)).to.equal(-6);
  });
});

但现在假设我有一个函数可以返回两个指定整数之间的随机整数,将它们称为minmax

function randBetween(min, max){
  return Math.floor(Math.random() * (max - min + 1) + min);
}

我无法预测返回值将等于什么。我可以编写一个测试来确保返回值既大于或等于min 又小于或等于max,但这实际上并不能测试返回值是否是随机。是否有统计上有效的方法来测试我的 randBetween 函数是否有效?

附:我知道该函数不处理无效参数,例如如果max 小于min。请暂时把它放在一边。

【问题讨论】:

    标签: javascript node.js statistics mocha.js chai


    【解决方案1】:

    你不能通过一次调用来测试它;您需要大量调用来证明随机性(在合理的随机性定义内)。

    在大量调用中,您需要:

    1. 确保它不会返回超出范围的值
    2. 确保它确实在合理的随机性定义范围内提供随机值(假设它是确定性 PRNG)

    This question and its answers 讨论如何做后者,但遗憾的是,已接受答案中的链接现在大多已失效。

    美国国家标准与技术研究院有一个专门讨论 PRNG 的部分,包括 this page describing several tests,您可以使用它来确保返回的内容是随机的。

    当然,只要你的函数实现正确(而且它似乎是,如果它像通常的情况一样返回min <= value < max),最终你将测试底层Math.random实现的随机性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2013-04-11
      • 2015-06-02
      • 2019-02-04
      相关资源
      最近更新 更多