【學習筆記】C#中的單元測試


  

  周一老師講完單元測試以后,感覺挺好玩,通過查資料和相關書籍學到了幾種C#在VS2010的測試方法,跟大家分享下,圖文並茂啊,有木有~~

 

 1.從被測試的代碼中生成單元測試

  1.1創建C#控制台程序,命名為AddUnitText

    

  1.2然后先用一小段很簡單的代碼練習一下

 1  class Program
 2     {
 3         public int Add(int a, int b)
 4         {
 5             return a + b;
 6         }
 7         static void Main(string[] args)
 8         {
 9         }
10     }

1.3然后用下面的步驟創建單元測試

  (1)在Add方法體中,在右擊菜單中選擇創建單元測試,並為這個方法創建單元測試代碼的基本框架

(2)點擊確定后,系統自動生成單元測試代碼,如下所示

 1 namespace AddText
 2 { 
 3     /// <summary>
 4     ///這是 ProgramTest 的測試類,旨在
 5     ///包含所有 ProgramTest 單元測試
 6     ///</summary>
 7     [TestClass()]
 8     public class ProgramTest
 9     {
10 
11 
12         private TestContext testContextInstance;
13 
14         /// <summary>
15         ///獲取或設置測試上下文,上下文提供
16         ///有關當前測試運行及其功能的信息。
17         ///</summary>
18         public TestContext TestContext
19         {
20             get
21             {
22                 return testContextInstance;
23             }
24             set
25             {
26                 testContextInstance = value;
27             }
28         }
29 
30         #region 附加測試特性
31         // 
32         //編寫測試時,還可使用以下特性:
33         //
34         //使用 ClassInitialize 在運行類中的第一個測試前先運行代碼
35         //[ClassInitialize()]
36         //public static void MyClassInitialize(TestContext testContext)
37         //{
38         //}
39         //
40         //使用 ClassCleanup 在運行完類中的所有測試后再運行代碼
41         //[ClassCleanup()]
42         //public static void MyClassCleanup()
43         //{
44         //}
45         //
46         //使用 TestInitialize 在運行每個測試前先運行代碼
47         //[TestInitialize()]
48         //public void MyTestInitialize()
49         //{
50         //}
51         //
52         //使用 TestCleanup 在運行完每個測試后運行代碼
53         //[TestCleanup()]
54         //public void MyTestCleanup()
55         //{
56         //}
57         //
58         #endregion
59 
60 
61         /// <summary>
62         ///Add 的測試
63         ///</summary>
64         [TestMethod()]
65         public void AddTest()
66         {
67             Program target = new Program(); // TODO: 初始化為適當的值
68             int a = 0; // TODO: 初始化為適當的值
69             int b = 0; // TODO: 初始化為適當的值
70             int expected = 0; // TODO: 初始化為適當的值
71             int actual;
72             actual = target.Add(a, b);
73             Assert.AreEqual(expected, actual);
74             Assert.Inconclusive("驗證此測試方法的正確性。");
75         }
76     }
77 }

(3)ProgramTest.cs代碼文件詳講

[TestMethod()]:說明了以下代碼是一個測試用例

Int a = o; // TODO: 初始化為適當的值

int b = 0; // TODO: 初始化為適當的值

這兩句是被測函數的輸入參數,需要我們去修改它的值,也就是我們輸入測試用例的地方。

double expected = 0; // TODO: 初始化為適當的值

double actual;

這兩句話淺顯易懂,前一句話是定義了期望值和對它進行初始化,后一句話是定義了實際值。默認

Assert.AreEqual(expected, actual);

Assert在這里可以理解成斷言:在VSTS里做單元測試是基於斷言的測試。

默認代碼中Assert.Inconclusive 表明這是一個未經驗證的單元測試。在實際的程序中可以注釋掉。

(4)還可以在C#項目中自行創建單元測試項目,然后編寫測試方法

單元測試的基本方法是調用被測代碼的函數,輸入函數的參數值,獲取返回結果,然后與預期測試結果進行比較,如果相等則認為測試通過,否則認為測試不通過。

1、Assert類的使用

Assert.Inconclusive()    表示一個未驗證的測試;

Assert.AreEqual()         測試指定的值是否相等,如果相等,則測試通過;

AreSame()            用於驗證指定的兩個對象變量是指向相同的對象,否則認為是錯誤

AreNotSame()        用於驗證指定的兩個對象變量是指向不同的對象,否則認為是錯誤

Assert.IsTrue()              測試指定的條件是否為True,如果為True,則測試通過;

Assert.IsFalse()             測試指定的條件是否為False,如果為False,則測試通過;

Assert.IsNull()               測試指定的對象是否為空引用,如果為空,則測試通過;

Assert.IsNotNull()          測試指定的對象是否為非空,如果不為空,則測試通過;

2、CollectionAssert類的使用

用於驗證對象集合是否滿足條件

