特性会作为元数据嵌入到程序集(assmbly),通过反射机制能够得到这些元数据信息。程序员可以自己定义特性,对特性进行某种格式的定义,在编译时作为元数据被编译到程序集中,运行时通过反射机制被读取。这应该是这个自动化测试架构的立足点。
该框架定义了[ClassInitiative][ClassCleanup][TestMethod]等特性以标记测试函数,而[TestMethod]中还可以定义一些特性参数[TestProperty]去将testmethod分类。在运行时要从待测程序集(dll)中读取相应函数,并保证不同函数的运行顺序。该框架有一系列函数来完成这项工作,这些函数负责运行待测程序集中特定特性标记所标记的函数。如InvokeInitiative()运行标记有[ClassInitiative]的函数;InvokeTestMethod()运行标记[TestMethod]的函数,并用这个InvokeXXX()函数调用先后顺序保证这几种特性函数运行顺序。而这几个InvokeXXX函数中利用反射机制去筛选相应的函数去运行。其中InvokeTestMethod()应该有参数,通过主函数的开关传入,以筛选特定特性的方法。
namespace AttributesClass { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassCleanupAttribute:Attribute { public ClassCleanupAttribute() { } } } namespace AttributesClass { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class ClassInitializeAttribute:Attribute { public ClassInitializeAttribute() { } } } namespace AttributesClass { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class DescriptionAttribute:Attribute { private string description; public string Description { get { return this.description; } set { this.description = value; } } public DescriptionAttribute(string text) { this.description = text; } } } namespace AttributesClass { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class PriorityAttribute:Attribute { private int priorityLevel; public int Level { get { return this.priorityLevel; } set { this.priorityLevel = value; } } public PriorityAttribute(int level) { this.priorityLevel = level; } } } namespace AttributesClass { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class TestPropertyAttribute:Attribute { #region Fileds private string propertyName = null; private string propertyValue = null; #endregion #region Proerties public string Name { get { return this.propertyName; } set { this.propertyName = value; } } public string Value { get { return this.propertyValue; } set { this.propertyValue = value;} } #endregion #region Constructors public TestPropertyAttribute(string strPropertyName, string strPropertyValue) { this.propertyName = strPropertyName; this.propertyValue = strPropertyValue; } #endregion } }
RunTest函数是重中之重。它完成功能如下:
查找TestProperty限定的方法,找到后查找所在类是否有ClassInitialize和ClassCleanup方法,如果有则先执行前者然后执行该方法最后执行后者。
public void RunTest(string name, string value) { List<string> selectedMethods = SearchMethodByTestProperty(name, value); foreach (string method in selectedMethods) { string[] strSplitMethod = method.Split('.'); string nameSpaceName = strSplitMethod[0]; string className = strSplitMethod[1]; string methodName = strSplitMethod[2]; Console.WriteLine(nameSpaceName + '.' + className); Console.WriteLine("-------------------------------------------------------"); Type typeClass = assmeblyObject.GetType(nameSpaceName + '.' + className); MethodInfo testMethod = typeClass.GetMethod(methodName); object classObject = assmeblyObject.CreateInstance(nameSpaceName+'.'+className); MethodInfo[] methodArray = typeClass.GetMethods(); foreach (MethodInfo objMethod in methodArray) { object[] classInitializeAttributes = objMethod.GetCustomAttributes(typeof(AttributesClass.ClassInitializeAttribute), true); if (classInitializeAttributes.Length == 1) { Console.WriteLine("You are invoking the classInitialize method..."); Console.WriteLine(objMethod.Name + @"() "); objMethod.Invoke(classObject, null); //InvokeIntialize(classObject, objMethod); } } //InvokeTestMethod(classObject, method); Console.WriteLine("You are invoking the Select method..."); Console.WriteLine(methodName + @"() "); testMethod.Invoke(classObject, null); foreach (MethodInfo objMethod in methodArray) { object[] classCleanupAttributes = objMethod.GetCustomAttributes(typeof(AttributesClass.ClassCleanupAttribute), true); if (classCleanupAttributes.Length == 1) { //InvokeCleanup(classObject, objMethod); Console.WriteLine("You are invoking the classCleanup method..."); Console.WriteLine(objMethod.Name + @"() "); objMethod.Invoke(classObject, null); } } Console.WriteLine(""); } }
模拟实现架构代码笔记:
1. 特性定义应该为public Sealed 以避免继承和便于命名空间外的类或函数调用(自定义特性通常情况下很少被继承,并且定义好的特性大多数情况下还是命名空间外引用的)
2. 定义特性时应该使用[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]来指定该特性是用于标记方法,类还是成员变量特性的。
3. 别调用的测试类DemoTest由于会被主调用函数调用也应该声明为public。
4. 约定测试程序集里所有方法种类一致便于管理.(倘若测试Assmbly里既有静态方法又有非静态方法的话,那么在主调用函数反射时必须考虑到不同种类的方法,invoke 时的不同,非静态方法必须得先实例化才能invoke)
5. 该架构里所有方法都是非静态的,主调用函数实现非静态方法必须得先实例化一个类,显然比较麻烦。 为什么不写成非静态的呢。(因为倘若用到某个类中的方法,必须默认得去调用Initialize和Cleanup函数[如果这些函数存在的话],如果用静态方法的话就必须的自己去判定查找调用这些方法,显然实现起来比较麻烦)
不足:
1 并没有完成对多限定条件下的查询方法
2 目前为止所有的测试方法必须不包含参数(包含参数的方法很容易实现,可以考虑在运行时XML传递参数)
3 PropertyDemoTest类结构不太清晰,可以考虑重构一下
4 可以增加更多的自定义特性完成更为复杂的操作
由于只是简单模拟框架,实现功能较为简单,更为复杂的功能可以以后再加,这个架构最大的好处是耦合度小,可扩展性强。
全部源码可去csdn下载,连接:http://download.csdn.net/detail/fl815824/4340631
http://msdn.microsoft.com/zh-cn/library/f7ykdhsy(v=VS.80).aspx
http://www.cnblogs.com/salomon/archive/2012/05/30/2526746.html
==============================================================================
http://bbs.csdn.net/topics/380132721
相关推荐
一个简单的自动化测试架构的实现(C#).属性会作为元数据嵌入到程序集,通过反射机制能够得到这些元数据信息。程序员可以自己定义属性,对属性进行某种格式的定义,并利用属性来影响自己编写代码编译后的程序集...
基于C#和XML的自动化测试框架系统的设计 很好的书!
基于CODEUI的自动化测试框架设计,采用文本模板引擎生成相关代码
C#版的自动化测试平台,参考HW测试与装备部的ATE V3平台,用了10余年平台,离职后还挺怀念,随用C#模仿开发了一个类似的框架。大概思路是界面框架只负责显示,调用dll,保存记录。用户只需开发测试dll即可,一个测试...
目前市场上成熟的Web自动化测试框架有不少,很出名的是Watir,是用现在大名鼎鼎的Ruby写成的,相对于Watir,有一个也很不错的.net版本,就是WatiN,WatiN可以说是市面上可以找到的最好的C#Web自动化测试框架。...
WhiteCore自动化测试代码,主要是用C#对各种Win32程序进行测试
传统的自动化测试更关注产品UI 层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段(层 次)都需要自动化测试。 相信测试同学对上面的金字塔并不陌生,这个就是产品开发各个同阶段所对应的测试!随然这个...
基于Selenium WebDriver的C#/.NET Web测试自动化全功能框架
NET Web UI测试自动化全功能框架。 它使用流利的页面对象模式。 支持.NET Framework 4.0+和.NET Core / Standard 2.0+。 产品特点 WebDriver 。 基于并保留其所有功能。 页面对象模型。 提供易于实现和维护的独特...
ranorex自动化测试框架简介 主要内容:Ranorex简介其他测试框架比较工具界面介绍脚本开发框架开发实例小结Q&A23一款用c#开发的自动化
Web UI自动化测试框架是由Microsoft Visual Studio Community 2017版本15.9.19的免费版本开发的。 已安装的NuGet: Selenium.WebDriver 3.12.0 Selenium.Support 3.12.0 SpecFlow 3.1.82 NUnit3TestAdapter ...
翻看自己以前写的代码,突然间看到以前模拟的一个自动化测试架构的实现。幸好自己有写学习笔记的习惯,整理一下,贴出来,以备忘。特性会作为元数据嵌入到程序集,通过反射机制能够得到这些元数据信息。程序员可以...
Selenium-Herokuapp框架具有C#.NET Core Selenium自动化测试框架的存储库,该框架旨在测试网站。 选择该受测网站,或以其他方式更普遍地称为受测系统(SUT),是为了精选健康的网页,这些网页的设计目的是。 该框架...
本课程是分布式集群自动化测试高阶框架的基础实战课。课程内容是基于CI/CD/DevOps的核心模块进行框架的开发讲解。是DevOps发包框架高阶实战的必备知识。老师从多角度、多层次、多维度基于Demo进行迭代讲解,做到认真...
基于python+pytest+Selenium+allure,完成web自动化测试框架的搭建,并可以在jenkins上持续集成,应用于课堂派web自动化测试项目中,取得良好效果 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发...
奥卡兰巴 跨平台C#框架可使用Selenium WebDriver自动执行测试 Test Framework是在Objectivity中设计的,旨在提出人们应该如何创建Selenium WebDriver测试的通用方法。 可以在以下位置找到项目API文档: : 它提供...
◇ 具备专家级自动化测试解决方案、自动化测试平台框架设计开发、自动化测试团队管理培训经验。◇ 具备专家级的功能专项测试、性能专项测试经验及丰富的渗透测试经验。◇ 具备丰富的持续集成/持续交付(CI/CD)开发、...
本文描述了我们项目组开发的支持自动化测试的测试管理工具的结构和功能实现。关键字 自动化测试;测试管理;软件测试1 引言为了保证软件产品的质量,需要对软件过程进行控制,同时也需要对软件产品本身进行检测,...