【问题标题】:Should I use std::system to do scripting parts of Unit Tests?我应该使用 std::system 来编写单元测试的脚本部分吗?
【发布时间】:2013-07-30 09:14:27
【问题描述】:

我的情况是我有一个 C++ 工具的单元测试,其中部分测试需要实际运行一个 test-commandline-tool(这将触发一些我可以在测试中检查的东西一旦测试-工具已结束)。

我认为我使用的 C++ 单元测试框架无关紧要,我的问题与 system("test_tool.exe ...") 的合法使用有关——seemsystem isn't 在 C++ 开发人员的顶级工具列表中(一般来说,恕我直言,这是正确的)。

那么,system 是否已知在单元测试中成功使用?在 UT 环境中使用它来执行知名工具时,我应该预料到会出现什么问题吗?

【问题讨论】:

    标签: c++ windows unit-testing cmd


    【解决方案1】:

    对我来说,system 的用法是可以接受的——但您需要注意“如何检查 test_tool 是否按照所说的进行。

    但是,希望您的整个测试系统具有合理的安全性,因此恶意用户应该比在随机应用程序中普遍使用 system 问题更小。

    当然,编写一些使用CreateProcess 或其他比system 更“不那么邪恶”的变体的代码也不会那么难。使用它可能还会为您提供更多的灵活性和对新启动过程的控制 - 例如您可以监控该过程并告知它何时完成以及它退出的状态,包括检测它是否正常退出或崩溃。

    【讨论】:

    • 使用CreateProcess 可能会更好:他可能需要 1) 指定一些输入,2) 捕获所有输出,包括标准输出和标准错误,以及 3) 捕获他已经开始的过程。鉴于这一切,我不确定system 是否容易得多(但它可能是可移植的,而CreateProcess 不是)。
    • 由于它被标记为 Windows,我认为 Windows 之外的可移植性并不是一个真正重要的因素。如果使用 CreateProcess 的代码足够隔离,那么将其更改为使用 fork()exec() 也不会那么难,真的。
    【解决方案2】:

    如果test_tool 是您已安装的工具,则不应该有 任何问题。您要避免的是使用system 甚至部分来自用户输入的字符串(除非 你真的审查了那个输入),并用它来调用系统 特定的命令(因为您的便携性已经付诸东流)。 关于后者,您可能需要调用测试 使用system( "test_tool ..." ),不使用.exe

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2014-10-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多