用ABP只要加人即可马上加快项目进展(二) - 分工篇 - BDD实战篇 - .NET Core里跑Specflow...
這是<如何用ABP框架快速完成項目?>系列中的一篇文章。
?
BDD很贊!比TDD先進(jìn)很多,能夠大大提高編碼效率。
?
上一篇文章說了如何在.NET Core里安裝Specflow. 然而文章成果只到了hello world級別。
要想真的和實際業(yè)務(wù)結(jié)合,比如要能夠IOC new class實例和能夠調(diào)用數(shù)據(jù)庫和第三方服務(wù)。用專業(yè)術(shù)語來說,就是能跑集成測試和單元測試。這就是這篇文章的目的了。
?
和.NET不一樣的是,.NET Core取消了App.config,并且整個機(jī)制都改變了。導(dǎo)致很多.NETer轉(zhuǎn).NET Core的時候一臉懵逼
?
所以在.NET Core下運用BDD/TDD也不一樣了。這篇文章就講講如何配置。
?
原來app.config一分為二,specflow部分劃為specflow.json,在這篇文章里有提到。其他劃為appsetting.json
文件格式也從原來的xml文檔變?yōu)閖son文檔。
同時還需要把appsetting.json文件屬性設(shè)置為如下
讀取配置的方式也從原來的system.configmanager.appsetting變?yōu)?IConfigurationRoot[key]方式。示例代碼如下:
?
| 1234567891011 | 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:
為啥集成測試?yán)锩鏀?shù)據(jù)庫返回結(jié)果數(shù)目總是0?
答:檢查一下測試項目目錄\bin\Debug\netcoreapp2.1目錄下有沒有appsetting.json這個文件,沒有則看看有沒有做上面的第3步
?
通過以上步驟,終于可以調(diào)用數(shù)據(jù)庫和第三方服務(wù)來跑集成測試了。然而還有一個很大問題,單元測試跑不過啊!!!
?
為什么會跑不過呢?
因為BDD和TDD不一樣。
TDD的Test case是可以直接繼承ABP里面的XXXTestBase基類的,這個基類里面提供了IOC new class實例等一系列很有用的方法。
但是BDD的Specflow卻是Test Case和Step Definition分離的。在Step Definition里面是無法調(diào)用XXXTestBase基類里的這些方法的。
?
那怎么辦呢?
照如下步驟辦即可:
新增一個TestBaseWrappers文件夾
然后根據(jù)實際業(yè)務(wù)從最小化角度來建立TestBaseWrapper類
在這個類里面寫IOC代碼
然后再Step Definition類里調(diào)用這些TestBaseWrapper類。
?
Q&A:
為什么不用Step Definition類直接繼承ABP里面的XXXTestBase基類呢?
答:首先會報錯。然后我在這篇文章里面說到,我們只有一個Step Definition類,然后分布在多個文件,通過Partial關(guān)鍵字來組合。所以如果Step Definition這么大的一個類來直接繼承TestBase基類,然后在TestBase基類里構(gòu)造函數(shù)來IOC初始化所有要調(diào)用Service類實例,第一會遇到性能問題,第二會遇到循環(huán)調(diào)用問題,這畫面太美不敢看啊。
報錯: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擴(kuò)展方法去Map,而要使用IObjectMapper,ABP官網(wǎng)十分清晰明確的說明了,要想用Unit Test就必須Always use IObjectMapper, do not use MapTo extension methods
所以這道題是我面試必選題之一!!凡是在ABP項目里面使用MapTo擴(kuò)展方法而不是使用IObjectMapper的,絕對是沒寫過單元測試的!這樣子一下就可以判斷出面試者有沒有寫過單元測試了!!!
為啥你講了這么多測試方面的知識,開發(fā)的知識卻很少?
答:因為:
無論是TDD還是BDD,都是測試驅(qū)動,先寫測試代碼然后再寫業(yè)務(wù)開發(fā)代碼
講ABP開發(fā)的文章太多,不缺我一個,然而講用ABP去做BDD/TDD的文章卻很少,很需要我去補充
我現(xiàn)在自己創(chuàng)業(yè),自負(fù)盈虧,不像很多開發(fā)人員,每月固定有工資,旱澇保收,可以放心的去空談理論。所以我一切以出活為主,以交付實際成果為第一目標(biāo),而不是以理論和空談為目標(biāo)。BDD/TDD可以避免把寶貴的時間投入到項目實際上不需要的理論方面,可以保證我做的東西是客戶所想要的。所以我強(qiáng)烈推薦BDD這個核武器。
在上一點里面我說出了核心,如何保證你所做的東西就是客戶想要的?這就是BDD與TDD相比,BDD最大的優(yōu)點啦!!!畢竟,絕大多數(shù)情況下,業(yè)務(wù)人員會比開發(fā)人員更了解業(yè)務(wù)!
原文地址:?https://www.cnblogs.com/adalovelacer/p/abp-quickly-delivery-16-run-specflow-at-dot-net-core.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的用ABP只要加人即可马上加快项目进展(二) - 分工篇 - BDD实战篇 - .NET Core里跑Specflow...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4-从数据库
- 下一篇: 01.微服务系列介绍