一、什麼叫單元測試(unit testing)?

是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函 數,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的最小的被測功能模組。單元測試是在軟體開發過程中 要進行的最低級別的測試活動,軟體的獨立單元將在與程式的其他部分相隔離的情況下進行測試。

C#中,一個方法,一個類,一個視窗的測試。即單元測試。

二、為什麼要進行單元測試。

為了程式的正確性,儘早的發現程式的BUG,便於後期的開發及除錯,維護。

三、誰做這一工作?

答案是:程式設計師自己,因為程式設計師才明白自己寫的code,才知道要達到的效果。

四、什麼時候做?

單元測試越早越好,早到什麼程度?極限程式設計(Extreme Programming,或簡稱XP)講究TDD,即測試驅動開發,先編寫測試程式碼,再進行開發。在實際的工作中,可以不必過分強調先什麼後什麼,重要的是高效和感覺舒適。從經驗來看,先編寫產品函式的框架,然後編寫測試函式,針對產品函式的功能編寫測試用例,然後編寫產品函式的程式碼,每寫一個功能點都執行測試,隨時補充測試用例。所謂先編寫產品函式的框架,是指先編寫函式空的實現,有返回值的直接返回一個合適值,編譯通過後再編寫測試程式碼,這時,函式名、引數表、返回型別都應該確定下來了,所編寫的測試程式碼以後需修改的可能性比較小。

五、 C#專案測試DEMO, 本demo用VS2019寫。

新建一個控制檯應用。名稱叫:UnitTestDemo

寫一個待測試的方法。

新建一個單元測試專案。名稱叫:UnitTestDemoTest

引用UnitTestDemo





編寫測試方法

修改類名,及方法名。UnitTest1重新命名為ProgramTest,方法名:TestMethod1改為:AddTest。

這裡說明一下,方法面上面的特性:[TestMethod]這是必須的。告訴編譯器這是一個測試法式。

寫程式碼。呼叫要測試的方法。

開啟“測試資源管理器”,在“測試”->視窗->測試資源管理器



如果未通過。是個紅色的X,我們現在再寫一個未通過的方法。

注意方法的特性一定要加[TestMethod],再去執行測試。

回到主專案。看方法提示行。上面有標測測試通過。

第二個測試失敗了

在方法上面有一個清楚的提示。

六、 sonarqube整合單元測試

這裡需要藉助Opencover來生成單元測試覆蓋報告文件

1. 安裝Opencover

安裝過程所有選項預設即可

2. 執行sonarqub 掃描

SonarScanner.MSBuild.exe begin /k:"UnitTestDemo"  /d:sonar.host.url="http://192.168.101.76:9000" /d:sonar.login="8ad34045e7e978ca678e184c397a76a62114f9ed" /d:sonar.cs.opencover.reportsPaths="%CD%\testcover.xml"

MSBuild.exe /t:Rebuild

"C:\Users\sunpengfei\AppData\Local\Apps\OpenCover\OpenCover.Console.exe" -output:"%CD%\testcover.xml" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" -targetargs:"%CD%\UnitTestDemoTest\bin\Debug\UnitTestDemoTest.dll"

#注意替換相關exe 檔案路徑OpenCover.Console.exe是前面安裝的 ,其他的是vs 2019自帶程式,#UnitTestDemoTest.dll是測試專案生成

SonarScanner.MSBuild.exe end /d:sonar.login="8ad34045e7e978ca678e184c397a76a62114f9ed"

Begin 和end是固定格式,這裡begin部分多了一個/d選項,/d為dynamic properties 動態屬性.通過動態屬性指定單元測試報告的位置.%CD%即為當前目錄

第二段 msbuild.exe執行構建.

第三段 這裡是生成單元測試覆蓋率報告的關鍵. 首先指定Opencover所在位置,-register user 為註冊當前windows使用者以使其有許可權執行.-output 指定覆蓋率檔案輸出位置,這裡必須和上面的 sonar.cs.opencover.reportsPaths保持一致. -target為要指定的單元測試runner,這裡使用的是visual studio自帶的vstest.console.exe targetargs指定要進行單元測試的目標dll.

3. 掃描結果

執行完成以後,我們再開啟sonarqube web管理介面就會看到剛剛生成的mytest專案