2018年1月27日 星期六

測試 - 使用 AutoFixture 產生指定範圍的隨機數值

這一篇的內容是取自課程「實務專案的測試」內容的一小部分,在寫測試程式時我會使用 AutoFixture 產生一個 Collection 的測試資料, AutoFixture 會依據類別裡屬性的各個型別隨機產生內容,但有時候會想要某些屬性的值要在一定的範圍內,這時候可以使用一些設定方法讓 AutoFixture 可以在指定的範圍裡隨機產生資料。




以下的範例程式是使用 .NET Core 單元測試專案,但設定與使用的內容在 .NET Framework 也是一樣可以使用。

在測試專案裡加入 AutoFixture NuGet Package

image

目前的版本為 4.0.1,這個版本在 .NET Core 與 .NET Framework 裡都可以使用

image


自訂了一個 Place 類別,類別的屬性內容如下:

image

在測試方法裡如果要產生一個數量為 10 的 Collection 做為測試資料,如下:

image

下中斷點,觀察 AutoFixture 所隨機產生的測試資料內容

image

座標資料的 Latitude 範圍是 –90 ~ 90 之間,Longitude 範圍是 –180 ~ 180 之間,但因為 AutoFixture 產生資料是依據屬性的型別,並無法從從屬性名稱得知要產生什麼樣的資料,而產生什麼樣的資料就必須要靠開發者事先去做設定。


可以在 fixture instance 的 Customizations 加入 RandomNumericSequenceGenerator,指定產生數值內容的範圍,如此一來類別裡只要是數值型別的屬性所隨機產生的內容就會在指定的範圍內

image

產生的數值內容

image

有個問題,那就是無論 Latitude 或 Longitude 隨機所產生的值都會是 –90 ~ 90 之間,前面有說過 Latitude 的範圍是 –90 ~ 90 而 Longitude 是 –180 ~ 180,所以希望能有個方式可以讓 AutoFixture 產生比較符合 Latitude 與 Longtitude 的數值。


這邊會使用到 AutoFixture 的 ISpecimenBuilder 介面,分別建立繼承實作 ISpecimenBuilder 的 LatitudeBuilder 與 LongitudeBuilder,實作的內容如下

image

image


分別建立了 LatitudeBuilder 與 LongitudeBuilder 之後,在測試方法裡的使用方式如下

image

觀察產生的數值內容

image

可以看到使用了 LatitudeBuilder 與 LongitudeBuilder 之後,由 AutoFixture 所產生的測試資料,經度與緯度的數值內容就有所差別了。


使用 AutoFixture 產生測試用的假資料是可以幫我們節省一些準備測試資料的時間,但有些資料的內容必須要在一定的範圍之內,這時候就可以用上面的做法,建立繼承實作 ISpecimenBuilder 的資料產生器類別,並指定對映屬性,這麼一來就可以產生我們預期的測試資料內容。



但就只有這樣嗎?

如果是有花很多時間在寫測試的開發者一定會對上面的內容是有疑問的,例如:將屬性名稱寫死在各個實作 ISpecimenBuilder 的資料產生器類別裡,那不同名稱但都是放同一種資料的屬性,是否要建立很多種不同名稱的 Builder 嗎?要建立很多個 Builder 但都是做同樣的事情,這不是很蠢的做法嗎?是否可以自己指定屬性名稱呢?是否可以自己指定產生數值的範圍上限與下限呢?

資深開發者一看到上面的做法應該很快就可以自己做出更進階的 Builder 了,又或者是可以等下一篇文章的說明也可以。


Convention-based Customizations with AutoFixture

Github > AutoFixture

AutoFixture / RandomNumericSequenceGenerator.cs

AutoFixture / RangedNumberGenerator.cs


以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。