使用辅助技术创建GUI测试工具.docx
- 文档编号:24130107
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:33
- 大小:292.76KB
使用辅助技术创建GUI测试工具.docx
《使用辅助技术创建GUI测试工具.docx》由会员分享,可在线阅读,更多相关《使用辅助技术创建GUI测试工具.docx(33页珍藏版)》请在冰豆网上搜索。
使用辅助技术创建GUI测试工具
毕业设计(论文)外文资料翻译
学院:
电子工程学院
专业班级:
电子信息工程电子081
学生姓名:
黄昱
学号:
030811121
指导教师:
杨瑞(副教授)
外文出处:
IEEE
附件:
1.外文资料翻译译文;2.外文原文
指导教师评语:
签名:
年月日
使用辅助技术创建GUI测试工具
MarkGrechanik,QingXie,andChenFu
AccentureTechnologyLabs
Chicago,IL60601
fmark.grechanik,qing.xie,chen.fug@
摘要
由于对基于GUI的应用(GAP)进行黑盒测试比较繁琐和费力,而且现有的工具不能完全解决测试过程中不同方面的问题,所以测试工程师开发了自定义的自动化测设工具。
这些工具通过他们相关的GUI对象的行为与GAP进行互动。
测试工程师提出编写这个测试工具的一个额外的收获就是这些工具可以在不同的GAP上反复运行。
可惜的是,在测试工程师使用平台相关的函数库和技术期间,创建自定义的GUI测试工具是一个辛劳的,智力型密集的过程。
结果这些工具就很贵、很难去维护很发展,而且他们只能在特定的平台上运行。
我们提供了一个创建用户自定义GUI测试工具的通用方法。
该方法轻便,便捷,不受干扰,通用且便宜,其通过一个统一的方法将连接和控制GAPs的连接技术的非标准用法连接起来,该方法通过拖放操作使测试个体与GUI实现交互。
我们描述我们用这种方法创造各种各样的GUI测试工具,钻研可达到的技术的特点,并用这个方法总结经验。
1简介
基于用户图形接口的应用(GAP)很多,它提供了很多成熟的服务。
对GAP的黑盒测试很乏味而且很辛劳,因为普通的GAP包括了数百个GUI屏幕和成千上万的GUI对象。
自动化测试的关键作用是降低了测试GAP的成本。
测试工具就是为了完成自动化的过程而被测试工程师创造出来的,这些工具使用一些潜在的测试框架来模拟用户对GUI对象的行动。
我们在创建自定义测试工具上花费的一个额外的努力就是让它反复工作来确定GAPs的行为是否令人满意。
测试工程师使用成熟的计算逻辑,特别是他们写的输入数据过程的代码,利用该数据区设置有价值的GUI对象,从这些GUI对象得到这些计算结果,并与之前的数据与结果进行比较来确定GAPs行为是否与预期相符。
从程序测试脚本与带有GUI对象一些测试逻辑的交互来看,此测试工具是具有很有价值的创造。
利用反复测试逻辑的最终目标就是完成自动化测试。
制作测试工具最初就是一个很重要的投资。
新的测试工具被创造出来有很多必要的原因。
现有的商业化测试工具昂贵而且是封闭式的,他们不导出自测试工程师使用自定义测试任务完成自动化的接口。
此外,开源软件以及商业测试工具功能有限并且很难提取他们的组件来在公共测试环境的使用。
测试工程师提出编写这个测试工具的一个额外的收获就是当这些工具可以在不同的GAP上反复运行,这些工具被创造出来的同时,测试逻辑也得到了重用。
此外,在发布新版本的间隙来改良相应的测试脚本,从而完成自动化测试。
为了重用这些脚本,测试工程师必须改良他们,并且这个过程是费时费心的,而且GUI测试工具提供了可以帮助解决这个问题的有效方法。
不幸的是,在测试工程师使用平台相关的函数库和技术期间,创建自定义的GUI测试工具是一个辛劳的,智力型密集的过程。
结果,这些工具就变的很贵,很难维护和升级,而且他们向来只能在特定的平台上运行。
GUI测试工具在创建GUI模型上是很重要的,它通过检查GUI模型脚本运作原理来指导GAP测试。
具体的说,基于模型的GUI回归测试包含了高层应用算法的构建和与升级后的GAP应用算法的比较[23]。
GUI模型还可以从GAP的源代码中提取出来。
然而,从GAP源代码中提取模型还存在两个基本的难题:
首先,在黑盒测试时,GAP的源代码是不可获得的,而且用现有的黑盒进行GUI测试时,进行操作的对象是GUI而不是源代码。
一般的来说,测试过程通常由外包机构完成,并且由于多种原因,源代码并不能共享给这些外包机构。
因此,测试机构进行必须的黑盒测试时,并不能从源代码获得精确的GUI模型。
其次,就算源代码是可获取的,仍然有许多限制使从源代码推导GUI模型的方法变的无效。
考虑到一个情况,当GUI的对象是使用API来创建的(API,应用程序接口)。
这些API就需要一些函数调用的参数变量,包括字符串变量类的GUI对象的值。
这些变量的值只有在运行的时候才能获得,所以从源代码获得GUI模型是很困难的。
此外,从源代码成功推导出模型取决于获得了API调用函数的精确语义,和它创建和控制的GUI对象(例如,CreatWindow),并为用于创建GUI应用程序和发展IDE使用的语言建立适当的分析器和分析仪,才能从IDEGUI资源库中提取GUI模型。
这些元组的数量以成千上万的API调用的编程语言的笛卡尔乘积来衡量。
这各种各样的问题导致很难从不同的GUI应用源代码中获得模型。
我们提供了一条新的方法来建立与GUI对象交互的自定义GUI测试工具。
该方法结合使用非标准的可访问技术和用一个统一的可视化机制来控制GAP,从而使测试人员可以对GAP进行鼠标点击、拖放来完成与GUI对象的互动操作。
我们详细描述了我们如何使用这种方法来创建各种各样的GUI测设工具,利用这种方法钻研可访问性的各种技术并总结出经验。
2背景
在本节中,我们为当下的自动化测试艺术提供了背景,我们提出了一个自动化测试模型。
2.1背景
自动化测试的目标是,除其他事情以外,减少在测试过程中所需要的人力资源,并增加该设备在此过程中可测试的频率。
传统的捕捉/重演工具通过录制鼠标坐标和用户操作的方式作为测试脚本,提供了一个基本的自动化测试解决方案,这种方式代替了测试GAPs。
由于这些工具使用鼠标坐标,GUI布局丝毫未变,测试脚本收支平衡。
为了避免这个问题,现代的捕捉/回放工具通过捕捉GUI对象的不同特性,而不是鼠标的坐标值。
这种方法被称为测试对象地图,它的想法是在测试脚本的过程中使用唯一的名称来引用GUI对象。
测试工程师指定唯一的名称,他们在测试脚本语句中使用这些名称。
在测试对象的映射中,(uname,f
g),其中f
g是将V的值赋予GUI对象中的P,收集并以一个独特的名字uname储存在对象库(ORs)中。
在回访时,参考脚本中的“uname”就可以从库Ors中检索到f
g,并且这个引用的GUI对象的性能与屏幕上确定到的是相符的。
这样因为改变GUI对象并不需要去改变测试脚本,测试的灵活性就额外增加了。
在OR库中改变GUI对象的属性值是为了来确定在回放时相应的GUI对象的变化
2.2自动化测试模型
自动化测试模型在测试脚本与GAP之间的相互作用如图1所示。
测试脚本的报表是由处理脚本语言解释器提供的一个测试平台。
当解释器遇到声明对象的访问和操作时,它通过控制测试平台,将这些报表破译为一系列的指令,并由潜在的GUI框架和操作系统来执行。
图1测试脚本与GAP之间的互动模型
从一个抽象的层次来看,测试脚本和GAP之间的关系就是一个反射性的连接器。
这个连接器就是一个传达和执行测试脚本与GAP之间命令的频道。
反思一个给定类型的GUI对象,在GAP运行之前,测试脚本调用静态对象的方法是未知的。
该模型包括了脚本跟GAP之间的反射连接器,这样使测试脚本在GUI对象运行的时候可以进行访问和操作。
测试脚本中的每个对GUI对象访问及操作的声明包括下列操作:
(1)浏览GUI目的对象和
(2)调用包括获取与设置值等执行去到达这个目标对象。
利用反射器与连接器的可实现性思考,测试脚本中的声明可以控制GAP中的GUI对象和这些对象的操作,这是当前自动化测试工具实现的本质。
3我们的解决方案
在这部分,我们提出我们的方案的核心理念,提供可访问性技术的背景并给出了一种我们从GAP创建网络服务的高级解决方案。
3.1核心理念
我们的主要目的就是让测试工程师能创建GUI测试工具来模拟人工与GAP之间互动的程序。
这个程序可以描述如下:
应用程序运行之后,用户可以从最初的界面读取数据并输入一些数据到GUI对象中,然后用户会开始一些操作来改变界面(例如,选择菜单项或点击一个按钮),由于这些操作,应用程序在完成计算后并显示出不同于之前的GUI界面。
再接着,用户不断的读取,输入数据并进行操作,直到用户退出应用程序。
为了使GUI测试工具能访问GAP程序中的GUI对象,我们跟所有的设计师来模拟这个程序。
我们解决方案的一个核心理念就是应用程序及其GUI对象是可编程的,他们的值可以设定和提取,他们的方式与用户对他们的操作时密切相关的。
例如,一个组合框显示许多项,选择并调用组合框中的一项,执行一些计算,为了程序化的控制这个组合框,设计师应该调用一些研究方法和设定区域编程对象的值,来带代表建立立在一些应用程序中GUI的组合框。
一个关键的解决办法就是,将这些GAP的GUI对象当成这些区域编程对象,并通过调用代表这些GAP的对象。
不幸的事,由于编程对象只支持用于操作界面,设计师并不能访问这些应用程序的GUI对象。
通过露出一个可调用的区域值可以设定和恢复的接口,可访问性技术克服了这一限制从而控制了拥有这样的接口的GUI对象。
在接下来的3.2节我们将给出这个可访问技术的概要。
3.2可访问技术
由于纯粹的编程对象只支持用户空间的互动,我们无法访问和操作GUI的对象。
我们使用可访问性技术作为一个普遍的机制来提供访问GUI编程对象。
事实上,我们使用可访问技术作为普遍的反射性连接器定义在2.2节。
可访问性技术为许多残疾计算机用户提供了许多不同的帮助。
具体的帮助包括:
视障人士用的屏幕阅读器,丧失听觉的用户用的视觉指示器,运动障碍的用户专用的软件。
由于电子信息技术产品和服务必须符合电子信息无障碍标准,大多数计算机平台都含有可访问技术。
比如,微软主动访问技术(MSAA)就是为了帮助用户使用窗口模式的应用,阳光科技协助残疾用户访问和运行软件商的JAVA虚拟机(JVM)。
可访问性技术引入这些计算机平台并应用,比如图书馆用来获取用户界面的信息。
可访问性技术提供了大量复杂的服务,比如检索GUI对象的属性,设置和恢复他们的值,产生不同的事件和拦截。
在本章中,我们使用的是MSAA,然而,使用不同的可访问性技术会产生类似的结果。
即使没有现有的API调用标准,不懂的技术会产生类似的API调用,这说明公共标准的可访问性技术的收敛速度是很慢的。
大部分可访问性技术实现的主要概念就是GUI对象显示为暴露为可访问和可操作的。
例如,一个WINDOWS的GUI对象的接口应使用MSAAAPI调用来便于访问和操作。
程序员就像对待标准的可编程对象一样可以对这个GAP的GUI对象进行写代码访问和控制。
使用可访问性技术,程序员可以对GUI对象产生的不同事件注册回调函数从而能及时获得GAP上GUI对象的状态。
例如,一个GUI对象收到一个错误的输入,接着GAP就会显示一个信息来提醒用户这个错误,然后以前的注册回调函数能截获这个事件的预示信息并创建出对话框,并给控制GAP的设计者发送“非法输入”信息。
3.3钩子函数
钩子函数就是用户定义的包括回调函数的库函数,它可以由可访问性技术的一些规则来编写。
钩子函数对设计师来说是很重要的,它们可以扩充GAP的功能,特别是能在不改变GAP源代码的前提下注入故障或突变的界面。
编写钩子函数不需要任何关于GAP源代码的知识。
在我们的方案中,钩子函数就是输入所有GAP的函数库,其目的是侦听GAP产生的所有事件,并注入并执行从综合系统收到的指令。
例如,一个指令在某些必然事件发生之前,其按钮是没用作用的。
钩子库函数的作用就是在不修改GAP源代码的前提下能改变他们的功能。
一般钩子函数的主要作用就是通过接受命令来执行GUI对象的动作,报告GAP中发生的时间,回应内置函数调用的某些命令和事件。
由于访问层都是由各自的供应商提供的并且钩子函数就是访问层的一个技术工具,所以使用钩子函数是合法的并被允许来控制操纵GAP。
此外,编写和使用钩子函数是很简单的,因为程序员使用的API效用高级访问技术,他们不需要处理复杂的二进制编写技术。
当目标GAP开始运行时,访问层中定义在应用层库函数和寄存器地址上的钩子函数应通过反射回调到指定的事件上。
由于钩子函数是设置在GAP空间上的,他们的回调执行会影响到GAP的各个方面。
3.4GAP的构造
在基于事件的窗口系统中(例如,WINDOWS),每一个GAP都有一个主窗口,这些主窗口是与事件循环联系在一起的。
通过对循环发送DestroyWindow信息来关闭窗口。
主窗口还包含了GAP的其他对象。
一个GAP可以认为是一棵树,树上的节点就是GAP中的GUI对象和边缘,就像孩子对象包含了双亲一样,树的根就是主窗口,容器对象就是节点,树上的叶都是基本的对象。
每一个GUI对象根据他们的功能分配到一个类别(班)中。
在WINDOWS中,GUI对象的一个基本类别就是他们在这个班中的窗口。
一些GUI对象会作为其他对象的集合,例如,会话窗在基本对象(例如按钮和编辑框)不能包含其他对象是会被用来执行一些基本功能。
这个层次包含了反映在面向对象设计者的设计包含了一个领域的GUI对象
3.5GUI的可编程表现
回想一下我们关于GUI对象的值可以设定和提取并可被调用的想法。
这样,GUI对象就可以表现为居住在网页服务层。
由于GUI屏幕包括了不同的GUI对象,这些不同的屏幕(也就是GUI对象),也可以表现为一个区域内的GUI对象的集合。
最后,GAP包含了不同的GUI屏幕,并且GAP可以表现为一个区域内的代表了GUI屏幕的子类。
我们认为GAP是状态机,网页服务通过将代表了这些GAP的编程对象翻译成各种状态来控制GAP。
总的来说,GAP就是一个状态机,它的状态由GUI对象的性质(例如,格式,只读状况等等)和他们的值来定义。
当用户执行改变GAP状态的操作,在一个新的状态,GUI对象可能不变,但他们的值和他们的一些性质会发生变化。
我们区分中间和最后的状态,考虑去点击一个网络应用程序上的链接。
在加载完一个代表了GUI对象的页面后,浏览器被定向到一个目的页面。
显然,GUI过渡页面是GAP的一个中间状态,而用户只对目的页面也就是最终状态感兴趣。
用户通过查看GUI屏幕中GUI的需求是不是被完成来区分中间状态和最终状态。
为了自动执行这个函数,一个检查GAP的网页服务方法就是通过分析他们的结构和他们的GUI对象来确定中间和最终状态。
这个分析就是是当用户对GAP进行操作时由GUI生成的树并用这些树与设计师设计的记录进行对照。
4实现技术
在这一部分中,我们描述利用可编程技术生成对GAP的控制和操纵的实现技术。
4.1将GUI对象分类
有一类的GAP通过设置和获取GUI元素的值和造成的行为来控制GAP,设计师利用输入这一类的GAP的状态来使GAP切换到不同的状态。
当网络服务控制GAP是有一些代码会被丢弃(例如,当GAP显示一个提示用户输入不正确的对话框,设计师或脚本会拦截这个对话,压制它,将它丢在除了调用客户除外的程序),此时,设计师需要排放处理这些异常的代码。
当一个GAP切换到一些状态,设计师会通过使用可访问性技术来记录GUI树节点上的状态。
设计师为树上的每一个节点(例如,一个GUI元素)发出了一个声明代码如图2所示。
生成的类是与GUI元素连接的,这些类又包含了对这些元素的值的设置和获取及执行操作的方法。
图2代表一个GUI元素的类的声明
4.2将GUI屏幕当成状态
基于类的状态的声明如图3所示。
设计师以GAP状态为模板通过类的状态创建了各种分类。
所有的给定状态的GUI元素都在这些类的状态区域中,这些区域是由相应的类产生的(例如,GUI对象区域)。
一个GAP的变化是通过与切换理论通话,这个通话就是通过与给定的GUI元素通过一个代表对象的合理方法进行的。
状态变量的号码就是这个状态的身份证,状态号码的每次增加称为方法开关。
图3关于类的状态的声明
5我们的经验
在本节中,我们描述了我们是如何使用基于可访问性的方法创建GUI测试工具的。
5.1测试系统
生成一个测试系统(Smart)应该参照GAP,并将这些测试应用到相对应的目标网络服务。
测试系统允许用户指定他们运用GAP,然后用事先制定好的路径回放这些输入了不同数据的GAP,再在途中通过不同的GUI元素获得数据。
测试系统使用这种检索数据方法来进行分单元测试目标网页服务。
设计的前端部分显示在图4中。
测试系统的标签显示了GAP上的信息,包括它的屏幕及GUI元素。
这些标签显示了GUI元素显示在SMART类浏览器标签上的特性。
标签标示了代表了参照与GAD的GUI元素的屏幕显示程序。
可以有多个标签标示参考与不同GAP的屏幕。
最后,标签标示服务显示了一个为目标网络服务的视觉艺术。
数据显示描述参考目录和它网络服务的目标。
利用测试系统的前端,用户指定的具有价值的GUI参考元素可以被用来生成测试事件。
这些元素包括了GUI元素,它接受用户执行的输入数据和序列的行动,来从GUI元素包含的数据中提取需要的目标测试。
图4测试系统设计的前端
呼叫GAP的目的就是让设计师记录显示结构和用户对GAP执行的操作,然后将这些操作转换为编程指令中的代码用来在GAP中回放脚本,主要目的就是完成单元测试。
这些指令编码在CLASS的标签中实现,如标签中的SCREEN1所示,通过实例化这类CLASS并调用其生成的测试脚本,这些指令控制和操纵GAP,引领它从包含不同数据的GUI元素中提取单元测试的案例。
在记录屏幕序列时,设计师会得到GUI的信息结构和所有使用非可访问的接口的所有元件的属性。
设计师用这些属性来产生SCREEN1,产生的SCREE1显示的CLASS的显示标签。
在设计的时候,我们要让用户明确知道GUI元素的功能,特别是GUI元素能得到什么样的值或服务来作为输入和元素的输出结果是什么。
为了做到这一点,当用户的光标经过GUI元素时,设计师使用可访问的API来调用这些元素的信息。
为了确认选择,一个框架会出现在工具提示窗口来提示关于所选择的元素的信息。
接着,用户点击鼠标来选择和拖动这个元素(或者元素的窗口)到设计师关于SCREEN1的标签上,然后释放鼠标按键,将元素拖到标签区,这样就有一个新的类成员加入到SCREEN1中。
设计师为用户设计了一个属性对话框,包括用户指定元素的功能(例如,输入,输出,行动,或中断),它的名字,以及其他一些属性。
一旦用户对所有的GUI元素进行拖放,设置他们的属性,或为其相应的编程对象从WSDL上加载目标网络服务等等操作时,将这些元素和他们加载的服务数据用箭头连接起来,以此来描述GUI元素时如何映射到网络服务中的输入参数中的。
例如,通过画线的方法连接getlevel()与level(网络服务中的输入参数),用户的从GUI元素中提取指定的数据将应用到与GUI元素相当的网络服务中作为输入参数。
为了简洁起见,我们不考虑如何根据指定修改这些数据。
一旦所有的映射被创建出来,我们可以简单的点击GenerateSmartClasses这个按钮来回放脚本和测试。
设计师使用从屏幕捕获来的信息并输入元素到JAVA代码和单元测试事件中。
在下一个部分,我们将给出一个为测试而编写的片段生成代码。
设计者是测试系统的核心组成。
测试系统的目的就是让他的使用者知道如何使用相关GAP的GUI元素来与单元测试进行互动,如何将这些GUI元素映射到目标网络服务中,特别是它们的暴露方法及参数。
这些映射就是用来产生供单元测试事件用的测试工具。
当测试人员定义完所有的映射后,设计师就接出一个包含了接头上测试运行驱动程序的输出装置,当这个输出装置运行时,它使用测试事件来测试目标网络服务。
测试装置调用目标目标网络服务的的规则,利用这种规则传输测试数据,并利用返回值来与预期测试值进行比较,这样就完成了测试的过程。
示连续释放的软件。
自动回归测试提出了众多技巧,这些技术通常依赖于从修改过的源代码提取出的信息。
一些流行的回归测试技术包括:
分析程序的控制流程,分析参数的功能、类型、变量和宏定义,使用def-use链,建立程序流程图,分析面向对象程序的代码很层次类型。
由于回归信息是来源于源代码,所以这些技术并不能直接应用于black-boxGUI回归测试中。
一种与GUI密切相关的回归测试技术(GUITAR),它可以使对改进的GUI的回归测试变得与众不同。
据我们所知,GUITAR5.2REST(基于脚本测试努力的减少)
我们建立了一个工具,用来减少基于脚本测试的花费,它用来指导测试人员通过改变测试脚本来测试修改过的GAP。
我们方法的核心就是让测试人员可以伴随着GAP的改变来维护和发展测试脚本,根据一些辅助工具的协助来对这些测试脚本进行高度自动化和精确化的改变。
REST输入的是与GAP相同的连续释放的GUI模型和对前一个释放的GAP的测试脚本。
再利用可访问性技术释放出这些模型之后,对这些模型进行对比并修改他们GUI对象的地址。
接着,对这些模型和测试脚本进行分析会发现它们会影响到其他的声明脚本。
这个分析的结果警告我们只有帮助测试工程师修改测试脚本中的错误,他们才能对连续释放的GAP进行测试。
6相关工作
GAP呈现了一个对于回归测试的挑战,因为输入输出映射并不能稳定的表技术使用的平台和技术语言并不能很容易的扩展到其他的平台。
例如,GUITAR是不是可以扩展到基于网络的GAP目前还不清楚。
在提出创建修改过的GAP测试事件的申请之前,基于模型的GUI回归测试的支持者主张建立高层次的GAP模型。
我们认为我们的方法是很有力的,因为它可以用作轻松从GAP提取GUI模型的工具,它可以在不同的平台运行,它还可以利用大量的模型来提高它的测量精确度和可用性。
当提到从GAP和他们的GUI元素提取信息是,scrren-scraping这个术语概括描述了各种各样使用户界面自动化的技术。
利用这个技术,记录了大量关于用户鼠标的移动和点击的数据,然后将这些数据输入到系统队列关于鼠标和键盘的事件中。
Screen-scraping在改写和修补二进制码上有多个优势,它不需要对计算平台或应用程序的潜在源代码进行修改。
我们的方法使用了screen-scraping的一些技术,然而,它不同于其他的screen-scraping技术,它并不依赖于解析一种语言来描述GUI,所以它更通用,更具有说服力。
很少有用来控制和操纵GUI对象的商业工具。
AttachmateWRQ和Seagull软件公司是提供控制和操纵GAP工具的最大的最古老的公司。
他们通过独立的线路利用screen-scraping开发特有的平台。
他们和其他几家公司已经建立了在不同的平台运行的用来控制和操纵GAP的不同的工具。
这样做的结果就是,他们为了这些工具开发了多个版本的源代码,他们后期的费用增加,最终在维护和升级不同的代码库上遇到了困难导致失败了。
不同的是,我们使用了一个依赖于控制和操纵GAP原理的平台。
7结论
我们提供了一个创建用户自定义GUI测试工具的通用方法。
该方法轻便,便捷,不受干扰,通用且便宜,其通过一个统一的方法将连接和控制GAPs的连接技术用非标准法连接起来,该方法通过拖放操作使测试个体与GUI实现交互。
我们描述我们用这种方法创造各种各样的GUI测试工具,钻研可达到的技术的提点,并用这个方法总结经验。
参考文献:
[1]Screen-scrapingentryinWikipedia.http:
//en.wikipedia.org/wiki/Screenscraping.
[2]Section508oft
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 辅助 技术 创建 GUI 测试 工具