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.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 }