VS2015使用NUnit 3.0進行測試 - 2016新年快樂

VS2015使用NUnit 3.0進行測試 - 2016新年快樂

洪師博 - 為了生活,我可以忍

來源:網路

前一篇「使用VS2015建立單元測試專案」介紹VS2015的單元測試(Unit Test)建立與NUnit 2.6.x的使用方式。而NUnit 3在2015/11/16終於release了。這一篇是說要說明Visual Studio 2015與NUnit 3的整合使用方式。

Visual Studio Test Adapter for NUnit 3.0

要讓Visual Studio 2012/2013/2015的測試總管支援執行NUnit 3.0版必須安裝Visual Studio Test Adapter for NUnit 3.0擴充功能,需要注意,Visual Studio Test Adapter僅支援NUnit 3.0版,2.x版請參考前一篇套件與設置方式。

NUnit Templates for Visual Studio

接下來還有第二個NUnit Templates for Visual Studio擴充功能需要安裝,它提供Visual Studio新增NUnit 3.0測試專案的功能。它提供了同時提供Desktop - C#/VB、Xamarin - Android/iOS/UWP/WP8.1專案類別的支援能力。還能看到 VB 的身影,好感動。

NUnit 3.0初體驗

以下就用一個最簡單的加法計算器來進行NUnit 3.0初體驗。

add nunit 3.0 test project

唯一注意是選擇NUnit(表示使用NUnit 3.0)不是NUnit2

upgrade nunit 3 to release version

看一下範本所加入的組件,還是使用 beta 版本,讓我們升級至為 release 版本。

    [TestFixture()]
    public class CalculatorTests
    {
        [Test()]
        public void Add_整數5加5_得整數10()
        {
            var first = 5;
            var second = 5;
            var expected = 10;

            var target = new Calculator();
            var actual = target.Add(first, second);

            Assert.AreEqual(expected, actual);
        }

        [Test()]
        public void Add_浮點5點4加5點4_得浮點10點9()
        {
            var first = 5.4;
            var second = 5.4;
            var expected = 10.8;

            var target = new Calculator();
            var actual = target.Add(first, second);

            Assert.AreEqual(expected, actual);
        }
    }
 
NUnit 3.0 Test Result

我是故意不附上Calculator實作程式碼,你能發現,有了清楚的測試程式碼,就算你沒有原始程式碼也能清楚知道原始程式碼在做什麼事。

SpecFlow與NUnit 3.0

上一小節透過Visual Studio Test Adapter與NUnit Templates for Visual Studio擴充功能的幫忙,已經可以在Visual Studio順利透過NUnit 3.0進行單元測試。但如果讀者是TDDBDD的開發者,那麼會關心的NUnit 3.0是否能在SpecFlow中使用?

讓我們以SpecFlow進行Calculator的測試案例。

Feature: 透過Calculator類別進行數值計算
 In order to 進行Add運算
 As a Calculator呼叫者
 I want to 驗證兩個數值Add()後的回傳的總數

@Calculator
Scenario: 兩個正整數相加
 Given 我輸入第一個整數5到計算機
 And 我輸入第二個整數5到計算機
 When 呼叫Calculator的Add的int多載方法
 Then 應該得到整數結果為10

Scenario: 兩個浮點數相加
 Given 我輸入第一個浮點數5.4到計算機
 And 我輸入第二個浮點數5.4到計算機
 When 呼叫Calculator的Add的double多載方法
 Then 應該得到浮點數結果為10.8  
 

先把.feature的Scenario的寫好,然後產生Step檔並撰寫測試程式碼:

using NUnit.Framework;
using System;
using TechTalk.SpecFlow;

namespace CalculatorTests
{
    [Binding]
    public class 透過Calculator類別進行數值計算Steps
    {
        Calculator.Calculator target;

        [BeforeScenario()]
        public void BeforeFeatureCalculator()
        {
            target = new Calculator.Calculator();
            ScenarioContext.Current.Clear();
        }

        [AfterScenario()]
        public void AfterFeatureCalculator()
        {
            ScenarioContext.Current.Clear();
        }

        [Given(@"我輸入第一個整數(.*)到計算機")]
        public void Given我輸入第一個整數到計算機(int p0)
        {
            ScenarioContext.Current.Add("first", p0);
        }
        
        [Given(@"我輸入第二個整數(.*)到計算機")]
        public void Given我輸入第二個整數到計算機(int p0)
        {
            ScenarioContext.Current.Add("second", p0);
        }
        
        [Given(@"我輸入第一個浮點數(.*)到計算機")]
        public void Given我輸入第一個浮點數到計算機(double p0)
        {
            ScenarioContext.Current.Add("first", p0);
        }
        
        [Given(@"我輸入第二個浮點數(.*)到計算機")]
        public void Given我輸入第二個浮點數到計算機(double p0)
        {
            ScenarioContext.Current.Add("second", p0);
        }

        [When(@"呼叫Calculator的Add的int多載方法")]
        public void When呼叫Calculator的Add的Int多載方法()
        {
            var first = (int)ScenarioContext.Current["first"];
            var second = (int)ScenarioContext.Current["second"];

            var result = target.Add(first, second);

            ScenarioContext.Current.Add("result", result);
        }

        [Then(@"應該得到整數結果為(.*)")]
        public void Then應該得到整數結果為(int p0)
        {
            var actual = p0;
            var expected = (int)ScenarioContext.Current["result"];

            Assert.AreEqual(expected, actual);
        }

        [When(@"呼叫Calculator的Add的double多載方法")]
        public void When呼叫Calculator的Add的Double多載方法()
        {
            var first = (double)ScenarioContext.Current["first"];
            var second = (double)ScenarioContext.Current["second"];

            var result = target.Add(first, second);

            ScenarioContext.Current.Add("result", result);
        }

        [Then(@"應該得到浮點數結果為(.*)")]
        public void Then應該得到浮點數結果為(double p0)
        {
            var actual = p0;
            var expected = (double)ScenarioContext.Current["result"];

            Assert.AreEqual(expected, actual);
        }

    }
}
 

第一行記得加入using NUnit.Framework;。還有App.config需要設置:

<specFlow>
  <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
  <unitTestProvider name="NUnit" />
</specFlow>  
 

unitTestProvider指定為NUnit。執行測試。

SpecFlow with NUnit 3.0 Test Result

綠燈,SpecFlow與NUnit 3.0非常順利且無感就整合並執行測試案例。

NUnit對於Visual Studio的支援是非常快速與支接的,如果你知道"N"就是代表.NET的話。

如果對NUnit 3.0有興趣的讀者,這裡有一篇InfoQ對作者Charlie Poole的訪談「NUnit 3引入扩展能力与并行执行特性可以進一步的瞭解。

GitHub取得本文完整範例:https://github.com/kkbruce/CalculatorForNUnit3

至於,為何文章開頭選了張圖文不符的圖?就看到網路有人寫VS2015不能Run NUnit 3.0,然後就說這是個雷。為了生活,我可以忍,但污辱Visual Studio就不行。感謝他,讓本文產生。 :P

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。