變異測試:如何利用故障?
使用事先設計好的故障以確保你的程式碼達到預期的結果,並遵循 .NET xUnit.net 測試框架來進行測試。
在變異測試是 TDD 的演變 一文中,我談到了迭代的力量。在可度量的測試中,迭代能夠保證找到問題的解決方案。在那篇文章中,我們討論了迭代法幫助確定實現計算給定數字平方根的程式碼。
我還演示了最有效的方法是找到可衡量的目標或測試,然後以最佳猜測值開始迭代。正如所預期的,第一次測試通常會失敗。因此,必須根據可衡量的目標或測試對失敗的程式碼進行完善。根據執行結果,對測試值進行驗證或進一步加以完善。
在此模型中,學習獲得解決方案的唯一方法是反覆失敗。這聽起來有悖常理,但它確實有效。
按照這種分析,本文探討了在構建包含某些依賴項的解決方案時使用 DevOps 的最佳方法。第一步是編寫一個預期結果失敗的用例。
依賴性問題是你不能依賴它們
正如邁克爾·尼加德在《沒有終結狀態的架構》中機智的表示的那樣,依賴問題是一個很大的話題,最好留到另一篇文章中討論。在這裡,你將會看到依賴項給專案帶來的一些潛在問題,以及如何利用測試驅動開發(TDD)來避免這些陷阱。
首先,找到現實生活中的一個挑戰,然後看看如何使用 TDD 解決它。
誰把貓放出來?
在敏捷開發環境中,透過定義期望結果開始構建解決方案會很有幫助。通常,在 使用者故事 中描述期望結果:
我想使用我的家庭自動化系統(HAS)來控制貓何時可以出門,因為我想保證它在夜間的安全。
現在你已經有了一個使用者故事,你需要透過提供一些功能要求(即指定驗收標準)來對其進行詳細說明。 從虛擬碼中描述的最簡單的場景開始:
場景 1:在夜間關閉貓門
- 用時鐘監測到了晚上的時間
- 時鐘通知 HAS 系統
- HAS 關閉支援物聯網(IoT)的貓門
分解系統
開始構建之前,你需要將正在構建的系統(HAS)進行分解(分解為依賴項)。你必須要做的第一件事是識別任何依賴項(如果幸運的話,你的系統沒有依賴項,這將會更容易,但是,這樣的系統可以說不是非常有用)。
從上面的簡單場景中,你可以看到所需的業務成果(自動控制貓門)取決於對夜間情況監測。這種依賴性取決於時鐘。但是時鐘是無法區分白天和夜晚的。需要你來提供這種邏輯。
正在構建的系統中的另一個依賴項是能夠自動訪問貓門並啟用或關閉它。該依賴項很可能取決於具有 IoT 功能的貓門提供的 API。
依賴管理面臨快速失敗
為了滿足依賴項,我們將構建確定當前時間是白天還是晚上的邏輯。本著 TDD 的精神,我們將從一個小小的失敗開始。
有關如何設定此練習所需的開發環境和腳手架的詳細說明,請參閱我的上一篇文章。我們將重用相同的 NET 環境和 xUnit.net 框架。
接下來,建立一個名為 HAS(“家庭自動化系統”)的新專案,建立一個名為 UnitTest1.cs
的檔案。在該檔案中,編寫第一個失敗的單元測試。在此單元測試中,描述你的期望結果。例如,當系統執行時,如果時間是晚上 7 點,負責確定是白天還是夜晚的元件將返回值 Nighttime
。
這是描述期望值的單元測試:
using System;
using Xunit;
namespace unittest
{
public class UnitTest1
{
DayOrNightUtility dayOrNightUtility = new DayOrNightUtility();
[Fact]
public void Given7pmReturnNighttime()
{
var expected = "Nighttime";
var actual = dayOrNightUtility.GetDayOrNight();
Assert.Equal(expected, actual);
}
}
}
至此,你可能已經熟悉了單元測試的結構。快速複習一下:在此示例中,透過給單元測試一個描述性名稱Given7pmReturnNighttime
來描述期望結果。然後,在單元測試的主體中,建立一個名為 expected
的變數,併為該變數指定期望值(在該示例中,值為 Nighttime
)。然後,為實際值指定一個 actual
(在元件或服務處理一天中的時間之後可用)。
最後,透過斷言期望值和實際值是否相等來檢查是否滿足期望結果:Assert.Equal(expected, actual)
。
你還可以在上面的列表中看到名為 dayOrNightUtility
的元件或服務。該模組能夠接收訊息GetDayOrNight
,並且返回 string
型別的值。
同樣,本著 TDD 的精神,描述的元件或服務還尚未構建(僅為了後面說明在此進行描述)。構建這些是由所描述的期望結果來驅動的。
在 app
資料夾中建立一個新檔案,並將其命名為 DayOrNightUtility.cs
。將以下 C# 程式碼新增到該檔案中並儲存:
using System;
namespace app {
public class DayOrNightUtility {
public string GetDayOrNight() {
string dayOrNight = "Undetermined";
return dayOrNight;
}
}
}
現在轉到命令列,將目錄更改為 unittests
資料夾,然後執行:
[Xunit.net 00:00:02.33] unittest.UnitTest1.Given7pmReturnNighttime [FAIL]
Failed unittest.UnitTest1.Given7pmReturnNighttime
[...]
恭喜,你已經完成了第一個失敗的單元測試。單元測試的期望結果是 DayOrNightUtility
方法返回字串 Nighttime
,但相反,它返回是 Undetermined
。
修復失敗的單元測試
修復失敗的測試的一種快速而粗略的方法是將值 Undetermined
替換為值 Nighttime
並儲存更改:
using System;
namespace app {
public class DayOrNightUtility {
public string GetDayOrNight() {
string dayOrNight = "Nighttime";
return dayOrNight;
}
}
}
現在執行,成功了。
Starting test execution, please wait...
Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 2.6470 Seconds
但是,對值進行硬編碼基本上是在作弊,最好為 DayOrNightUtility
方法賦予一些智慧。修改 GetDayOrNight
方法以包括一些時間計算邏輯:
public string GetDayOrNight() {
string dayOrNight = "Daylight";
DateTime time = new DateTime();
if(time.Hour < 7) {
dayOrNight = "Nighttime";
}
return dayOrNight;
}
該方法現在從系統獲取當前時間,並與 Hour
比較,檢視其是否小於上午 7 點。如果小於,則處理邏輯將 dayOrNight
字串值從 Daylight
轉換為 Nighttime
。現在,單元測試透過。
測試驅動解決方案的開始
現在,我們已經開始了基本的單元測試,併為我們的時間依賴項提供了可行的解決方案。後面還有更多的測試案例需要執行。
在下一篇文章中,我將演示如何對白天時間進行測試以及如何在整個過程中利用故障。
via: https://opensource.com/article/19/9/mutation-testing-example-tdd
作者:Alex Bunardzic 選題:lujun9972 譯者:Morisun029 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- .NET 變異測試
- 探索性測試:如何利用經驗知識擴充ET測試技能辨認故障?
- 變異測試是測試驅動開發(TDD)的演變
- 如何利用fiddler做mock測試Mock
- 如何利用Parasoft Jtest提高Java測試ROIJava
- 故障測試入門指南
- 如何實現介面異常場景測試?測試方法探索與測試工具實現
- 故障測試 Byteman 上手實踐
- 如何利用Allure報告提升你的測試效率?
- 測試員進階技能:如何有效地利用單元測試報告?測試報告
- Oracle 變數窺視引起執行計劃異常故障分析Oracle變數
- 可靠性測試-故障注入工具
- web測試與手機app測試的異同WebAPP
- 基於介面資料變異的App健壯性測試實踐APP
- 利用Twemperf測試Memcache的效能
- 搶先測試如何改變遊戲產業遊戲產業
- 介面測試如何在 json 中引用 mock 變數JSONMock變數
- 介面測試如何在json中引用mock變數JSONMock變數
- 如何讓奇異值分解(SVD)變得不“奇異”?
- 效能測試之JVM的故障分析工具VisualVMJVMLVM
- 異常-自定義異常的實現和測試
- 對抗測試-軍用裝置的有效射頻測試和故障排除
- 瀏覽器利用框架BeEF測試瀏覽器框架
- 異常測試實踐與梳理
- MySQL MHA部署 Part 6 MHA故障轉移測試MySql
- MySQL——MHA高可用群集部署及故障測試MySql
- MySQL高可用群集MHA部署及故障測試分析MySql
- 軟體測試線上故障規範及模板
- 如何利用Requestly提升前端開發與測試的效率,讓你事半功倍?前端
- 如何利用tox打造自動自動化測試框架,看完就懂框架
- SQLServer異常故障恢復(二)SQLServer
- 利用 Rize 來進行 UI 測試或 E2E 測試UI
- Oracle 9i變數窺視引起執行計劃異常故障報告Oracle變數
- 利用 Tmux 和 kubectl 解決 Kubernetes 故障UX
- 如何測試KubernetesRBAC?
- 利用白名單繞過限制的更多測試
- 中間人攻擊利用框架bettercap測試框架
- 利用sysbench進行MySQL OLTP基準測試MySql