Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 记录用于GUI测试的鼠标单击事件。什么比像素坐标更可靠?_C++_Qt_Macros_Mouse_Gui Testing - Fatal编程技术网

C++ 记录用于GUI测试的鼠标单击事件。什么比像素坐标更可靠?

C++ 记录用于GUI测试的鼠标单击事件。什么比像素坐标更可靠?,c++,qt,macros,mouse,gui-testing,C++,Qt,Macros,Mouse,Gui Testing,我一直在编写一些GUI测试框架,通过记录鼠标和键盘事件并重放它们,可以记录和重放一些GUI用户场景 鼠标事件当前记录为(按下或释放,(x,y))。然而,这是非常脆弱的,因为如果只有目标小部件移动了几个像素,但结构和其他一切保持不变,testcase就会停止工作 有什么更好的方法可以做到这一点?一些我能想到的事情 在小部件及其父小部件的树中记录目标小部件的“树路径”。即(按下或释放,(顶层、第一个子、第二个子、目标)),其中“子列表”是Qt的QObject子列表返回的内容。我认为这有一个缺点,即

我一直在编写一些GUI测试框架,通过记录鼠标和键盘事件并重放它们,可以记录和重放一些GUI用户场景

鼠标事件当前记录为
(按下或释放,(x,y))
。然而,这是非常脆弱的,因为如果只有目标小部件移动了几个像素,但结构和其他一切保持不变,testcase就会停止工作

有什么更好的方法可以做到这一点?一些我能想到的事情

  • 在小部件及其父小部件的树中记录目标小部件的“树路径”。即
    (按下或释放,(顶层、第一个子、第二个子、目标))
    ,其中“子列表”是Qt的
    QObject
    子列表返回的内容。我认为这有一个缺点,即现在的测试依赖于内部代码结构

  • 为每个可测试的小部件指定一个唯一的名称,并在重播时使用该名称搜索小部件。这似乎是一项不容忽视的开销

还有其他想法吗?通常公认的“最佳”方法是什么?

规范 测试用例在多大程度上绑定到特定的测试设置和代码更改,由您决定。这本质上是一个你的规格有多严格的问题

一方面,存在“机械”或“哑”测试。这可能是因为您在严格控制初始条件下进行测试:在测试之前预先设置了相同的初始窗口位置设置,实施了相同的平台样式,提供了相同的字体等。因此,如果您在小部件中切换两个按钮,或更改初始窗口/对话框大小,测试应该失败

另一方面,还有“人类”测试。如果从纸上阅读脚本的人能够在测试中成功,那么您可能希望测试成功。在这种情况下,字体、视觉元素的位置等细微变化并不重要:人类测试人员很容易适应这些变化

这两个极端甚至可能同时适用,但适用于应用程序的不同部分或产品生命周期的不同阶段

如果你正在为航空航天飞行管理系统设计一个用户界面,有些方面可能需要一个完全“机械”的、不可适应的测试,因为用户界面的任何变化,如果没有被规范的变化所覆盖,实际上都是一个bug

如果您正在设计一个消费类应用程序,您可能希望在bug修复或小版本中严格遵守规范,但是可以在大版本中放松这一点,例如

来自测试用例和测试代码的协作 在实现更灵活、更人性化的测试时,需要测试代码或测试用例生成过程的一些合作,或者两者都需要

测试用例生成过程(测试脚本、人员等)对特定事件的含义有重要的了解。例如,点击一个普通按钮实际上是指向按钮的中间——那么按钮的活动区域是否有对点击没有反应的圆角并不重要。单击也可能指向标记为“确定”的按钮,无论该按钮位于特定平台上按钮栏的右边缘还是左边缘


测试代码还具有关于特定事件分类的重要知识。例如,如果是在绘画程序的画布上单击,则单击的坐标本身可能很重要。否则,它可能是小部件中重要的特定视觉元素,而不是它的精确坐标。在后一种情况下,由于平台样式或代码更新而对小部件外观的更改可能会使相对坐标过时。

我将采用两种方法的组合:基于层次和目标属性的方法。你需要为每个对象生成唯一的名称。我同意@vahancho的观点,如果你不打算使用基于坐标的系统(一种合理的方法),那么你必须找到另一种识别小部件的系统——唯一的命名方案是一种合理的选择。