手动用户界面测试是一种最基本的软件测试类型大多数软件工程师首次采用的就是这种测试类型与此矛盾的是自动化用户界面测试可能是编写的测试类型中最具技术挑战的一种Microsoft? NET 环境为您提供了许多编写自动用户界面测试自动化的方式一种常见而有用的方法是记录击键鼠标移动和单击然后在应用程序中回放以确保它以预期方式执行(有关这种方法的详细信息请参见 MSDN?Magazine 年 月号中 John Robbins 的 Bugslayer 专栏这一期 MSDN Magazine 的 Paul DiLascia 专栏也阐释了如何使用 NET 将这种类型的输入发送到另一个应用程序中)在本月的专栏中我将探讨为 NET 应用程序编写轻量级 UI 测试自动化的另一种方法
最好的方式是以一个屏幕快照开始进行讨论图 显示我有一个虚拟应用程序要进行测试它是一个颜色合成器应用程序允许用户在文本框控件中键入一种颜色然后在 Combobox 中键入或选择一种颜色单击按钮Listbox 就会显示一条消息表明两种颜色混合的结果在图 中根据应用程序红色和蓝色会产生紫色UI 测试自动化是一个控制台应用程序它启动一个待测试窗体模拟用户移动应用程序窗体定义和调整应用程序窗体的大小设置文本框和 Combobox 控件的值并单击按钮控件测试自动化检查测试应用程序的结果状态验证 Listbox 控件包含正确的消息并记录pass结果图 中的屏幕快照是在测试自动化模拟用户单击关闭测试应用程序的 File | Exit 之前捕获的
在本篇文件中我们将讨论编程人员在使用ASPNET开发应用程序时需要注意的个技巧这些技巧涉及从缺省的控件表单名的改变到StringBuilder类的使用有助于编程人员能够尽快地适应NET环境
在使用Visual Studio NET时除直接或非引用的对象外不要使用缺省的名字
NET带来的好处之一是所有的源代码和配置文件都是纯文本文件能够使用Notepad或WordPad等任意的文本编辑器进行编辑如果不愿意我们并非一定要使用Visual Studio NET作为集成开发环境但使用了Visual Studio NET我们可以在Windows文件管理器中看到文件或在Visual Studio NET之外从文本编辑器中浏览文件的内容
使用Visual Studio NET作为集成开发环境有许多好处其中最显着的好处是它极大地提高了生产效率使用Visual Studio NET我们能够在付出较小代价的情况下更快地开发软件作为集成开发环境一部分的IntelliSense提供自动的代码完成在输入方法或函数时提供动态帮助语法错误的实时提示以及其他能够提高生产效率的功能
象其他复杂的工具那样在学会如何充分发挥它的作用和掌握其习性前Visual Studio NET也会使我们产生一种挫折感有时它象一个难以了解的黑盒子会生成大量的文件和许多无用的代码
Visual Studio NET的一个功能是无论是类控件或表单中的对象它都能够为新对象提供缺省名字例如如果我们创建了一个新的ASPNET Web Application其缺省的名字将是WebApplication我们可以在新工程对话框中方便地改变该应用的名字但同时改变的只是该应用程序的名字空间的名字及其所在的虚拟目录源代码文件的缺省名字仍然是WebFormaspx和WebFormaspxcs(C#工程)或WebFormaspxvb(VBNET工程)
我们可以在方案浏览器中改变ASPX和代码使用的文件名字但Web页类的名字仍然将是WebForm如果在该Web表单上生成一个按钮其缺省的名字将是Button事实上所有控件的名字都是由控件的类型和数字组成的
我们能够也应该将应用程序中所有的表单和控件的名字都修改成有意义的名字对于较小的演示性程序而言缺省的名字还能够胜任但如果应用程序由多个表单每个表单上有许多按钮和标签时象frmStartupfrmDataEntry和frmReports这样的表单名就比FormForm和Form这样的名字更易于理解和维护
如果表单上控件要在代码的其他地方引用使它有一个有意义的名字就更重要了btnOKbtnCancel和btnPrint这样的名字使看代码的人更容易理解因而也比名字为ButtonButtonButton这样的控件更容易维护
修改一个工程中所有文件中出现的一个名字的一个好方法是在Visual Studio NET菜单中依次选择编辑>发现和替换>替换命令
在看二周前编写的代码时我们经常就象第一次见到这些代码一样因此使它们有一个有助于我们理解其含义的名字是十分有必要的
即使不使用Visual Studio NET进行编程使用代码支持文件也有利于提高应用程序的性能
在Web应用程序Web服务或Web控件等所有的ASPNET Web工程中Visual Studio NET都使用代码支持文件代码支持文件使工程具有更好的组织模块性更适合多人组成的开发团队另外它还会带来性能的提高
代码支持文件的内容被编译成一个组合文件中的类一般是一个DLL文件有时也可以是EXE文件该文件驻留在应用程序的组合体高速缓沖区中在应用程序启动时可以立即得到它
如果代码是包含在<script>标记中或ASPX文件代码中它仍然会被编译成一个Web页类在这种情况下每当该网页在应用程序对话中第一次加载时都需要重新进行编译被编译的类就会驻留在内存中每当计算机启动IIS停止重新启动或者源代码配置文件改变时该文件必须重新编译尽管不大但这样引起的性能损耗也是相当可观的
尽量减少表单回送
每当点击Web网页上的ButtonLinkButton或ImageButton控件时表单就会被发送到服务器上如果控件的AutoPostBack属性被设置为true如果CheckBoxCheckBoxList等控件的状态被改变后也会使表单会发送回服务器
每次当表单被发送回服务器就会被重新加载启动Page_Load事件执行Page_Load事件处理程序中的所有代码把网页的初始化代码放在这里是最合适不过的了我们经常会希望在每次加载网页时执行一些代码而希望只有在网页第一次加载时执行另一些代码甚至希望一些代码在除首次加载外的每次加载时执行
可以利用IsPostBack特性来完成这一功能在网页第一次加载时该属性的值是false如果网页因回送而被重新加载IsPostBack属性的值就会被设置为true通过测试可以在任意时候执行指定的代码下面是相关的C#代码
protected void Page_Load(Object sender EventArgs e)
{
// 网页每次加载时执行的一些操作
if (!IsPostBack)
{
// 网页第一次加载时执行的操作
}
else
{
// 回送时执行的操作
}
// 网页每次加载时执行的操作
}
我们希望尽量不引起回送(每次回送都会要求服务器进行一系列的操作)即使引起回送后也希望能够执行尽量少的操作大规模浪费时间的操作(例如数据库查找)尤其应当避免因为它们能够延长应用程序的响应时间
使用StringBuilder类
字符串在NET框架中是不可变的这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝这意味着性能还有提高的空间当进行大量的字符串操作时使用StringBuilder类就是一种比较好的选择了
下面的C#代码测试用二种方式从个子字符串中生成字符串所需要的时间第一次使用了一个简单的字符串串联操作第二次使用了StringBuilder类要想查看结果字符串可以去掉下面的代码中注解行的注解符号
<%@ Page Language=C# %>
<script runat=server>
void Page_Load(Object Source EventArgs E)
{
int intLimit = ;
DateTime startTime;
DateTime endTime;
TimeSpan elapsedTime;
string strSub;
string strWhole = ;
// 首先执行字符串连接操作
startTime = DateTimeNow;
for (int i=; i < intLimit; i++)
{
strSub = iToString();
strWhole = strWhole + + strSub;
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblConcatText = elapsedTimeToString();
// lblConcatStringText = strWhole;
// 使用stringBuilder类进行同样的操作
startTime = DateTimeNow;
StringBuilder sb = new StringBuilder();
for (int i=; i < intLimit; i++)
{
strSub = iToString();
sbAppend( );
sbAppend(strSub);
}
endTime = DateTimeNow;
elapsedTime = endTime startTime;
lblBuildText = elapsedTimeToString();
// lblBuildStringText = sbToString();
}
</script>
<html>
<body>
<form runat=server>
<h>String Concatenation Benchmark</h>
Concatenation:
<asp:Label
id=lblConcat
runat=server/>
<br/>
<asp:Label
id=lblConcatString
runat=server/>
<br/>
<br/>
StringBuilder:
<asp:Label
id=lblBuild
runat=server/>
<