*引言:最近做單元測試,突然有一股衝動,想要自己做一套單元測試的架構。這個人就是只要有想法就要去做(多數都做了一半)。
首先整理一下思路,我的想法是:
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的圖:
最後說一下,我發這貼子的目的是歡迎大家給我一些想法、建議、意見、批評、指教、謾罵、打擊、嘲笑、諷刺……