基于如下的几个理由,需要为应用程序提供多个版本:
1:应用程序有体验版和完整功能版;
2:应用程序测试过程中需要完成一些自动化的操作;
1:提供体验版
关于第一点,所谓体验版也就是完整版的一个缩小版。即出于某种理由,不对用户开放应用程序的全部功能。
假设我的应用程序共有两类功能。第一类功能属于单机版,而完整版还提供在线功能。那么,在功能上,我需要定制两个属性"ONLINE"和"OFFLINE"。在体验版中,我只开放"OFFLINE"功能。
要实现此目的,我不想提供两套应用程序,而是想通过最小设置,就能为一个应用程序输出两个发布版本。这个时候,就需要.NET中的特性Attribute了。
首先,我们模拟离线和在线两个功能:
{
[Conditional("OFFLINE")]
[Conditional("ONLINE")]
public static void Testing() { System.Windows.Forms.MessageBox.Show("offline game..."); }
[Conditional("ONLINE")]
public static void GetInfoFromNet() { System.Windows.Forms.MessageBox.Show("online game..."); }
}
程序入口:
{
MyService.Testing();
}
private void button2_Click(object sender, EventArgs e)
{
MyService.GetInfoFromNet();
}
要实现两个不同的功能,则需要在程序入口这个文件中定义:
//#define OFFLINE
using System;
using System.Collections.Generic;
using System.ComponentModel;
1.1:全局宏定义
记住,这个定义一定要在文件的最开头处。同时,该定义只对本文件有效,如果想定义全局,必须在项目属性中定义,如下:
如果想定义多个全局宏定义,则用逗号隔开,如"LUMINJI,HUCHANGJUN"。
接下来的问题,就比较简单了,如果要发布全功能,就#define ONLINE,如果要发布离线版功能,就注释掉#define ONLINE,然后定义OFFLINE就行了。
2:为测试过程提供自动化操作
在测试UI的时候,需要操作各类文本框、列表等控件。举个简单的例子来说,一个登录窗口,需要输入用户名和密码。如果每次我测试的时候,都要让我自己来输入,势必影响效率。这个时候,就可以让Attribute来发挥作用了。
在如下示例中,在登录窗口的Load事件中,我们为用户名和密码赋值,并模拟点击Click事件。
using System;
……
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);
});
Thread.Sleep(1000);
});
t.IsBackground = true;
t.Start();
}
记住,在提交代码的时候,可以注释掉TESTAUTO宏定义,这样,既不会影响到最终的版本,也能让自己在本机得到最大的*度。从另一个角度来说,整个项目组可提前协调好,可以让这些测试方法共有。
3:关于测试多说一点:
提供一个思路:这个特性也可以让我们从程序员的角度来完成部分测试用例的编写及测试。
后记:
对于Attribute的基础介绍,本文不再阐述,除MSDN外,还可以参考下文(个人感觉这两篇已经写的非常好):
http://blog.csdn.net/fantasiax/archive/2007/05/28/1627694.aspx
http://blog.csdn.net/fantasiax/archive/2007/06/04/1636913.aspx
本文的测试代码下载:http://download.csdn.net/source/2868666