天天看點

C#特性Attribute的實際應用之:為應用程式提供多個版本1:提供體驗版1.1:全局宏定義2:為測試過程提供自動化操作3:關于測試多說一點:

基于如下的幾個理由,需要為應用程式提供多個版本:

1:應用程式有體驗版和完整功能版;

2:應用程式測試過程中需要完成一些自動化的操作;

關于第一點,所謂體驗版也就是完整版的一個縮小版。即出于某種理由,不對使用者開放應用程式的全部功能。

假設我的應用程式共有兩類功能。第一類功能屬于單機版,而完整版還提供線上功能。那麼,在功能上,我需要定制兩個屬性"ONLINE"和"OFFLINE"。在體驗版中,我隻開放"OFFLINE"功能。

要實作此目的,我不想提供兩套應用程式,而是想通過最小設定,就能為一個應用程式輸出兩個釋出版本。這個時候,就需要.NET中的特性Attribute了。

首先,我們模拟離線和線上兩個功能:

<a></a>

代碼

class MyService

{

[Conditional("OFFLINE")]

[Conditional("ONLINE")]

public static void Testing() { System.Windows.Forms.MessageBox.Show("offline game..."); }

public static void GetInfoFromNet() { System.Windows.Forms.MessageBox.Show("online game..."); }

}

程式入口:

private void button1_Click(object sender, EventArgs e)

MyService.Testing();

private void button2_Click(object sender, EventArgs e)

MyService.GetInfoFromNet();

要實作兩個不同的功能,則需要在程式入口這個檔案中定義:

#define ONLINE

//#define OFFLINE

using System;

using System.Collections.Generic;

using System.ComponentModel;

記住,這個定義一定要在檔案的最開頭處。同時,該定義隻對本檔案有效,如果想定義全局,必須在項目屬性中定義,如下:

如果想定義多個全局宏定義,則用逗号隔開,如"LUMINJI,HUCHANGJUN"。

接下來的問題,就比較簡單了,如果要釋出全功能,就#define ONLINE,如果要釋出離線版功能,就注釋掉#define ONLINE,然後定義OFFLINE就行了。

在測試UI的時候,需要操作各類文本框、清單等控件。舉個簡單的例子來說,一個登入視窗,需要輸入使用者名和密碼。如果每次我測試的時候,都要讓我自己來輸入,勢必影響效率。這個時候,就可以讓Attribute來發揮作用了。

在如下示例中,在登入視窗的Load事件中,我們為使用者名和密碼指派,并模拟點選Click事件。

#define TESTAUTO

……

public Form1()

InitializeComponent();

this.Load += delegate

TestAuto();

};

[Conditional("TESTAUTO")]

private void TestAuto()

Thread t = new Thread((ThreadStart)delegate

Thread.Sleep(1000);

this.Invoke((MethodInvoker)delegate

this.textBox1.Text = "luminji";

this.textBox2.Text = "123";

button3_Click(this, null);

});

t.IsBackground = true;

t.Start();

記住,在送出代碼的時候,可以注釋掉TESTAUTO宏定義,這樣,既不會影響到最終的版本,也能讓自己在本機得到最大的自由度。從另一個角度來說,整個項目組可提前協調好,可以讓這些測試方法共有。

提供一個思路:這個特性也可以讓我們從程式員的角度來完成部分測試用例的編寫及測試。

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2010/11/30/1891692.html,如需轉載請自行聯系原作者

繼續閱讀