單元測試架構”艾信.NET單元測試工具(AssionUnit)”開發—第一步

來源:互聯網
上載者:User
*引言:最近做單元測試,突然有一股衝動,想要自己做一套單元測試的架構。這個人就是只要有想法就要去做(多數都做了一半)。

首先整理一下思路,我的想法是:
1、利用反射去動態載入程式集
2、尋找標有自訂特性的類和方法
3、自訂一套異常機制,用來返回測試結果
4、一些輔助判斷類的開發
5、一個友好的用戶端工具或是VS外掛程式用來啟動和反饋測試結果

使用者特性如下:
1、測試類別特性    /// <summary>
    /// 測試類別使用者特性,加上此特性的類參與單元測試
    /// </summary>
    [AttributeUsage(AttributeTargets.Class)]
    public class TestClassAttribute:Attribute
    {

    }

2、測試方法特性

Code
    /// <summary>
    /// 測試方法使用者特性,加上此特性的方法參與單元測試
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class TestAttribute:Attribute
    {
        private AlertsType _alertsType; //警示類型

        /// <summary>
        ///  預設無參構造
        /// </summary>
        /// <param name="aleryType"></param>
        public TestAttribute()
        {
            _alertsType = AlertsType.Red;
        }

        /// <summary>
        /// 警示類型屬性
        /// </summary>
        public AlertsType IsAlertType
        {
            get { return _alertsType; }
            set { _alertsType = value; }
        }

    }

在需要測試的項目引用:AssionUnit.Framework
測試類別和方法上加上相應的特性:Code
 /// <summary>
    /// 用於測試 BasicModule類
    /// </summary>
    [TestClass]
    public class BasicModuleTest
    {
        /// <summary>
        /// 測試Add方法
        /// </summary>
        [Test(IsAlertType=AlertsType.Red)]
        public void Add()
        {
            BasicModule bm = new BasicModule();
            int result = bm.Add(1, 2);
            Assert.AreEqual(result, 3);
        }

        /// <summary>
        /// 
        /// </summary>
        [Test(IsAlertType=AlertsType.Yellow)]
        public void Add2()
        {

        }
    }

現在 Assert.AreEqual 這塊斷言還沒想好怎麼實現比較好,現在打算是用異常處理。

用戶端載入程式集的代碼有寫了(不過程式集會獨享,不知道用AppDoMain能否解決?)

Code
   /// <summary>
        /// 綁定程式集樹控制項
        /// </summary>
        /// <param name="asserblyName">程式集路徑名</param>
        private void BindTree()
        {
            if (asserblyName.Length <= 0)
                return;

            bool IsTesting = false; //是否有測試類別和方法

            sysLeftTree.Nodes.Clear(); //先清空控制項

            Assembly asserbly = Assembly.LoadFrom(asserblyName); //反射載入程式集

            TreeNode rootNode = new TreeNode();
            rootNode.Text = asserbly.GetName().Name; //程式集顯示名稱
            rootNode.Checked = true; //選擇
            sysLeftTree.Nodes.Add(rootNode);

            Type[] types = asserbly.GetTypes(); //取得所有類型數組
            
            //迴圈所有類
            for (int i = 0; i < types.Length; i++)
            {
                TestClassAttribute testClass = IsCustomerAttribute.GetTestClassAttribute(types[i]); //查詢特性

                //如果有測試類別特性
                if (testClass != null)
                {
                    TreeNode twoNode = new TreeNode();
                    twoNode.Text = types[i].Name; //類名稱
                    twoNode.Checked = true;
                    rootNode.Nodes.Add(twoNode);

                    MethodInfo[] methods = types[i].GetMethods(); //取得所有方法數組

                    //迴圈所有方法
                    for (int m = 0; m < methods.Length; m++)
                    {
                        TestAttribute test = IsCustomerAttribute.GetTestAttribute(methods[m]); //查詢特性

                        //如果有測試方法特性
                        if (test != null)
                        {
                            TreeNode threeNode = new TreeNode();
                            threeNode.Text = methods[m].Name; //方法名稱

                            //如果為黃牌顯示黃色
                            if (test.IsAlertType == AlertsType.Yellow)
                                threeNode.ForeColor = Color.Yellow;
                            threeNode.Checked = true; //預設選中
                            twoNode.Nodes.Add(threeNode);

                            IsTesting = true; //有測試方法,設為true
                        }
                    }
                }
            }

            sysLeftTree.ExpandAll(); //展開所有子樹節點

            //如果沒有測試方法,清除所有節點
            if (!IsTesting)
                sysLeftTree.Nodes.Clear();
            
        }

最後發一張工具UI的圖:

最後說一下,我發這貼子的目的是歡迎大家給我一些想法、建議、意見、批評、指教、謾罵、打擊、嘲笑、諷刺……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.