`

C#实现自动化测试架构

 
阅读更多

特性会作为元数据嵌入到程序集(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

      很多优秀的架构其基本原理很相似,无非是在易用性和用户习惯或者考虑到成本等问题上增加或者裁减了某些特性功能。例如VS单元测试功能,LEAF,Nuint。这个自动化测试架构应该和NUint框架是一致的。另外VS中已经集成了单元测试的控件。
基本实现原理跟这个差不多少参看链接:http://hi.baidu.com/widebright/blog/item/04759058143725db9c82041b.html
利用.net自定义特性实现元数据扩展,可以为我们设计架构时添加新的思路和解决方法,不过读取元数据必将牵涉到反射机制而反射机制性能比较低。
有关于反射相关信息参考以前写的笔迹和以下连接
http://msdn.microsoft.com/zh-cn/library/f7ykdhsy(v=VS.80).aspx
原文链接:
http://www.cnblogs.com/salomon/archive/2012/05/30/2526746.html
==============================================================================
C# WEB 自动化测试用例:
http://bbs.csdn.net/topics/380132721
 
分享到:
评论

相关推荐

    C#模拟实现自动化测试架构

    一个简单的自动化测试架构的实现(C#).属性会作为元数据嵌入到程序集,通过反射机制能够得到这些元数据信息。程序员可以自己定义属性,对属性进行某种格式的定义,并利用属性来影响自己编写代码编译后的程序集...

    基于C#UI Automation自动化测试自动化测试示例工程

    "基于C# UI Automation自动化测试自动化测试示例工程" 是一个使用C#编程语言构建的项目,其核心目标是实现UI(用户界面)自动化测试。UI Automation是.NET Framework提供的一种用于测试Windows应用程序用户界面的...

    自动化测试框架

    ### 自动化测试框架 #### 涉及技术的简介 在现代软件开发过程中,自动化测试已成为确保软件质量的关键组成部分。本文将详细介绍一种基于CODEUI的自动化测试框架的设计与实现,该框架采用文本模板引擎(T4)来生成...

    C#操作Selenium自动化测试,采集数据实例源码。

    Selenium WebDriver是一个开放源码的自动化测试框架,它允许开发者模拟用户与浏览器的交互,从而实现对网页的自动化控制。Selenium支持Chrome、Firefox、IE等多种浏览器,并且可以通过不同编程语言的绑定来编写测试...

    C#借助Code UI Automation实现黑盒自动化测试工具

    C#作为.NET框架的主要编程语言,提供了丰富的工具和库来支持自动化测试,其中包括Code UI Automation。本篇将深入探讨如何利用Code UI Automation实现黑盒自动化测试工具,并结合一个名为...

    web自动化测试

    Selenium是一个强大的开源自动化测试框架,支持多种编程语言,包括C#,用于模拟用户与浏览器的交互。 在描述中提到,这个例子涉及到Google翻译界面的自动化测试。Google翻译是一个实时翻译服务,可能涉及到复杂的...

    面向对象自动化测试框架的研究与设计

    文章基于单元测试框架JUnit,并结合.NET Framework(#.NET)的特点,提出了一种适用于#.NET架构的自动化测试框架,不仅能够支持单元回归测试,还能支持XML文件的测试,并且测试结果以HTML格式存储以便于查看。...

    WebUI自动化测试框架

    1. Selenium:全球最广泛使用的WebUI自动化测试框架,支持多种编程语言如Java、Python、C#等,兼容多种浏览器。 2. Appium:基于Selenium,支持移动应用的自动化测试,包括iOS和Android。 3. Cypress:提供实时反馈...

    零成本实现Web自动化测试

    首先,Selenium是一个广泛使用的Web自动化测试框架,它支持多种编程语言,如Java、Python、C#等。Selenium的核心组件是WebDriver,它允许开发者模拟用户与浏览器的交互,例如点击按钮、填写表单、执行JavaScript等。...

    高效自动化测试平台入门到精通

    6. 集成与持续测试:学习如何将自动化测试平台与版本控制系统(如Git)、构建工具(如Maven或Gradle)以及CI/CD工具(如Jenkins或Travis CI)集成,实现测试的自动化执行。 7. 报告与可视化:理解如何生成详尽的...

    自动化测试练习源代码.zip

    自动化测试是使用特定的工具或框架来执行预先编写好的测试脚本,以替代手动测试。它的核心目标是减少重复劳动,提高测试覆盖率和速度。自动化测试通常包括单元测试、集成测试和系统测试。 2. 单元测试: 单元测试...

    WhiteCore自动化测试代码

    TestStack.White库是实现这一目标的核心工具,它是一个强大的Windows UI自动化框架,能够帮助开发者编写针对桌面应用的自动化测试用例。 1. **WhiteCore介绍** WhiteCore是TestStack.White的核心组件,提供了与...

    Web 自动化测试架构设计与实现

    ### Web 自动化测试架构设计与实现 #### 一、引言 随着互联网技术的快速发展,Web 应用系统的复杂度日益增加,这对软件的质量保证提出了更高的要求。为应对不断变化的需求,敏捷软件开发方法逐渐成为主流。在敏捷...

    自动化测试书

    Selenium是一款强大的开源Web应用程序自动化测试工具,广泛应用于各种浏览器和操作系统环境,能够支持多种编程语言,如Java、Python、C#等。本书深入浅出地讲解了Selenium的核心概念、功能以及实际应用技巧,是自动...

    [零成本实现Web自动化测试-基于Selenium和Bromine].温素剑.扫描版

    《零成本实现Web自动化测试-基于Selenium和Bromine》是温素剑撰写的一本技术书籍,专注于介绍如何在不产生额外费用的情况下,利用开源工具进行高效的Web自动化测试。书中的内容涵盖了一系列与Web自动化测试相关的...

    基于python+pytest+Selenium+allure,完成web自动化测试框架的搭建.zip

    基于python+pytest+Selenium+allure,完成web自动化测试框架的搭建,并可以在jenkins上持续集成,应用于课堂派web自动化测试项目中,取得良好效果 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发...

    C#压力测试程序,测试完毕后能够自动生成测试报表

    综上所述,这套C#压力测试程序不仅实现了对Web项目的压力测试,还具备了自动化生成测试报表的能力,这对于软件开发团队来说是十分有价值的工具。通过理解和应用这些知识点,开发者可以更有效地评估和优化他们的系统...

    全网最全Appium自动化测试教程,一篇就够了

    Appium是开源的、跨平台的测试自动化测试框架; 主要用于测试移动端应用; Appium支持模拟器和真机上的原生应用、混合应用、Web应用; Appium使用WebDriver的JSON wire协议来驱动Apple系统的UI Automator库、Android...

Global site tag (gtag.js) - Google Analytics