自动化代码生成在UI可测试性提升中的应用

原创 2017年01月03日 15:17:09

 

【摘要】

本文阐述了在基于测试总线构建UI端到端可测试性架构的过程中,如何采用自动代码生成机制生成接口-实现的代码框架。自动化代码生成大大减轻了基于测试总线架构的代码因接口隔离造成的重复语句编写的负担。自动化手段使得UI可测试性方案的推广更方便。本文的代码自动生成仅限于C++Builder编译环境中的C++代码生成。

【关键词】

UI可测试性,自动化代码生成,C++,python

1     背景

在笔者撰写的《基于TDD的UI端到端可测试性改进最佳实践》,详细阐述了UI端到端可测试性的框架。见下图。


在实际的C++ Builder环境中,由于Form本身不支持多继承,所以在实际实现时,往往还需要在UI API和实际的Form之间增加一个间接层,此间接层实现在UIAPI所有接口,但在接口实现中无任何逻辑,仅仅是调用Form的具体实现。见下图。

 

这仅仅是由于CB本身的VCL局限导致的。这个间接层的引入,使得代码层次变深,而且基本都是机械式拷贝和粘贴,完全可以采用自动化手段来实现代码的生成,避免浪费宝贵的程序员时间。

2     解决思路

我们以某项目为例,看一下我们即将面对的问题。

1)View API如下:

2)ViewImpl的头文件如下:

3)ViewImpl的源文件如下(摘取片段):

4)Form头文件如下(摘取片段):

5)Form源文件如下(摘取片段):

从实际代码来看,雷同的地方比较多。如果项目中涉及到界面的部分全部采用TestBus方式来编码,很多的工作量都浪费在无谓的拷贝和粘贴上。

通过对代码模式进行分析,我们可以看出,其具备高度的一致性。模型抽象如下:

假设模块名称为XXX,

1) XXXView.h需要开发人员自己编写,文件内容可以抽象为:

    ….

struct XXXView

{

    virtual ~XXXView(){};

    一组形如“virtual 返回值 函数名(参数列表) = 0;”的函数

} ;

….

2) XXXImp.h文件自动生成,规则为:

#ifndef XXXViewImpH

#define XXXViewImpH

//---------------------------------------------------------------------------

#include "XXXView.h"

class TfrmXXX;

struct XXXViewImp :public XXXView

{

public:

    XXXViewImp(TfrmXXX *form);

    virtual ~XXXViewImp();

    一组XXXView.h中的函数,需要去掉末尾的“= 0;”

private:

    TXXXPlay *form;

};

 

#endif

 

3) XXXImp.cpp文件自动生成,规则如下:

 

#pragma hdrstop

 

#include "XXXViewImp.h"

#include "XXXForm.h"

 

//---------------------------------------------------------------------------

 

#pragmapackage(smart_init)

 

XXXViewImp:: XXXViewImp(TfrmXXX*form) : form(form)

{

}

XXXViewImp::~ XXXViewImp()

{

}

 

返回值 XXXViewImp::函数名(参数表)

{

    form->函数名(参数名);

}

返回值、函数名、参数表、参数名和XXXView.h中的一致。

4) XXXForm.h中的和XXXView接口相关的函数,自动生成,规则如下:

BEGIN_MVP

    一组和XXXVIew.h一致的“返回值 函数名(参数列表);”

END_MVP

5) XXXForm.cpp中的和XXXView接口相关的实现函数,自动生成,规则如下:

如果XXXForm.h中不含有宏BEGIN_MVP,说明是第一次生成,则cpp文件末尾增加实现函数,规则如下:

返回值 TfrmXXX::函数名(参数表)

{

}

如果XXXForm.h中含有宏BEGIN_MVP,说明不是第一次生成,可能已经含有用户真正实现代码,不能简单覆盖。由于逻辑比较复杂,因此在此不做处理。需要用户手工保持一致。

从以上分析过程可知,只要从XXXView.h文件中,得到以下变量,即可生成相应文件:

1) 模块名。模块名从API文件中的类名中截取,即从字符串XXXView中获取到XXX。

2) 函数返回值。函数返回值为virtual之后到左括号之前,去掉最后一个单词即可。

3) 函数名。函数名为左括号之前的最后一个单词。

4) 函数参数列表。参数列表为左括号和右括号直接的所有字符,含换行符。

5) 函数参数名。参数名为参数列表中逗号之前的最后一个单词,以及右括号之前的最后一个单词。

这样,通过对文本的简单解析,即可以生成得到上述变量,再根据上述的文件规则,生成出所需要的XXXViewImp的头文件和实现文件,以及XXXForm中的所有和API接口相关的头文件和实现文件的代码片段。

3    实践情况

在具体实现时,采用了编码效率比较高的python来完成代码编写。代码片段如下:

解析函数名和返回值代码:

执行时,只需要把python脚本放置在模块目录下,双击即可自动生成所需文件。

在网优工具部某项目的客户端代码中,有两个模块具体采用此种手段进行了验证,生成的代码一次性编译通过,运行正常。

4     效果评价

采用本方法后,解决了采用TestBus技术实现UI端到端可测试性提升带来的接口及实现中的重复劳动问题,使得开发人员只需关心具体的业务实现,从而可以较大提升工作效率。而且,在UI API接口变动时,只需要在Form实现文件中简单修改,然后运行脚本即可保证文件间的一致性。



iOS UI自动化测试

转载地址:http://tmq.qq.com/2016/06/uitestingiosautomation/?utm_source=tuicool&utm_medium=referral ...
  • u011452278
  • u011452278
  • 2016年10月25日 09:18
  • 1825

什么样的场景最适合作为Ui自动化脚本的需求?

问题:什么样的测试场景最适合作为Ui自动化脚本的需求? 1、操作过程完全机械的,即测试人员不必用脑子。 2、每次的操作行为经常重复的动作。 3、经常要进行的测试活动...
  • cadi2011
  • cadi2011
  • 2016年08月02日 17:41
  • 601

单页应用详解 ——(1)现代web应用,概述

单页应用详解(Single page apps in depth) (1).现代web应用,概述(Modern web applications: a overview) 英文原文:htt...
  • feliving
  • feliving
  • 2012年11月11日 20:59
  • 945

聊聊UI自动化

学习做自动化的同学一开始都是偏向于UI自动化,自己这些时间也写过很多:python的,Java的,以及RF关键字驱动的。。。 今天就说下UI自动化的一些东西吧,希望对大家有些帮助,少走些弯路。测试生...
  • huashao0602
  • huashao0602
  • 2017年02月14日 11:17
  • 3208

UI层自动化测试框架(二):Appium基础

一:Appium介绍 Appium是一个移动端的自动化测试框架,可以测试原生应用,移动网页和混合型应用,且是跨平台的。可用于iOS和Android以及Firefox的操作系统。 Appium是由n...
  • ToBeTheEnder
  • ToBeTheEnder
  • 2016年09月06日 20:54
  • 6977

Android UI自动化用例设计技巧

Android UI 自动化用例设计技巧 封装方法和接口化 封装方法: 思考:编程如何越来越快? 首先,经验丰富,知识面广。 其次,每一个熟练编程的人员,都会有自己的一个库,那是他多年积累的宝贵经验...
  • qq_35417815
  • qq_35417815
  • 2016年07月01日 20:44
  • 493

Qt 界面使用自定义控件 "提升为"

1.效果图我做了一个非常简单的例子,一个可以显示颜色的QLabel,边上有个按钮,点击,跳出颜色选取的Dialog,然后选择一个颜色,这个QLabel会变成什么颜色。2.ColorLabel 我们先把...
  • fox64194167
  • fox64194167
  • 2014年06月17日 09:09
  • 5316

python 和 selenium实现web UI功能自动化测试框架(米兔888)

https://my.oschina.net/u/3041656/blog/857676 https://pan.baidu.com/s/1jIqpu8A 之前分享了python和reques...
  • cyjs1988
  • cyjs1988
  • 2017年07月20日 17:42
  • 2173

对UI自动化测试的一些感悟

不断发掘自动化测试对各个团队的附加价值,这样才能得到来自四面八方的支持没有将自动化加入项目过程的自动化都达不到预期的效果UI自动化框架把UI自动化框架设计成一个拼图性质的架构。把每个特性都设计成一个独...
  • a23764996
  • a23764996
  • 2017年02月15日 20:11
  • 2970

UI自动化例子

demo1 package webdriverdemo; import java.util.concurrent.TimeUnit; import org.openqa.selenium.*;...
  • csdn932707727
  • csdn932707727
  • 2017年02月03日 18:17
  • 764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自动化代码生成在UI可测试性提升中的应用
举报原因:
原因补充:

(最多只允许输入30个字)