Tests

引言#

我们使用 TextTest 来测试软件是否仍然按预期运行。TextTest 比较应用程序的文件输出,包括输出到 stdout 和 stderr 的内容,与预定义的文件输出。

这种方法有一些优点和缺点。一方面,你可以通过将所有输出与你认为正确的文件进行比较,来保证应用程序正在做你想要的事情。但这也是这种方法的问题所在:你无法保证你用来比较当前输出的文件正确的——你必须准备它们一次,并在每次预期结果更改时再次更新/验证它们。

目前,我们所有的测试都在每个夜晚运行,结果发布在这个摘要网页上。

设置#

我们使用 TextTest 4.x 作为我们的测试环境,它基于 Python,目前支持 Python 3。要在 Linux / MacOS 上安装它,你可以打开终端并输入:

pip3 install texttest

对于一个“纯净”的 Python 安装,可能需要以下内容来使 TextTest 正常工作:

pip3 install gobject PyGObject psutil

对于 Windows,你应该从 SourceForge 项目页面 下载并运行安装程序。

它可能不会引入所有依赖项,因此在某些情况下,你需要遵循 TextTest 安装说明 和那里的附加信息。

对于 MacOS,以下命令应安装所有依赖项:

brew install python py3cairo pygobject3 gtk+3 adwaita-icon-theme

如果安装成功,执行 ***<SUMO_HOME>***/tests/runAllTests.bat (Windows) 或 ***<SUMO_HOME>***/tests/runTests.sh (Linux, macOS) 后将出现此窗口。

自定义配置#

添加到个人配置文件 $HOME/.texttest/config 的常用选项包括使用的 diff 查看器、编辑器以及在程序启动时折叠静态测试套件的标志。例如:

   diff_program:meld
   view_program:geany
   static_collapse_suites:1

推荐的 Python 包#

有几个包被测试下的工具所使用。因此,如果你想运行“工具”和/或“复杂”测试,请执行:

pip3 install -r $SUMO_HOME/tools/requirements.txt -r $SUMO_HOME/tools/req_dev.txt

运行测试#

$SUMO_HOME/tests 文件夹中,你可以找到用于 Windows 的批处理文件和用于 Linux & macOS 的 shell 文件,这些文件启动 TextTest 及其测试套件。runAllTests.bat (Windows) 或 runTests.sh (Linux, macOS) 启动 TextTest 以测试文件夹中的所有应用程序,runNetconvertTests.bat (Windows) 将只显示 netconvert 的测试,runDuarouterTests.bat (Windows) 只显示 duarouter 的测试,依此类推。对于 Linux 和 macOS,你可以通过命令行使用,例如 runTests.sh -a duarouter

向现有应用程序添加测试#

最简单的方法可能是使用 TextTest GUI 上下文菜单功能(复制/粘贴)复制现有测试。然后,你可以修改复制的输入文件,运行一次测试并保存预期结果。请注意,输入文件可能会沿着文件夹层次结构被拾取,因此如果这些继承的输入文件也需要更改,你可能必须手动将其他文件复制到你的测试文件夹中。

添加应用程序测试套件#

要为新应用程序添加测试套件,你必须执行以下步骤。在下面的例子中,我们将使用 "polyconvert" 作为示例应用程序。

  • 转到 $SUMO_HOME/tests
  • 复制一个 run...Tests.bat 文件并正确重命名(在我们的例子中是 runPolyconvertTests.bat);更改其中的应用程序名称。在我们的例子中,生成的文件将如下所示:
call %~dp0\testEnv.bat %1
start %TEXTTESTPY% -a polyconvert
  • 将应用程序添加到每晚测试的应用程序列表中
    • 将其添加到 runTests.sh;在我们的例子中,添加了以下行:
export POLYCONVERT_BINARY="$SUMO_BINDIR/polyconvert"
  • 将其添加到 testEnv.bat;在我们的例子中,添加了以下行:
set POLYCONVERT_BINARY=%~dp0\..\bin\polyconvert%1.exe
  • 为应用程序构建一个测试文件夹,以应用程序本身命名(不带 ".exe" 扩展名),在我们的例子中,文件夹名为 polyconvert
  • 进入该文件夹
  • 构建一个配置文件;其名称是 "config",扩展名是要测试的应用程序的名称,所以在我们的例子中是 config.polyconvert。请查阅 TextTest 文档以了解内容,尽管如此,这里有一些注意事项:
    • 不要忘记导入主配置文件 (config_all)
    • 正确命名二进制文件
    • 在输出中正确命名文件名
    • 在所有需要比较的文件中,应忽略 Version——测试应适用于所有版本

初始文件如下所示:

import_config_file:../config_all
binary:$POLYCONVERT_BINARY
copy_test_path:input_net.net.xml
[collate_file]
config:config.cfg
log:log.txt
[run_dependent_text]
output:polyconvert.exe{REPLACE polyconvert}
net:Version
  • 构建一个顶级测试套件文件;其名称是 "testsuite",扩展名是要测试的应用程序的名称,所以在我们的例子中是 testsuite.polyconvert
    • 我认为,从元输出的测试开始是个好主意;只需从另一个应用程序复制它们并修补文件名...

使用示例#

现有测试的主要功能是验证函数的修改不会影响最终输出,将我们在 SUMO 中修改后的输出与之前测试过的输出控制文件进行比较。请注意,SUMO 必须在发布模式下编译以进行测试。为了展示一个使用示例,将修改 MSDevice_Battery.cpp 文件以在输出文件 battery.xml 中包含一个错误。修改该行后,运行可执行文件 runSumoTests.bat,找到测试 sumo/extended/electric/braunschweig,然后右键单击以运行测试。

手动错误

运行测试

执行后可以观察到 battery.sumo 文件被标记为红色。这意味着我们对 SUMO 的修改生成的电池输出与预期不同。如果标记为红色的文件是 errors.sumo,则意味着我们对 SUMO 的修改导致了运行时错误,最后,如果标记为红色的文件是 output.sumo,则意味着 SUMO 在执行期间生成了一些警告。双击红色框 battery.sumo 会自动打开 ''TkDiffv,并显示我们的电池输出与原始电池输出控制文件的差异。

battery.sumo 中的错误

比较两个 battery.sumo 的错误详情

此时,我们撤销了在 MSDevice_battery.cpp 中导致错误的修改,并进行编译。编译完成后,我们再次右键单击失败的文本并按重新运行。将打开一个新对话框,然后单击接受,测试将重复进行。新的测试运行后没有显示错误。

撤销错误

重复测试

单击绿色消息 Succeeded 旁边的复选框后,可以观察到所有输出都显示为绿色,并且在底部出现一条消息,表明测试已成功。

测试成功

测试成功的详情

测试的组织#

我们的 TextTest 测试可以分为以下描述的类别

应用程序测试#

这些测试用于 bin 文件夹中的可执行文件,例如 netconvertduaroutersumo。它们的工作原理是使用一组预定义的输入文件运行一次应用程序,并与预期的输出文件进行比较。sumo 的测试会分别运行一次带 GUI 版本和一次不带 GUI 版本。

工具测试#

这些测试用于 tools 文件夹中的 Python 工具,例如 randomTrips.pyflowRouter.py。它们不是为每个工具定义一个新的应用程序(这是 TextTest 的标准做法),而是都调用 tests/toolrunner.py 脚本,并通过选项选择要测试的实际 Python 工具。请注意,要使用的脚本总是列在选项文件的最后(这是因为 TextTest 会尝试巧妙地重新排序选项)。

复杂测试#

这些测试超出了单次调用应用程序的范围。每个测试都定义了一个 runner.py 脚本,该脚本执行任意的应用程序调用。这用于多次调用 netconvert 以执行来回格式转换,或用于测试教程,其中首先生成网络,然后执行模拟。它们也用于测试 traci Python 客户端(在这种情况下,runner.py 是一个 traci 脚本)。

交互式 GUI 测试#

这些测试目前仅对 netedit 激活,并在页面 Developer/GUI_Testing 中有更详细的描述。

额外测试#

这些测试使用附加选项或不同的 Python 解释器运行上述一个或多个测试套件,通常不使用批处理文件运行,而是使用 runExtraTests.py。要启用 python3 测试,你需要在你的 PATH 中有一个名为 python3 的可执行文件(在 Linux 上通常都有)。在 Windows 上,你需要通过将现有 python3 安装目录中的 python.exe 复制为 python3.exe(在同一目录中)并将该目录添加到你的 PATH 末尾(如果尚未添加)来添加它。

在 TextTest 之外运行测试#

提取 TextTest 测试(离线和在线)的不同方法在此处进行了解释。

为 Python2 和 Python3 开发#

SUMO 是向下兼容的,因此贡献的代码应该能够同时在 Python 2.7 和 Python 3.5 及以上版本运行。在 Windows 上,你可以使用 Python 启动器来访问两个 Python 版本,或者使用像 paiza.io 这样的免费在线工具来检查兼容性。如果你的库不支持两个 Python 版本,例如你的库不可用,你当然应该优先选择 Python3。