Ⅰ.2.9.如何测试支持国际化的Qt AUT
2015-11-20 10:17
288 查看
Qt 支持创建国际化的应用程序。意思就是,举个例子,开发者可以创建一个Qt应用程序,在使用英语语言的地方(如U.S)该程序可以在menu选项和对话框标签上展示English文本,在用德语的地方显示German,以此类推。
如果Squish 使用了AUT对象属性——包括它们用来识别对象的文本来识别对象,当谈到这种测试的时候,国际化的AUT可能会引起问题。因此,举个例子,File 菜单项将会有下一个英语语言环境下的‘File’,法语语言环境下的‘Fichier’。如果使用英语为AUT记录测试脚本,该测试脚本将不能在西班牙语环境下进行回放,因为当AUT的文本都是西班牙语的时候,Squish将会寻找使用了英语文本的对象。
Squish提供了三种处理国际化的问题的方法。
2.9.1 自动转换翻译
尽管有一个重要的限制,但这个是最简单的处理国际化AUT的方法。
应该使用与开发AUT所用的相同的语言来创建(如,记录)一个国际化的AUT的测试。例如,如果AUT是在U.S中用English开发的,应该用English创建测试。原始的English文本存储在AUT中,并且可以访问,即使AUT运行在不同的语言黄精中,比如Swedish中,menu选项和对话框标签显示Swedish文本。
我们可以告诉Squish使用AUT的原始(如,English)文本,甚至在不同的语言环境(如,Swedish)中也可以让Squish使用AUT的原始文本,可以通过设置SQUISH_TRANSLATION_AWARE_LOOPUP环境变量为1实现。
在一些情况下,相同的文本根据上下文需要有不同的翻译。为了支持这个功能,Qt的国际化函数QObject.tr 允许第二个字串用于消除歧义。不幸的是,不像原始文本,消除歧义的文本没有存储在AUT中,因此Squish不能区别到底该使用哪个用于消除歧义的文本。避免这个问题的唯一的方法就是不使用消除歧义的文本或者使用其他的方法来测试显示文本的国际化AUT。
2.9.2 使用对象名字而非文本
解决这个问题的最容易的方法是AUT的开发者给AUT的对象起一个唯一的名字,可以通过Qt的QObject.setObjectName 方法来创建这个名字。该方法的文本用什么语言是没有关系的,因为文本没有被翻译,所以不管AUT运行于什么样的语言环境下文本仍然是相同的。下面是一个AUT的开发者如何实现这个功能的示例:
不幸的是,问题仍未解决,即使当给Qt对象赋一个显式的名字时,Squish会继续使用它们的text属性。解决这个问题的一个方法是从Squish对象名字中移除所有的属性,除了type 和 name 属性(name属性是对应于Qt 对象的name 属性的Squish的name)。一个更方便的解决方法是控制Squish如何产生对象名字,因此它将会自动的为拥有非空Qt 对象名字的AUT对象使用type
和name属性,而为那些Qt对象名字为空的属性使用Squish的标准方法。
2.9.3 以编程方式翻译对象名字
另一种处理国际化AUT的方法是自动的按需创建具体区域对象map,自动地加载区域相关的对象map代替默认的对象map。
一种实现上述功能的方法是写下一个测试脚本函数(可能以全局脚本的形式存储的),该脚本读取原始对象map(该map使用,描述English 文本),然后使用当前地区的语言(例如,Finnish)写出一个新的对象map,然后加载新创建的对象map。
不幸的是,翻译对象map还是不够的,因为‘items’的文本可能不在对象map中。对于这些情况,我们需要使用我们自定义的翻译函数,并将它应用于相关的文本。例如,给出的已记录一行:
如果Squish 使用了AUT对象属性——包括它们用来识别对象的文本来识别对象,当谈到这种测试的时候,国际化的AUT可能会引起问题。因此,举个例子,File 菜单项将会有下一个英语语言环境下的‘File’,法语语言环境下的‘Fichier’。如果使用英语为AUT记录测试脚本,该测试脚本将不能在西班牙语环境下进行回放,因为当AUT的文本都是西班牙语的时候,Squish将会寻找使用了英语文本的对象。
Squish提供了三种处理国际化的问题的方法。
2.9.1 自动转换翻译
尽管有一个重要的限制,但这个是最简单的处理国际化AUT的方法。
应该使用与开发AUT所用的相同的语言来创建(如,记录)一个国际化的AUT的测试。例如,如果AUT是在U.S中用English开发的,应该用English创建测试。原始的English文本存储在AUT中,并且可以访问,即使AUT运行在不同的语言黄精中,比如Swedish中,menu选项和对话框标签显示Swedish文本。
我们可以告诉Squish使用AUT的原始(如,English)文本,甚至在不同的语言环境(如,Swedish)中也可以让Squish使用AUT的原始文本,可以通过设置SQUISH_TRANSLATION_AWARE_LOOPUP环境变量为1实现。
在一些情况下,相同的文本根据上下文需要有不同的翻译。为了支持这个功能,Qt的国际化函数QObject.tr 允许第二个字串用于消除歧义。不幸的是,不像原始文本,消除歧义的文本没有存储在AUT中,因此Squish不能区别到底该使用哪个用于消除歧义的文本。避免这个问题的唯一的方法就是不使用消除歧义的文本或者使用其他的方法来测试显示文本的国际化AUT。
2.9.2 使用对象名字而非文本
解决这个问题的最容易的方法是AUT的开发者给AUT的对象起一个唯一的名字,可以通过Qt的QObject.setObjectName 方法来创建这个名字。该方法的文本用什么语言是没有关系的,因为文本没有被翻译,所以不管AUT运行于什么样的语言环境下文本仍然是相同的。下面是一个AUT的开发者如何实现这个功能的示例:
fileMenu = new QMenu(tr("File"));//text will be translated fileMenu.setObjectName(file_menu_mainwindow);//text won't be translated
不幸的是,问题仍未解决,即使当给Qt对象赋一个显式的名字时,Squish会继续使用它们的text属性。解决这个问题的一个方法是从Squish对象名字中移除所有的属性,除了type 和 name 属性(name属性是对应于Qt 对象的name 属性的Squish的name)。一个更方便的解决方法是控制Squish如何产生对象名字,因此它将会自动的为拥有非空Qt 对象名字的AUT对象使用type
和name属性,而为那些Qt对象名字为空的属性使用Squish的标准方法。
2.9.3 以编程方式翻译对象名字
另一种处理国际化AUT的方法是自动的按需创建具体区域对象map,自动地加载区域相关的对象map代替默认的对象map。
一种实现上述功能的方法是写下一个测试脚本函数(可能以全局脚本的形式存储的),该脚本读取原始对象map(该map使用,描述English 文本),然后使用当前地区的语言(例如,Finnish)写出一个新的对象map,然后加载新创建的对象map。
不幸的是,翻译对象map还是不够的,因为‘items’的文本可能不在对象map中。对于这些情况,我们需要使用我们自定义的翻译函数,并将它应用于相关的文本。例如,给出的已记录一行:
activateItem(waitForObjectItem(":File_QMenu", "Quit"))我们需要将它改成这样:
activateItem(waitForObjectItem(":File_QMenu", i18n("Quit")))假设我们自定义的翻译函数叫i18n。
相关文章推荐
- 使用VS开发Qt项目时编译速度慢的问题解决
- Qt共享内存实现进程间通信(QSharedMemory)
- QTP自动化测试之VBScript对象
- QTP自动化测试之VBScript基础(下)
- QTP自动化测试之VBScript基础(上)
- Qt 实现excel加法
- Qt 查询文档
- Qt的QTabelWidget
- MQTT常见问题
- 关于Qt的事件循环以及QEventLoop的简单使用
- pyqt学习
- QT无法编译#include *.moc的项目,报No such file or directory
- VTK6.2 Qt5.4.0 VS2013
- Qt从零开始制作串口调试助手-(第十章、串口接收数据处理)-Creator_Ly
- QT中文乱码
- Qt5.5制作简单的屏幕截图程序
- Qt中快捷键使用
- Qt环境下利用OpenGL显示三维模型
- Qt Creator 调试器未设置的解决办法(转
- Qt 容器类学习