一篇03年关于自动化框架的文章

上一篇 / 下一篇  2008-10-31 13:31:30 / 个人分类:自动化测试框架

  ---转载别人的一篇2003年的文章,使用Reflection进行的自动化。看了比较有感触,这应该是所谓的第二代测试框架,确实层次上挺混乱的,维护难度也较大,可用性不如现在的框架。不过至少是一种解决方法。

 

VS .NET建立UI自动测试工具

 

摘要:.NET框架组件为简单快速地建立用户界面测试自动化程序提供了一条令人惊奇的新途径。通过使用System.ReflectionSystem.Threading名字空间中的对象,你可以在几分钟内写好自动化测试程序。本文介绍了一个典型的基于Windows的应用程序,它将作为测试对象。接着建立了基于C#的测试工具,它模拟点击测试应用程序的UI控件并检查应用程序的状态。在工具建立后,仔细解释了它是怎样工作的,这样你就能在自己的应用中修改并扩充它。

  如果你试图写一个用户界面自动化测试程序,你会发现要化很长的时间并且很棘手。通过使用Reflection.NET框架组件中的ThreadPool对象,你能简单快速地编写强大的用户界面测试自动化程序。本文将介绍一个小的简单的基于Windows的应用程序的建立,强大的测试工具将演示这些.NET特性。

  问题

  假设你正在开发的Windows应用程序有标准的用户界面。Visual Studio .NET.NET框架组件使建立按钮、菜单项和所有其它控件很简单。当然,在开发工作中你会通过检测代码中的基本功能对用户界面执行隐含的手工测试。但是假定你希望建立一个自动化的测试,它将把检查用户界面做得更全面。如果你的产品设计是稳定的,并且你有很多时间和资源,解决的方法可能是购买专门的用户界面测试软件。虽然目前有几款好的工具,但是它们都有缺点。它们相对较贵,通常使用专有的脚本语言,并且如果产品变化很大将需要花费很长时间重作脚本。由于这些原因,该方法在很多开发环境中是不适用的,必须有更好的作UI测试自动化的途径。

  有了这种想法后,我开始建立一个UI测试自动化工具,它允许你在15分钟内、使用少于1页的代码建立一个测试脚本,可给新测试员使用,并且仅仅使用了.NET的功能,没有外部依赖。

  在做了一些试验后我发现.NET实际上提供了建立用户界面测试自动化程序的资源,它符合所有的三个设计目标。由于解决方案实现快速,你能在产品设计经常变化的情况下建立测试自动化程序;由于解决方案容易理解,与你一起工作的人能够使用很少的时间维护测试自动化代码;由于解决方案只使用了.NET代码,没有其它的外部依赖打断测试自动化过程。

  应用程序

  我们将建立一个简单的应用程序作为测试的基础。启动Visual Studio .NET并建立一个叫做MyWinAppC# Windows项目。从工具箱中添加三个按钮控件,一个文本框和一个列表框。所有控件的属性都不修改(见图1)。

  

  图1.一个简单的应用程序

  双击button1为该按钮记录一个事件处理程序并添加下面的代码,它在textBox1中显示"Hello World"

private void button1_Click(object sender, System.EventArgs e)

{

 textBox1.Text = "Hello World";

}

你可以看到,button1_Click有两个参数。这些参数很重要,在我编写测试自动化它们模拟点击按钮。Sender参数是产生相关事件的对象--在这种情况下是button1EventArgs参数是相关事件的附加信息。在按钮点击的情况下,没有必要的附加信息。

双击button2并添加下面的代码,它在listBox1中显示两行消息:

private void button2_Click(object sender,

 System.EventArgs e)

{

 listBox1.Items.Add("Goodbye World");

 listBox1.Items.Add("Come back again!");

}

观察操作listBox1字段包含调用一个属性(Items)上的方法(Add)。当自动化时,我需要访问这些字段、属性和方法。

最后,双击button3并添加下面的代码,它删除textBox1listBox1中的任何消息:

private void button3_Click(object sender,

 System.EventArgs e)

{

 textBox1.Text = "";

 listBox1.Items.Clear();

}

建立并运行该应用程序。该应用程序有不同的状态。初始状态是{textBox1 = "textBox1", listBox1 = (empty)},图2中的状态是{textBox1 = "Hello World", listBox1 = "Goodbye World / Come back again"}。当我编写测试自动化时,我必须能够检查状态。

  

  图2.点击button2的状态

  解决方案

现在我们建立一个简单但是强大的自动化测试工具,它模拟点击MyWinApp上的按钮,接着检查按钮的状态。启动Visual Studio .NET的一个新的实例,建立一个叫做MyWinAppTesterC# Windows应用程序。使用工具箱,添加三个按钮控件和两个文本框控件。把button1button2button3text属性相应设置为LaunchAppInvoke MethodRun Test

这个用用户界面测试自动化程序的关键在System.ReflectionSystem.Threading名字空间。在代码视图中添加下面两条语句(前六条是Visual Studio .NET生成的):

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

 

using System.Reflection;

using System.Threading;

下面实现测试工具的核心。在项目的Main方法中添加图3所示的代码。在我解释这段代码前,先使测试自动化程序工作起来。双击LaunchApp按钮控件进入它的点击事件,并且双击Invoke MethodRun Test按钮。把图4中的代码添加到点击事件中。你需要在button1_Click中把MyWinApp.exe的路径修改为本机的路径。

Assembly testAssembly = null;

Form testForm = null;

BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic |

                    BindingFlags.Static | BindingFlags.Instance;

 

static void RunApp(object state) //需要这个函数传递进来WaitCallBack()

{

 Application.Run((Form)state);

}

 

private void InvokeMethod(Form form, string methodName,

                         params object[] parms)

{

 EventHandler eh = (EventHandler)Delegate.CreateDelegate(typeof

                   (EventHandler), form, methodName);

 if (eh != null)

 {

   form.Invoke(eh, parms);

 }

}

 

private object GetField(object obj, string fieldName)

{

 Type t = obj.GetType();

 FieldInfo fi = t.GetField(fieldName, flags);

 return fi.GetValue(obj);

}

 

private object GetProperty(object obj, string propertyName)

{

 Type t = obj.GetType();

 PropertyInfo pi = t.GetProperty(propertyName, flags);

 return pi.GetValue(obj, new object[0]);

}

  图3.测试工具核心的方法和对象

//载入MyWinApp

private void button1_Click(object sender, System.EventArgs e)

{

 testAssembly = Assembly.LoadFrom("C:\\MSDN\\MyWinApp\\bin\\Debug\\MyWinApp.exe");

 Type t = testAssembly.GetType("MyWinApp.Form1");

 testForm = (Form)testAssembly.CreateInstance(t.FullName);

 ThreadPool.QueueUserWorkItem(new WaitCallback(RunApp), testForm);

}

 

//调用方法

private void button2_Click(object sender, System.EventArgs e)

{

 object[] p = {this, new EventArgs()};

 string meth = this.textBox1.Text.ToString();

 InvokeMethod(testForm, meth, p);

}

 

TAG: 自动化测试框架

 

评分:0

我来说两句