.net單元測試神器:Autofixture,自動為你填充數據

也許很多程序員在開發過程中,都會編寫單元測試代碼,而在編寫過程中最痛苦的事情莫過於測試數據了,如果你的參數是一個類,這個類又包含了十幾個必填屬性,這時就需要一個一個的設置屬性值,一兩個方法調用倒還能接受,十幾個呢?

.net單元測試神器:Autofixture,自動為你填充數據

其實,無論是xUnit還是nUnit,都有數據填充功能,能滿足大部分需求:

l 無論是values註解還是testcase註解,都沒有類型約束,可能會造成運行時錯誤。

l 基於註解的值都只能是Const值,如果需要複雜類型就需要定義一個類型作為Source提供值。

l Autofixture可以生成符合驗證規則的數據。

l 基於符合驗證規則的數據,在測試時就會增加樣本的隨機性,大大提升測試覆蓋面。

為了擺脫這些痛苦,我們可以引入一些假數據生成組件,本篇介紹Autofixture。其官網英文介紹如下:

AutoFixture makes it easier for developers to do Test-Driven Development by automating non-relevant Test Fixture Setup, allowing the Test Developer to focus on the essentials of each test case.

.net單元測試神器:Autofixture,自動為你填充數據

對應github地址:https://github.com/AutoFixture/AutoFixture

廢話不多說,我們接下來就實踐一下,看看它具體的用法,示例項目配合單元測試組件NUnit。

首先,新建一個解決方案,添加一個類庫項目,把class1.cs刪除,添加一個名為person的類來做為我們單元測試的主要對象,基定義如下:

public class Person
{
/// <summary>
/// 年齡
/// /<summary>
public int Age { get; set; }
/// <summary>
/// 性別,0:男,1:女
/// /<summary>
public int Gender { get; set; }
/// <summary>
/// 姓名
/// /<summary>
public string Name { get; set; }
/// <summary>
/// 積分值
/// /<summary>
public int Points { get; set; }
/// <summary>
/// 增加積分
/// /<summary>
/// <param>需要增加的積分值
/// <returns>增加後的總積分/<returns>
public int AddPoints(int points)
{
Points += points;
return Points;
}
}

從類定義中可以看到,類公共屬性主要有年齡Age,性別Gender,姓名Name,Points積分值,還有一個公共的方法AddPoints來模擬給用戶增加積分值。

接下來,新建一個單元測試項目,這裡使用NUnit,我選擇的是netcore版本,會自己引用Nunit3,如果沒有,請使用Nuget添加。然後,通過控制檯管理器使用以下命令引入AutoFixture的Nuget包:

Install-Package AutoFixture -Version 4.11.0
Install-Package AutoFixture.NUnit3 -Version 4.11.0

安裝好nuget包後,我們新建一個測試類AutoFixtureTest,添加兩個方法作為測試方法,具體代碼如下:

[TestFixture]
public class AutoFixtureTest
{
[Test]
[AutoData]
public void AddPoints(int points,Person person)
{
var result = person.AddPoints(points);
Assert.AreEqual(person.Points, result);
}
[Test]
[AutoData]
public void TotalPoints(List<person> persons)
{
var result = persons.Sum(p => p.Points);
Assert.GreaterOrEqual(result, 1000);
}
}
/<person>

眼尖的同學可能已經發現,與我們平時寫的測試代碼對比,這裡多了一個AutoData註解,正是通過這個註解,AutoFixture才能為當前測試提供數據了。下面就來調試一下這個單元測試,在兩個方法的斷言處添加一個斷點,右鍵->調試測試,如下圖所示,數據已經自動生成了:

.net單元測試神器:Autofixture,自動為你填充數據

.net單元測試神器:Autofixture,自動為你填充數據

怎麼樣,是不是很方便?這樣可以大大的節約我們編寫用例的時間,活動了手動創建數據的麻煩。以上只是簡單舉例,其他一些深入的應用,比如上面集合類型默認只生成了三個,如何配置生成更多的樣本數據?或者更復雜的類型時,又會是什麼樣的呢?有興趣的同學可以自己動手實踐一下。


分享到:


相關文章: