zoukankan      html  css  js  c++  java
  • 打造第二代测试框架TestDriven 2.0(四)—— 代码对象化建模技术

    ------------------ 

    前言 Preface

    ------------------ 

    本文是第二代测试框架系列文章,同时也是软件工程革命三部曲中的技术文献。

    本文从Visual Studio的重构出发,分析可行的代码对象建模技术,此技术是TestDriven 2.0 的核心技术。

    ------------------   

    代码对象化建模

    ------------------  

    使用Visual Studio,或者Eclipse的用户,一定非常依赖:查看此方法被引用的列表。


    有时候我们写着写着代码,总是中途需要查询,这个时候任何IDE都会进入常常的等待时期,这个过程需要对代码(C#, Java) 进行词法分析,从静态分析代码调用情况(当然会使用部分动态反射获取周边DLL等,这个视IDE如何实现了)。

    正是一个这么重要的功能,到目前位置,我踏遍了整个互联网,仍没有发现有个人去做代码对象化建模,让代码关系持久化。如果实现了这个功能,我就可以至少实现以下一个目标:

    对比2个版本的类,查看这个类的代码变动产生影响范围。

    一旦这个需求被实现了,我就能很快的进入代码半自动化辅助编程了,甚至比大部分公司的软件开发过程领先一个身位。比如

    1. 需求变更的时候,针对需要修改的类,评估影响范围。

    2. 代码完成后,自动进入回归测试。

    3. 自动生成代码文档归档。

    。。。。

    今天我就介绍下我目前的研究进展。先看看截图:

    主界面设计,我参考了Google的风格,非常简单。 

     

    输入查询关键字之后,列举出所有相关的代码片段。 

     

    点击不同的区域,进入不同的明细,包括了程序集、类、方法。

    在这里,可以清楚的看到这个方法的声明;调用了什么方法;被什么方法调用。

    ------------------  

    架构设计 

    ------------------   

    上面只是简单的演示了一个基于网站的查询功能。更强大的功能是本地的应用。依据网站的代码对象数据库,本地能够方便的查询各种代码关系,然后进一步处理。

    要实现这个功能浪费了我差不多10天时间。最大的障碍在性能方面,因此代码模型需要细化到什么程度?本地如何缓存?代码差异比对如何提高性能等问题。这里一一解析。

    首先是对象设计,.net提供了很漂亮的自描述对象TYPE,但是他实在太冗余了,因此我需要瘦身,得到:

    ApiAssembly 程序集对象

    - AssemblyName

    - AssemblyApid

    - Classes //类

    - AssemblyReferences //程序集的依赖关系

    ApiClass 类对象,这里包括了接口、类、枚举、代理等等。

    - ClassName

    - ClassApid 

    - AssemblyName

    - AssemblyApid

    - Methods //类方法

    - Inheritances //类继承关系 

    ApiMethod 方法对象,包括了Index, Property, Method等

    - MethodName

    - MethodApid

    - AssemblyName

    - AssemblyApid

    - ClassName

    - ClassApid

    - Parameters //输入参数

    - References //方法引用其他方法列表

    ApiReference 依赖关系

    ReferenceApid

    ReferAssemblyApid,

    ReferClassApid,

    ReferMethodApid 

    在这个对象设计中,最核心的是xxxApid这个字段,为了提高整个系统的性能,我们不可能查询、比对的时候一个个对名字、参数、是否范型、范型类型等等去枚举比对,因此我通过Apid字段,对每个类进行一个唯一的MD5操作,这样日后比对的时候,只要查询这个APID值就能够迅速获取类之间的关联关系。这个是整个核心设计关键一环。

    例如某个类 public class Hello<string>  

    我对这个类的 MD5 ( 名字+是否范型+每个范型参数的类型),计算得到了一个字符串。这样只要符合这个字符串,就代表这个类。

    其次,是本地缓存设计,本地使用XML进行代码关系缓存。这个XML可以直接从网站下载,之后和本地项目代码同步。缓存使用分片设计,不同的项目使用不同的xml文件保存,系统运行的时候延迟加载,这样就能够提高整体性能。

    最后, 使用了IL,获取这个方法调用了其他方法的声明,这样就能够建立关联关系。

    ------------------  

    后记 

    ------------------   

    TestDriven 2.0 的核心思想是——代码之间是有关联的。我们应该充分利用这个关联关系,去提高我们的生产力。以往的静态文本比对、SVN代码归档等 1.0 技术已经过时了,在 web2.0 的时代,我们也需要进化了。

    本文已经建立了一个代码关联数据库,将来任何的 2.0 操作都将基于这个数据库。 个人感觉,是自己划时代的一次进步。 下一篇文章将直至核心,论述 基于 代码关联数据库的 测试驱动。

  • 相关阅读:
    windows10的子系统linux(wsl)
    关于js的比较
    关于parseInt,很神奇
    vue修改数组元素通过arr[0]=val的方式不生效
    wps表格 VLookUp 函数
    青年大学习_收集截图方案
    个人记录_uwsgi,nginx与django之间的关系以及各自的作用
    Ubuntu16.04系统中创建新用户
    idea 启动或debug springboot web项目特别慢的解决方案
    利用Aop实现动态分库分表
  • 原文地址:https://www.cnblogs.com/zc22/p/1685211.html
Copyright © 2011-2022 走看看