1. 程式人生 > >用ABP只要加人即可馬上加快專案進展(二) - 分工篇 - BDD實戰篇 - .NET Core裡跑Specflow - 可以跑整合測試和單元測試

用ABP只要加人即可馬上加快專案進展(二) - 分工篇 - BDD實戰篇 - .NET Core裡跑Specflow - 可以跑整合測試和單元測試

這是< 如何用ABP框架快速完成專案 >系列中的一篇文章。   BDD很贊!比TDD先進很多,能夠大大提高編碼效率。   上一篇文章說了如何在.NET Core裡安裝Specflow. 然而文章成果只到了hello world級別。 要想真的和實際業務結合,比如要能夠IOC new class例項和能夠呼叫資料庫和第三方服務。用專業術語來說,就是能跑整合測試和單元測試。這就是這篇文章的目的了。   和.NET不一樣的是,.NET Core取消了App.config,並且整個機制都改變了。導致很多.NETer轉.NET Core的時候一臉懵逼   所以在.NET Core下運用BDD/TDD也不一樣了。這篇文章就講講如何配置。  
  1. 原來app.config一分為二,specflow部分劃為specflow.json,在
    這篇文章
    裡有提到。其他劃為appsetting.json
  2. 檔案格式也從原來的xml文件變為json文件。
  3. 同時還需要把appsetting.json檔案屬性設定為如下
  4. 讀取配置的方式也從原來的system.configmanager.appsetting變為 IConfigurationRoot[key]方式。示例程式碼如下:  
        public class AppEnvConfiguration : ITransientDependency
        {
            private readonly IConfigurationRoot _appConfiguration;        
    
            public bool IsEnableADFS => bool.Parse(_appConfiguration["ExternalAuth:WsFederation:IsEnabled"]);
    
            public AppEnvConfiguration(IAppConfigurationAccessor configurationAccessor)
            {
                _appConfiguration = configurationAccessor.Configuration;
            }
        }
    

      

  Q&A:
  1. 為啥整合測試裡面資料庫返回結果數目總是0? 答:檢查一下測試專案目錄\bin\Debug\netcoreapp2.1目錄下有沒有appsetting.json這個檔案,沒有則看看有沒有做上面的第3步
  通過以上步驟,終於可以呼叫資料庫和第三方服務來跑整合測試了。然而還有一個很大問題,單元測試跑不過啊!!!   為什麼會跑不過呢? 因為BDD和TDD不一樣。 TDD的Test case是可以直接繼承ABP裡面的XXXTestBase基類的,這個基類裡面提供了IOC new class例項等一系列很有用的方法。 但是BDD的Specflow卻是Test Case和Step Definition分離的。在Step Definition裡面是無法呼叫XXXTestBase基類裡的這些方法的。   那怎麼辦呢? 照如下步驟辦即可:
  1. 新增一個TestBaseWrappers資料夾
  2. 然後根據實際業務從最小化角度來建立TestBaseWrapper類
  3. 在這個類裡面寫IOC程式碼
  4. 然後再Step Definition類裡呼叫這些TestBaseWrapper類。
  Q&A:
  1. 為什麼不用Step Definition類直接繼承ABP裡面的XXXTestBase基類呢? 答:首先會報錯。然後我在這篇文章裡面說到, 我們只有一個Step Definition類,然後分佈在多個檔案,通過Partial關鍵字來組合。所以如果Step Definition這麼大的一個類來直接繼承TestBase基類,然後在TestBase基類裡建構函式來IOC初始化所有要呼叫Service類例項,第一會遇到效能問題,第二會遇到迴圈呼叫問題,這畫面太美不敢看啊。
  2. 報錯:Message: System.InvalidOperationException : Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.如何解決? 答:不要用MapTo擴充套件方法去Map,而要使用IObjectMapper, ABP官網十分清晰明確的說明了,要想用Unit Test就必須Always use IObjectMapper, do not use MapTo extension methods 所以這道題是我面試必選題之一!!凡是在ABP專案裡面使用MapTo擴充套件方法而不是使用IObjectMapper的,絕對是沒寫過單元測試的!這樣子一下就可以判斷出面試者有沒有寫過單元測試了!!!
  3. 為啥你講了這麼多測試方面的知識,開發的知識卻很少? 答:因為:
    1. 無論是TDD還是BDD,都是測試驅動,先寫測試程式碼然後再寫業務開發程式碼
    2. 講ABP開發的文章太多,不缺我一個,然而講用ABP去做BDD/TDD的文章卻很少,很需要我去補充
    3. 我現在自己創業,自負盈虧,不像很多開發人員,每月固定有工資,旱澇保收,可以放心的去空談理論。所以我一切以出活為主,以交付實際成果為第一目標,而不是以理論和空談為目標。BDD/TDD可以避免把寶貴的時間投入到專案實際上不需要的理論方面,可以保證我做的東西是客戶所想要的。所以我強烈推薦BDD這個核武器。
    4. 在上一點裡面我說出了核心,如何保證你所做的東西就是客戶想要的?這就是BDD與TDD相比,BDD最大的優點啦!!!畢竟,絕大多數情況下,業務人員會比開發人員更瞭解業務!