」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 模擬與存根:了解主要區別

模擬與存根:了解主要區別

發佈於2024-11-07
瀏覽:413

Mock vs Stub: Understanding the Key Differences
在软件测试中,模拟与存根是两种流行的测试替身类型,用于模拟依赖关系。它们通过在测试期间用受控替代品替换真正的依赖项来帮助隔离组件的行为。虽然模拟和存根都有类似的用途,但根据测试场景的类型,它们的使用方式有所不同。
本文深入探讨了模拟和存根之间的主要区别、它们的用例以及何时在测试策略中使用它们。

什么是测试替身?
测试替身是测试期间用于代表真实依赖项的任何对象或组件的通用术语。目标是隔离被测组件并消除可能影响测试结果的外部因素。模拟和存根是两种类型的测试替身,通常用于单元和集成测试。

什么是存根?
存根是一个测试替身,当被测试的组件调用时,它返回预定义的数据。当被测试的组件需要来自依赖项的输入,但依赖项的实际行为与测试结果无关时,通常使用它。存根提供受控响应,使您可以只关注组件内部的逻辑。

存根示例:
假设您正在测试支付处理功能。您无需调用真正的支付网关,而是使用始终返回“支付成功”响应的存根,确保可以独立测试函数中的逻辑。

const paymentGatewayStub = {
  processPayment: () => "payment successful"
};

function processOrder(paymentService) {
  const result = paymentService.processPayment();
  return result === "payment successful" ? "Order Complete" : "Order Failed";
}

// Test
console.log(processOrder(paymentGatewayStub));  // Output: "Order Complete"

在这种情况下,存根确保外部服务始终返回预期的输出,从而更容易测试内部逻辑。

什么是模拟?
模拟是一个测试替身,它不仅提供假数据,还验证组件之间的交互。模拟有助于确保使用正确的参数调用正确的方法,并确保在执行期间发生所需的事件顺序。当组件的行为或交互对测试很重要时,通常使用它们。
模拟示例:
使用相同的付款示例,假设您想要验证 processPayment() 方法在订单处理期间仅被调用一次。

const paymentGatewayMock = {
  processPayment: jest.fn().mockReturnValue("payment successful")
};

function processOrder(paymentService) {
  paymentService.processPayment();  
}

// Test
processOrder(paymentGatewayMock);
expect(paymentGatewayMock.processPayment).toHaveBeenCalledTimes(1);

在这种情况下,模拟通过检查方法是否被调用来验证交互,确保组件在执行过程中行为正确。
模拟和存根之间的主要区别
方面模拟存根
目的 验证组件之间的交互 ​​提供预定义的响应
行为 验证方法调用和参数 仅返回静态数据
使用场景 交互重要时使用 数据输出足够时使用
复杂性 实施起来更复杂 创建起来更简单
测试验证方法调用示例 具有固定响应的测试逻辑

何时使用存根
• 测试简单逻辑:当您只需要控制依赖项的输出时,请使用存根。
• 数据驱动测试:如果重点是测试组件在特定数据下的行为方式,则存根更合适。
• 示例用例:如果您正在测试需要数据库中的用户数据的登录功能,请使用存根返回虚拟用户,而不调用真实数据库。
何时使用模拟
• 基于交互的测试:如果重点是确保使用正确的参数调用正确的方法,请使用模拟。
• 测试复杂的交互:模拟非常适合与多个服务或API 交互的组件。
• 示例用例:如果您正在测试电子邮件发送服务,请使用模拟来验证是否使用预期的收件人和消息调用了 sendEmail() 函数。
模拟和存根可以一起使用吗?
是的,在某些情况下,模拟和存根在同一测试中一起使用,以实现交互验证和受控响应。例如,您可以使用存根返回特定数据,并使用模拟来验证是否调用了特定服务。
模拟和存根的优点和缺点
存根的优点:
• 简单且易于实施
• 对于单独测试组件逻辑很有用
存根的缺点:
• 无法验证方法调用或参数
• 仅限于静态响应
模拟的优点:
• 验证行为、交互和序列
• 对于具有多个依赖关系的复杂场景很有用
模拟的缺点:
• 需要更多设置并且可能使测试更难以阅读
• 如果使用不小心,可能会导致脆弱的测试
模拟与存根:您应该使用哪一个?
• 如果您的测试依赖于依赖项的输出并且您想要控制该输出,请使用存根。
• 如果您需要验证方法是否被调用或验证组件之间的交互,请使用模拟。
• 对于单元测试,更常用存根,因为重点是测试内部逻辑。
• 对于集成测试,在验证系统不同部分如何交互时,模拟更有用。

结论
模拟和存根在测试策略中都发挥着重要作用,但各自有不同的目的。存根控制依赖项返回的数据,而模拟则确保组件之间发生正确的交互。了解何时以及如何使用每种方法可以提高测试质量,从而获得更可靠的软件。通过正确应用模拟和存根,团队可以减少错误、加快开发速度,并为单元测试和集成测试创建更好的测试策略。

版本聲明 本文轉載於:https://dev.to/keploy/mock-vs-stub-understanding-the-key-differences-1e36?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • input: Can You Make an HTML5 Canvas Resize Seamlessly with the Browser Window?

output: HTML5 Canvas如何隨瀏覽器窗口無縫縮放?
    input: Can You Make an HTML5 Canvas Resize Seamlessly with the Browser Window? output: HTML5 Canvas如何隨瀏覽器窗口無縫縮放?
    在瀏覽器窗口解決方案:使用CSS和javascript javaScript : var ctx =(您的畫布上下文); ctx.canvas.width = window.innerwidth; ctx.canvas.height = window.innerheight; ...
    程式設計 發佈於2025-04-19
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-04-19
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-19
  • 如何避免在Go中使用指針重切片時出現內存洩漏?
    如何避免在Go中使用指針重切片時出現內存洩漏?
    理解內存洩漏在GO Slice *int): s:= []它: 長度變為1,但襯里數組仍未觸及。第二個元素中未使用的指針仍是數組的一部分。 Since it's not being referred to by any slice, it becomes inaccessible and ...
    程式設計 發佈於2025-04-19
  • API測試免費工俱全指南
    API測試免費工俱全指南
    API測試是軟件開發生命週期中至關重要的環節,它確保應用程序和服務之間的無縫通信。 API測試評估API的功能、可靠性和性能,以便儘早發現潛在問題。雖然有很多工具可用於此目的,但免費的API測試工具為個人和團隊提供了一種經濟高效的解決方案,無需額外費用即可維護高質量的API。 為什麼使用免費的A...
    程式設計 發佈於2025-04-19
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-04-19
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-04-19
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-04-19
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-19
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-04-19
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-04-19
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-04-19
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-19
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-04-19
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3