在当今的软件开发行业中,对于软件专业人员来说,除了编写高质量的代码之外,测试和验证代码的能力同样重要。ScriptRunner就是这样一款工具,它与传统的单元测试框架如CPP Unit不同,ScriptRunner补充了单元测试的功能,通过模拟用户与软件的交互来显示程序执行中的任何错误。
ScriptRunner最初是为了模拟用户与应用程序的交互而创建的。随着时间的推移,这个工具已经发展成为一种提供简单TRACE库的工具,用于捕获应用程序的状态,并当然,报告程序中的任何错误。
使用CPP Unit或其他框架,可以编写代码来测试函数,传递正确的和错误的值来验证它的行为是否正确。这些工具非常出色,如果选择测试足够重要的函数,可以获得很好的覆盖率,并轻松地在程序中找到错误(或破损的代码)。
但是,一个缺失的方面是如何测试用户界面以实现相同的结果。ScriptRunner可以帮助做到这一点!可以编写一个简单的脚本来与应用程序交互,并使用ScriptRunner TRACE库来显示任何成功或失败。
ScriptRunner是一个脚本宿主应用程序。它提供了一组接口来执行应用程序,操作窗口,并向用户界面提交输入,就像用户通常会做的那样。有几个命令可用于配置和运行测试脚本。
Trace:可以使用Trace按钮直接将trace语句(OutputDebugString)捕获到这个窗口。代码可以通过使用ScriptRunner TRACE库将输出字符串直接发送到这个窗口。脚本也可以使用ScriptHost.DebugOutput函数发送输出。
Stop:Stop Trace将停止捕获调试器输出。
Compare:Compare模式可用于验证程序执行时发送的输出。
Run:Run命令将执行用户界面JavaScript测试单元。
此外,还有几个附加功能可用于过滤程序输出。上下文菜单选项也可用来加载和保存程序输出设置。
ScriptRunner提供了一组API,允许执行多种操作,如显示消息框、发送输出文本到脚本运行器输出、查找特定窗口、发送虚拟键码、发送按键击、等待指定毫秒数、运行应用程序、获取环境变量字符串等。
WindowDispatch API允许获取窗口句柄、获取当前标题文本、更改窗口文本、更改焦点到窗口、显示/隐藏窗口、获取子窗口句柄、移动和重新定位窗口、设置窗口到前台、获取当前窗口的父窗口、移动并定位鼠标到窗口对象、移动鼠标到窗口客户端位置并可选地模拟左键点击、移动鼠标到窗口客户端位置并可选地模拟右键点击等。
ScriptRunner只公开了一个事件处理程序OnStarted。这是推荐的主入口点来运行脚本。在JavaScript中,使用以下原型:
function ScriptHost::OnStarted() {
LaunchApp("C:\\Windows\\System32\\Notepad.exe");
Sleep(500);
var winObj = FindWindow("Notepad", "Untitled - Notepad");
if (winObj) {
winObj.SetForegroundWindow();
winObj.SetFocus();
SendKey(0x74); // F5
SendKeys("Hello CodeProject gurus around the world!\r");
SendKeys("1234567890-=\r");
SendKeys("!@#$%^&*()_+\r");
SendKeys("abcdefghijklmnopqrstuvwxyz\r");
SendKeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ\r");
} else {
Display("Untitled - Notepad window was not found...");
}
}
如前所述,C/C++应用程序可以将输出发送到ScriptRunner输出窗口。为此,需要在解决方案中包含一组文件。
这些文件包括CTracer.h(用于钩子程序中的OutputDebugString调用)、SocketHandle.h和cpp(用于与ScriptRunner通信的Socket API)、HookImportFunction.h和cpp(PJ Naughter的Hook Import函数)。