StringAssert類的使用

用於比較字符串。

StringAssert.Contains

StringAssert.Matches

StringAssert.tartWith

3、附加測試屬性的使用

默認都是被注釋掉的,只要我們取消注釋就可以使用了。這個功能的加入,很大程度上是為了增加測試的靈活性。具體的屬性有:

[ClassInitialize()]在運行類的第一個測試前先運行代碼

[ClassCleanup()]在運行完類中的所有測試后再運行代碼

[TestInitialize()]在運行每個測試前先運行代碼

[TestCleanup()]在運行完每個測試后運行代碼

4、測試單元NUnit 聲明

  1.AreEqual

     Assert.AreEqual(expected,actual[,string message])

    //判斷結果與預期是否相等

     報告的結果如下:

     Assert.AreEqia;(expected,actual,tolerance[,string message])

   2.IsNull

    Assert.IsNull(object [, string message])
    Assert.IsNotNull(object [, string message])

    聲明給的對象是否屬於空

   3.AreSame

    Assert.AreSame(expected, actual [, string message])

     聲明是否同類型

   4.IsTrue

    Assert.IsTrue(bool condition [, string message])

    判斷返回條件是否為真

   5.Fail

    Assert.Fail([string message])

     測試立即失敗。

 

2.下面是老師課上編寫的程序

2.1這是測試代碼:

   查找list[]中的最大值:int Largest(int list[], int length);

  首份實現代碼如下:

int Largest(int list[], int length)

{

  int i,max;

   for(i = 0; i < (length – 1); i ++ )

  {  

     if(list[i] > max)

       { max=list[i]; }

  }

return max;

}

 

2.2編寫程序:

 1 static void Main(string[] args)
 2         {
 3             int[] List = new int[3];//申明一個長度為3的數組保存錄入的3個數
 4             int Max = 0;//保存最大值
 5             for (int i = 0; i < List.Length; i++)//循環數組
 6             {
 7                 Console.WriteLine("請輸入第" + (i + 1) + "個數:");
 8                 List[i] = int.Parse(Console.ReadLine());//循環將錄入的數字保存到數組
 9                 if (List[i] > Max)//判斷當前數字是否大於最大值
10                 {
11                     Max = List[i];//將最大值賦值給Max
12                 }
13             }
14             Console.WriteLine("最大的數是:{0}",Max);//輸出最大值
15             Console.ReadLine();
16         }

2.3在此測試的過程中發現無法對程序進行有效的測試,所以重新寫了方法

 1 namespace MUnitText
 2 {
 3     public class LIU
 4     {
 5         /// <summary>
 6         /// 把返回的最大值放在list中
 7         /// </summary>
 8         /// <param name="list">一列整數</param>
 9         /// <returns>最大值返回給出的list中</returns>
10         public static int Largest(int[] list)
11         {
12             int i, max = Int32.MaxValue;
13             for (i = 0; i < list.Length - 1; i++)
14             {
15                 if (list[i] > max)
16                 {
17                     max = list[i];
18                 }
19             }
20             return max;
21         }
22     }
23 }

 

2.4創建單元測試

測試了多組數據以后,驗證了老師上課提到的那些錯誤。

給一列數字[7,8,9].這個方法返回9.這是很符合常理的一個測試用例。但是,另外的測試用例如何想?

要寫多少測試用例?

下面給出測試思想。

[7,8,9]—>9

  [8,9,7]—>9

  [9,7,8]—>9

  當有重復的最大的數字時候將會發生什么?

  [7,9,8,9]—>9

  因為只存在int類型,沒有objects類型,所以你可能不會關系9返回的是什么類型。

  那么當只有1個數字的時候,它將會是什么?

  [1]—>1

  並且當出現負數時候又會發生什么情況:

  [-9,-8,-7]—>-7

  可以很很簡單的看出來-7比-9大。

 

2.5編寫測試方法

首先:通過Globally assembly cath調用using NUnit.Framework;

    NUnit框架提供我們需要的單元測試的功能。

    下一步,我們要定義一個類:每一個類包含着測試用例狀態屬性的注釋。必須被聲明為共有的,它必須有一個共有的,沒有參數和構造器的。

    最終,這個測試類包含單個帶有測試屬性的測試方法。

 1  using NUnit.Framework;
 2 
 3     [TestFixture]
 4 
 5     public class TestSimple{
 6 
 7         [Test]
 8 
 9         public void LargestOf3(){
10 
11             Assert.AreEqual(9,Cmp.Largest(new int[]{8,9,7}));
12 
13             Assert.AreEqual(100,Cmp.Largest(new int[]{100,4,25}));
14 
15             Assert.AreEqual(64,Cmp.Largest(new int[]{1,64,38}));
16 
17         }
18 
19     }

 

測試了一上午,太不容易了,抓緊搞電梯了。。


免責聲明!

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



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