VS2010(2012)中使用Unit Testing進行單元測試


   使用VS 2012自帶的Unit Testing工具進行單元測試是非常方便的。網上關於這方面的例子很多,這篇隨筆只起個人學習筆記之用,所以脈絡不會很清晰。

1、簡單Demo:

    待測試類:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NUnitLab { public class MaxValue { // 將要測試的方法
        public static int Max(int[] list) { if (list == null) return -1; int len = list.Length; if (len == 0) return list[0]; int i, max = int.MinValue; for (i = 0; i < len; i++) { if (list[i] > max) max = list[i]; } return max; } public static int Min(int[] list) { return 0; } public static void Main() { } } }

   測試代碼:

using System; using System.Reflection; using Microsoft.VisualStudio.TestTools.UnitTesting; using NUnitLab; namespace UnitTestProject { [TestClass()] public class TestMaxValue { [TestMethod] public void TestMax() { Assert.AreEqual(MaxValue.Max(new int[] {9, 9, 1}), 9); Assert.AreEqual(MaxValue.Max(new int[] { -1, 2, 1 }), 2); } } }

 

2、測試准備和測試清理工作

    如果我想在所有TestMethod執行前進行一些准備工作怎么辦?答案是使用ClassInitialize。

    如果我想在所有TestMethod執行完成后進行一些清理工作怎么辦?答案是使用ClassCleanup。

    如果我想在每個TestMethod執行前進行一些准備工作怎么辦?答案是使用TestInitialize。

    如果我想在每個TestMethod執行完成后進行一些清理工作怎么辦?答案是使用TestCleanup。

    如下:

using System; using System.Reflection; using Microsoft.VisualStudio.TestTools.UnitTesting; using NUnitLab; namespace UnitTestProject { [TestClass()] public class TestMaxValue { public TestContext TestContext { get; set; } [ClassInitialize()] public static void Init(TestContext context) { Console.WriteLine("Use ClassInitialize to run code before you run the first test in the class."); } [TestInitialize] public void BeforeTest() { Console.WriteLine("Use TestInitialize to run code before you run each test."); } [TestMethod] public void TestMax() { Assert.AreEqual(MaxValue.Max(new int[] {9, 9, 1}), 9); Assert.AreEqual(MaxValue.Max(new int[] { -1, 2, 1 }), 2); // 結果不明或者還未完成測試
            Assert.Inconclusive(string.Format("還未完成{0}方法的單元測試", MethodBase.GetCurrentMethod().Name)); }

[TestCleanup] public void AfterTest() { Console.WriteLine("Use TestCleanup to run code after you run each test."); } [ClassCleanup()] public static void Cleanup() { Console.WriteLine("Use ClassCleanup to run code after all tests in a class have run."); } } }

 

3、[ExpectedException]

    Unit Testing中的attribute除了最基本的TestClass、TestMethod以外,還有一些非常用但是可能有用的attribute。

    [ExpectedException(exceptionType: Type]可以用來表明某個測試方法預期拋出某個異常,並且只有真的拋出異常時才通過測試。比如下面:

[TestMethod] [ExpectedException(typeof(ArgumentException))] public void TestExpectedException() { throw new ArgumentException("參數錯誤"); }

 

4、斷言API

    Assert類的靜態方法如下,其中常用的包括AreEqual、AreNotEqual、AreSame、IsNull、IsTrue、Inconclusive和Fail

alt

   針對集合類型的斷言方法:

alt

   針對字符串類型的斷言方法:

alt

 

5、針對ASP.NET的單元測試

    這里推薦網上的一個系列博客,

    ASP.NET單元測試系列1(新手上路):http://blog.miniasp.com/post/2010/09/14/ASPNET-MVC-Unit-Testing-Part-01-Kick-off.aspx

    ASP.NET單元測試系列2(可測試性):http://blog.miniasp.com/post/2010/09/15/ASPNET-MVC-Unit-Testing-Part-02-Testability.aspx

    ASP.NET單元測試系列3(使用Mock):http://blog.miniasp.com/post/2010/09/16/ASPNET-MVC-Unit-Testing-Part-03-Using-Mock-moq.aspx

    ASP.NET單元測試系列4(單元測試的目的與價值):http://blog.miniasp.com/post/2010/09/17/ASPNET-MVC-Unit-Testing-Part-04-The-Purpose-and-Value.aspx

    ASP.NET單元測試系列5(了解Stub):http://blog.miniasp.com/post/2010/09/18/ASPNET-MVC-Unit-Testing-Part-05-Using-Stub-Object.aspx

    ASP.NET單元測試系列6(測試路由規則):http://blog.miniasp.com/post/2010/09/23/ASPNET-MVC-Unit-Testing-Part-06-Routing.aspx

 

6、Visual Studio 2012 Fakes框架

    http://www.cnblogs.com/liuliuyingxia/archive/2012/08/26/2657515.html

    http://www.cnblogs.com/liuliuyingxia/archive/2012/08/25/2655856.html

 

7、其他資源(MSDN)

    Real World Developer Testing with Visual Studio 2012: http://channel9.msdn.com/Events/TechEd/Europe/2012/AAP401

    Verifying Unit Testing by Using Unit Tests: http://msdn.microsoft.com/en-us/library/dd264975(v=vs.110).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM