C#借助Code UI Automation脱离VS黑盒自动化测试工具编写

简介:

本文摘要:

1:测试要求

2:在VS中运行自动化测试

3:脱离VS进行自动化测试

在上一文中《C#借助API实现黑盒自动化测试工具的编写》(http://www.cnblogs.com/luminji/archive/2010/11/03/1867730.html),我们使用WINDOWS API来实现自动化测试工具的编写。但是,这种办法在大型软件测试的时候,需要很细致和繁杂的工作。在VS2010出来以后,我们不妨看看Code UI Automation这个好东西。关于Code UI Automation已经有人介绍过很多,本文要说明的重点如下:

1:使用Code UI Automation来录制手工操作UI的动作,让VS根据这些操作自动生成测试代码;

2:新建WINFORM项目(也即黑盒工具),在这个WINFORM项目调用这些自动生成的代码;

上文提到的1,之所以要让VS自动生成代码,是为了免去我们手动编写测试代码的繁杂工作。上文提到的2,是为了可以让我们的测试工具脱离VS。

本文代码下载:http://download.csdn.net/source/2839416

一:测试要求

测试的要求仍旧如下,假设存在这样一个应用程序:

1:提供一个WINFORM窗体,上面存在一个TextBox,以及一个Button;

2:点击Button,会弹出提示框,提示框内容为TextBox的值;

现在,测试要求如下:

1:在300台机器上运行上面的程序;

2:到这300台机器上去点击这个Button,看看上文中的功能2有没有实现;

二:在VS中运行自动化测试

为了说明这个例子,我们创建了解决方案WindowsFormsApplicationTest,该解决方案共分为三个项目:

  1. WindowsFormsToBeTest,被测试的应用程序;
  2. TestProject1,VS2010的测试项目(使用.NET FRAMEWORK4);
  3. WindowsFormsTester,要编写的黑盒工具,也是一个WINFORM;

假设WindowsFormsToBeTest已经编写完毕,运行之。现在使用TestProject1中的Code UI Automation(新建"编码的UI测试")来录制操作(操作过程为:在WindowsFormsToBeTest的文本框中输入"ABC",点击Button,弹出提示,点击确定),然后生成代码,如下图:

 

找到生成的代码中公开的测试方法:

[TestMethod]

public void CodedUITestMethod1()

{

this.UIMap.RecordedMethod1();

}

其实,通过查看this.UIMap.RecordedMethod1()这个方法,VS也是调用WINDOWS API来实现获取各类控件的句柄。这个时候,如果我们在VS的测试列表编辑器中运行这个选中的测试CASE,

就会发现VS自动为我们复现了一个完整的录制过程中的操作。如下:

三:脱离VS运行自动化测试

接下来的工作是需要在我们自己的应用程序WindowsFormsTester中运行这个测试。

3.1:首先,我们需要在WindowsFormsTester中引用这些DLL:

它们应该是在一个类似如下的文件夹下,D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies。如果不引用这些文件,编译会通过,但是运行时会报类似如下的错误:未能加载文件或程序集"Microsoft.VisualStudio.TestTools.UITest.Extension.IE.Communication.Interop, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"或它的某一个依赖项。系统找不到指定的文件。

3.2:在TestProject1中提供一个类来提供一个静态方法,如下:

public class TestInit

{

public static void Init()

{

Playback.Initialize();

}

        public static void CleanUP()
        {
            Playback.Cleanup();
        }
 

}

要注意,这点很重要,必须运行Playback.Initialize(),不然你自己的应用程序获取的句柄全部都是无效的。 另外,需要注意Cleanup这个函数。在每一次退出测试的时候,我们需要执行Cleanup()。

3.3:现在,可以在WindowsFormsTester调用TestProject1中的公开方法了,如下:

TestInit.Init();

CodedUITest1 c = new CodedUITest1();

c.CodedUITestMethod1();

TestInit.Cleanup();

这样,我们便完成了一个脱离了VS的黑盒自动化测试工具WindowsFormsTester。

借助Code UI Automation的自动生成代码,使我们繁杂而细致的测试代码编写工作交给VS的测试引擎去实现,我们可以更多的将细节放在测试的业务逻辑上,而不是努力地去获取各种控件的句柄并操作他们。

参考:

http://blog.csdn.net/quicknet/archive/2010/11/21/6025824.aspx

http://blog.csdn.net/quicknet/archive/2010/11/24/6032674.aspx

      理论上讲,在VS集成环境中能够执行的测试代码,在一般的程序代码中也是可以执行的,这里问题的关键在于,是否在你自己的程序中配置好了CUIT测试执行的环境, 即CUIT回放执行引擎是否正确启动了。当使用VS的CUIT工程时,每个测试类都被标识了[CodedUITest],当VS的Mstest测试引擎在执行每个测试用例的时候,它会自动读取测试所配置的属性,以判断测试的类型,当它看到是CodedUITest后,它会自动初始化CUIT的底层回放(Playback)执行引擎,让后执行该测试用例。

      在你的程序中是没有办法直接使用CodedUIAttribute和Mstest,这就需要Playback.Initialize()/Playback.Cleanup()这两个函数来帮助你完成启动初始化CUIT的底层回放执行引擎的工作,否则你的程序中无法直接应用CUIT类库中函数的。其实,不只是在非VS CUIT测试环境中调用CUIT函数需要显式调用Playback.Initilize/Cleanup,在CUIT的TestMethod外部调用任何Microsoft.VisualStudio.TeamTest.UITesting名字空间下的任何函数时,都需要这样显式地进行一下初始化和清理工作。VS Test Team的Gautam在的博文 How To : Get UITesting methods working outside the TestMethod of Coded UI Test进行了介绍。

      除了上面的函数,CUIT还有其它一些很有用的函数,例如:UITestControl.DrawHighlight() ,它可以在控件的边界上画出一个蓝色的边框并保持7秒钟 (这是时间长度是不可配置的),这在调试或者诊断问题的时候可以帮你判断所要的找的控件是否被成功地定位到了。

      还有UITestControl.CaptureImage() 和 UITestControl.Desktop.CaptureImage() ,它们可以用来获取控件和整个屏幕的截屏,这些截屏在测试失败的时候是非常有用的,可以帮助快速分析和定位测试失败的原因,特别是在问题出现具有一定随机性不易Repro的情况下,错误现场的图片对于分析问题至关重要。


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2010/11/18/1880452.html,如需转载请自行联系原作者

相关文章
|
15天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
29 3
|
1月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
52 3
|
24天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
132 64
|
7天前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
9天前
2025电气自动化与电机系统国际学术会议(EAMS 2025) 2025 International Conference on Electrical Automation and Motor System
2025电气自动化与电机系统国际学术会议(EAMS 2025) 2025 International Conference on Electrical Automation and Motor System
29 7
|
5天前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
6天前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
10 2
|
8天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
29 4
|
9天前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
20天前
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
45 7