.net測試篇之單元測試/集成測試神器Autofixture

系列目錄html

autofixture簡介

有了單元測試框架加上Moq(後面咱們會用單獨章節來介紹moq),能夠說測試問題基上都能搞定了.然而有了AutoFixture對單元測試來講能夠說是如虎添翼,AutoFixture而且它能與moq,rhinomock等框架結合,對單元測試帶來的便捷性,可維護性和擴展性更是難以言表,只有用用了才知道.web

說了這麼多,尚未介紹AutoFixture是幹什麼的,其實AutoFixture就是一個假數據填充工具.數據庫

其實不管是Nunit仍是Xunit都有數據填充功能,而且大部分時候都能知足需求.然而經過咱們前面的介紹就會知道有如下問題:框架

  • 不管是vlues註解仍是TestCase註解都沒有類型約束,這就可能會形成運行時錯誤.
  • 基於註解的值都只能是Const值,若是須要複雜類型就須要定義一個類型作爲Source爲當前操做提供值.
  • 與Nunit和Xunit生成的填充數據相比,Autofixture能夠生成符合驗證規則的數據(基於system.componentmodel.annotations名稱空間下的註解約束),這在集成測試裏幫助很大,對於有着很是複雜模型驗證的接口來講,手工製造出符合模型驗證規則的數據每每是很是痛苦的.
  • Autofixture能夠生成一組符合驗證規則的數據,這樣在測試的時候增長了樣本數據的隨機性,大大提高了測試的覆蓋面.

Moq測試雖然極大方便了測試,可是也會有一些問題:函數

  • 對於比較複雜的web項目,每每一個業務邏輯可能要消費十個幾個甚至幾十個數據接口,若是業務不是很成熟可能須要不斷的來調整這些接口,這裏的修改同時單元測試方法也須要修改(由於這些接口多數時候是經過構造函數注入的,構造函數參數數量的變更會致使調用者也須要作相應調整)工具

  • 雖然Moq也可以模擬類對象,可是限制很是多,咱們不可能爲了測試把全部的方法和屬性都加上abstract或者virtual.單元測試

而autofixture則能夠很好的解決這些問題.這樣極大增長代碼的可維護性和擴展性.測試

AutoFixture並非對moq的替代,它只能填充對象,而不能模擬對象,可是它能夠與moq框架結合實現更強大的功能.調試

autofixture安裝

autofixture安裝很是簡單,咱們在Nuget裏搜索autofixture,第一個就是它點擊安裝便可.code

關於autofixture與moq結合須要的包在後面講到的時候再安裝,這裏先略過.

AutoFixture 自動爲Nunit填充數據

要使AutoFixture與Nunit結合,首先咱們須要安裝特定的包.

在Nuget裏輸入AutoFixture.Nunit3,會出現如下選項
Avatar
因爲咱們使用的是Nunit3,所以咱們選擇第一個安裝.

AutoFixture還能夠與Xunit結合.在Nuget裏搜索AutoFixture.xunit2即可以搜索到AutoFixture與Xunit結合的框架.與Xunit結果的用法與Nunit差很少,只是須要注意Xunit數據測試方法須要Theory註解.

咱們新建一個名爲FixtureTest並引入AutoFixture.NUnit3;名稱空間

代碼以下

[TestFixture]
   public class FixtureTest
    {
        [Test]
        [AutoData]
        public void FixValueTest(int a, int b)
        {
            var result = Add(a , b);
            Assert.AreEqual(a + b, result);
        }
        int Add(int x, int y)
        {
            return x + y;
        }
    }

這裏與平時的單元測試相比,多了一個AutoData註解,有了AutoData註解,AutoFixture即可以給當前測試提供值了.
咱們斷點調試一下看看a和b的值

Avatar

咱們能夠看到a和b都被賦予了隨機的值.

咱們把測試代碼改成以下

[Test]
        [AutoData]
        public void FixValueTest(Person p1, Person p2)
        {
            var result = Add(p1.Age , p2.Age);
            Assert.AreEqual(p1.Age + p2.Age, result);
        }

咱們再斷點調試一下看看是否有值
Avatar

複雜對象它也能填充!這樣就免去了爲了使用複雜對象須要額外寫不少source繁瑣.

咱們把代碼改爲以下

[Test]
        [AutoData]
        public void FixValueTest(IEnumerable<Person> people)
        {
            var ages = people.Sum(a => a.Age);
        }

咱們看看此時會有什麼結果
Avatar

經過監視容器能夠看到,AutoFixture生成了一個包含三個元素的對象.

這簡直是太方便了,autofixture自動填充值不但減小了運行時可能的類型錯誤,還有極大的擴展性,若是咱們在測試方法上添加其它參數,它仍然可以自動填充.而使用Nunit自身帶的TestCase若是參數減小,裏面指定的值也要減小,不然會拋出運行時異常.

經過以上咱們能夠看到,AutoFixture能夠生成各類類型的對象,它能夠建立集合對象對咱們測試來講尤爲有用,免去了手動建立的麻煩.可是咱們同時也看到,基於註解的方法生成集合時只生成了三個,實際上要模擬數據庫是的數據測試一些行爲咱們可能須要更多的元素.這裏就須要對AutoFixture自己進行配置.這是基於註解的方法沒法完成的.

相關文章
相關標籤/搜索