[C#.NET] 簡單的測試程式

  • 5971
  • 0
  • 2011-10-30

摘要:[C#.NET] 簡單的測試程式

說明:

為確保開發品質,寫測試程式可以協助自己迅速了解發生問題的點,以前完全沒有寫測試程式的習慣,最近有機會使用到測試程式後才發現測試程式真的可以幫我建立信心!

這次我們先建立一個類別庫(Class Library)的專案,取名為LoginDemo,用來驗證使用者輸入的密碼是否和存在資料庫裡的密碼一致,我建立了兩個類別:LoginBL.cs負責處理商業邏輯,另一個MemberDA.cs負責資料的存取,最後再加上一個SQL Express的mdf資料庫用來儲存帳號跟密碼,專案的結構長這樣:

DB裡面有個名稱為Member的資料表,資料結構如下:

LoginBL.cs主要的功能就是使用MemberDA.cs來取密碼,然後跟使用者輸入的密碼做比對:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LoginDemo
{
    /// 
    /// LoginBL
    /// 
    public class LoginBL
    {
        /// 
        /// 檢查所輸入的密碼是否與DB儲存的密碼相符
        /// 
        public bool VerifyPassword(string loginName, string password)
        {
            MemberDA memberDA = new MemberDA();
            string returnValue = memberDA.GetPassword(loginName);
            return returnValue == password;
        }
    }
}

 

MemberDA.cs是負責跟DB溝通:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;

namespace LoginDemo
{
    /// 
    /// MemberDA
    /// 
    public class MemberDA
    {
        /// 
        /// DB連線字串
        /// 
        private string connString = @"Data Source=.\SQLEXPRESS;
                                      AttachDbFilename=""c:\users\kevin tan\documents\visual studio 2010\Projects\LoginDemo\LoginDemo\Database1.mdf"";
                                      Integrated Security=True;
                                      User Instance=True";

        /// 
        /// 從DB取密碼
        /// 
        public string GetPassword(string loginName)
        {
            string result = string.Empty;
            using (SqlConnection sqlConn = new SqlConnection(connString))
            { 
                string sql = @"SELECT top 1 member_password
                               FROM member(nolock) 
                               WHERE member_loginname = @loginname";

                SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
                sqlComm.Parameters.AddWithValue("@loginname", loginName);
                sqlConn.Open();
                result = (string)sqlComm.ExecuteScalar() == null ? string.Empty : (string)sqlComm.ExecuteScalar();
            }
            return result;
        }
    }
}

到這邊時開發已經結束,首先我們先替MemberDA.cs寫個測試程式,看看GetPassword這個方法有沒有正確運行,首先我們在GetPassword的方法上按下滑鼠右鍵,接著在選單裡選"產生單元測試":

接著開發工具會幫我們建立一個測試專案:

點下OK後,我們就會看到測試方法已替我們自動建立好了:


        /// 
        ///A test for GetPassword
        ///
        [TestMethod()]
        public void GetPasswordTest()
        {
            MemberDA target = new MemberDA(); // TODO: Initialize to an appropriate value
            string loginName = string.Empty; // TODO: Initialize to an appropriate value
            string expected = string.Empty; // TODO: Initialize to an appropriate value
            string actual;
            actual = target.GetPassword(loginName);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

接下來就是修改TODO的部分,假設我要傳給該方法的帳號名稱(loginName)是kevin,而我預期該方法會回傳的值(expected)是kevin:


        /// 
        ///A test for GetPassword
        ///
        [TestMethod()]
        public void GetPasswordTest_正確密碼()
        {
            MemberDA target = new MemberDA(); 
            string loginName = "kevin";
            string expected = "kevin";
            string actual;
            actual = target.GetPassword(loginName);
            Assert.AreEqual(expected, actual);
        }

這樣針對該方法的測試程式就寫完了,接著在該測試方法上按下右鍵,點選"執行測試程式":

我們就會看到最下方出現該測試程式的測試結果:

測試結果只代表單一測試案例,單一測試案例的結果沒辦法確保實際使用上就是萬無一失,所以接下來我們可以依據實際測試案例來增加我們的測試程式,盡可能確保涵蓋各式各樣的案例,當我們有修改到程式,就可利用這些測試程式來確保我們預期的結果不會跟著變動,發生修好A但是B卻不如預期的情況了。