簡體   English   中英

如何在JavaScript中使用Math.random進行測試?

[英]How to test with Math.random in JavaScript?

我有一個函數,可以在最小值和最大值之間選擇一個隨機值。 因此,當我進行測試時,我會測試該值介於最小值和最大值之間。 但是,由於我的應用中存在一些故障,因此測試通過了幾次,並且由於隨機性而有時失敗了。

重寫/模擬Math.random()以返回0和1並測試我的值與最大值或最小值是一個好主意嗎? 還是有更好的方法來測試JavaScript中的隨機性?

這是將用於創建隨機數的函數:

function constrain(min, max){
    return Math.round(Math.random() * (max - min) + min)
}

SinonJS是一個JavaScript 模擬 框架 ,與所有主要的JavaScript單元測試框架集成。 適配器將負責“還原”您在測試期間創建的任何存根/模擬。

// Stub out Math.random so it always returns '4' (chosen by fair dice roll)
sinon.stub(Math, 'random').returns(4);

// Double check that it worked.
equal(Math.random(), 4, "http://xkcd.com/221/");

最好,您的測試中應該完全沒有隨機元素。 您應該輸入方法的已知值,以便可以確定結果是否正是您所期望的。

如果您具有隨機值,則必須多次測試該方法,並且仍然不確定是否可以得到所需的准確結果,只是不確定您得到的結果是否在正確的范圍內。

例如,如果您在代碼中使用當前日期( new Date() ),那么在測試時應為您的方法提供已知的日期,否則您的測試將僅顯示該方法現在有效。 明天可能會失敗。


編輯:

但是,我可以立即告訴您,您的方法效果不佳。 您應該使用floor方法而不是round ,否則最低和最高值的出現頻率將是其他值的一半:

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

通常,您的測試應通過非確定性代碼的所有可能值。 也許您的測試中有一個循環,您進行了100次測試。 這將捕獲更多故障,而無需更改應用程序代碼。 您的建議也是一種選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM