我有以下问题:给定一个Swing GUI应用程序(包括源代码),我如何确定两个组件(例如:JButtons,JList等)是等效的(以相同的用户代码执行的方式)他们生成的同一事件)。
我的观点是,首先他们需要为所有可用事件以相同的顺序拥有相同的监听器(我只谈论应用程序本身添加的监听器),然后这些监听器的代码不能取决于生成的事件的来源(因此不应在其代码中调用“Action Command”或e.getSource())。
这是关于我正在研究的GUI应用程序的研究项目,我正在尝试研究如何通过检测等效组件来减少GUI测试用例的数量。如果您对此有任何想法(也许我没有考虑到某些因素)请分享。
感谢。
答案 0 :(得分:2)
就个人而言,我觉得这取决于你对“等效”的定义。根据您的定义,这意味着“在应用程序生成事件时会发生同样的事情”。 但是,通过“同样的事情”,这是指用户视角还是程序员视角?
如果是前者,则问题是多余的,因为用户仅需要检查不同的动作是否导致相同的视觉结果以确定它们是否相等。然而,这需要进一步考虑 - 两个小部件的直接视觉结果可能是相同的,但从长远来看,这些动作对于用户可能不是“等同的”。例如按A键,观察A;但是如果你做了一个列表选择B,你再次观察A,但是,一些不明显的事件B可能会发生,而用户没有检测到。从长远来看,这可能会影响事情。因此,从用户角度来看,等效可能是一个棘手的问题。
后一种情况难以分析。正如您所提到的,有一种方法可以共享相同的Listener,即使用相同的方法来处理这两个小部件。他们可以选择使用不同的监听器,甚至可能使用不同的方法,但如果两种方法基本上遵循相似的逻辑或目的,它们可能是“等效的”。但是,这可能是特定于案例的,可能是一个非常细微的主题(比较方法)。
另一个想法:您也可以选择在窗口小部件上的各种不同测试和输入上运行实验,并获得一些统计值,以便为您的比较分配确定性度量(例如,这些窗口小部件相当于提供的输入的80%以上)。这可能适用于比较文本输入,例如JTextArea和JTextField。
您的假设可能也会影响您对等效的定义。例如假设这些输入,A和B是等价的。
这些只是我的一些想法和意见。毕竟,它是一篇研究论文。希望我提供了一些值得思考的东西。
修改强>
我认为事件本身的检测是一个微不足道的细节。它如何处理事件是重要的。基本上你的问题归结为:是否有某种方法来比较特定事件的事件处理程序。老实说,我不确定如何做到这一点(比较堆栈可能,检查代码冗余,检查is-a关系)。老实说,我不知道如何进行这样的比较。