例 8. 构造控件的调用栈
NControl.<init>(ControlID,String,INControl) NPushButton.<init>(ControlID,INControl) DlgReplace.getClose() |
2、调用控件方法时,记录调用栈,从中取得第一次调用时的方法名。
例 9A. 点击按钮时的调用栈
NPushButton.click(Point) NPushButton.click () script2.testMain(Object[]) |
例 9B. 操作控件时的调用栈
NComboBox.click() NComboBox.clearText() NComboBox.setText(String) script2.testMain(Object[]) |
当执行自动测试到 DlgReplace.getClose().click() 时,函数调用栈如例 9A 所示。显而易见,最后调用的 click 方法,对应了该次操作。然而大多数情况并没有这么简单,比如在文本框中输入文字时需要执行若干子步骤,包括点击控件,清除文字,和输入文字。这些步骤都在 setText 方法中调用。如例 9B 所示的调用栈。控件的方法可能会相互嵌套,只有第一次调用,才是最便于理解执行步骤的。我们在 click 函数里分析调用栈,能知道调用 click 方法是为了往控件上输入文字,然后记录成 setText。值得注意的是,如果把每个调用栈都转成步骤输入到日志的话,会包括重复并且很有歧义的信息。这就需要引入一个机制避免重复输出。我们的解决办法是每次输出时,将调用栈每行的行号都记录下来。下次输出时把当前的跟原先的比较,如果是一致,表示属于同一次操作,直接忽略掉。
3、记录传入的参数。这个很容易理解,比如调用 setText("hello") 时,把 hello 记录下来。
通过上述三步,我们就可以获得操作步骤的信息。有了这些信息后,需要在合适的位置调用日志函数,将步骤输出到日志中。在 Notes 项目使用的控件库中,所有 Notes 控件有一个基类,这个类定义了 click 方法,控件库的其它类都是由它继承而来。因为几乎所有的 UI 操作都会直接或间接地调用 click 方法,我们只需要在 click 函数开始的时候,组合上面说的四项信息成测试步骤,然后调用日志函数把测试步骤输出到日志文件中。在这里,我们给出的只是基本原理,您可以结合自己项目实际的特点,实现这一功能。
总结
提高测试结果分析效率和自动化测试过程同样重要。本章从测试用例的准备开始,由浅入深地介绍了如何优化测试用例,用例如何记录日志,以及日志能提供什么功能,各个功能又是如何实现。在最后,我们还介绍了自动记录测试步骤的基本原理。希望能够为您提供改进测试日志的思路和指导。在本系列的下一章,我们将会为读者介绍控件库的设计和使用,其中也会介绍录制用例和自动生成对象定义的基本原理,敬请期待。
相关链接: