【问题标题】:Can a Perl test script detect whether it's being run from a harness in parallel?Perl 测试脚本能否检测到它是否是从线束并行运行的?
【发布时间】:2019-06-06 07:21:30
【问题描述】:

问题是:

Manipulating external state in a test file reduces the possible parallelism of your test suite.

我正在测试的是精确地操纵外部状态(然后重置它)。

大部分时间我仍然希望并行运行。然后,我只想跳过会操纵外部状态的测试,这可能会使其他人失败。

所以我会通过检测并行条件来解决这个问题,然后跳过会操纵外部状态的测试,从而导致其他人失败。那可行吗?怎么样?

请注意,仅从脚本中解析环境变量 HARNESS_OPTIONS 不足以检测条件:例如,prove -j3 不会设置它。

更新

虽然有很多方法可以让您的测试脚本知道它正在并行线束中运行(请参阅下面 Brian 的回答),但我认为没有一种标准的方法这样做可能有(但在我的问题中没有正确表述)。

我在想类似的东西,嗯,嗯,我在你的(太棒了!)Effective Perl Programming 书中读到了,brian,类似 maintainer tests,而不是现在确定该术语,通常仅当您是模块的维护者时才运行该术语,而不是在用户计算机上安装期间。似乎记得有一个使用一些环境变量的约定。

【问题讨论】:

    标签: perl testing parallel-processing


    【解决方案1】:

    prove 命令会创建测试工具对象本身,因此它将参数直接传递给测试工具类的构造函数(通常是TAP::Harness)。你看不到这些论点。

    这里有几种方法:

    • 如果您使用-j3,请为prove 编写一个包装器以设置环境变量。
    • 如果获得jobs 参数并在配置中为prove 指定子类,则创建自己的Test::Harness 子类以执行相同操作。
    • 不要使用prove(我最喜欢的)。
    • 使用测试程序中的信号量来说明另一个测试程序具有控制权
    • 将外部交互部分移动到一个公共库中,该库可以告诉调用者是否有人已经拥有控制权
    • 许多其他事情

    【讨论】:

    • 你能调查一下$0,够吗?
    • @JoelBerger, $0 只是测试脚本的名称,无论是否在prove 下运行。不明白你的意思。 @brian,谢谢,看起来没有标准的方法或变量来检测并行条件。不确定。然后,构建自定义解决方案是合理的。 TAP::Harness 有一个 rules 配置选项,它被标记为实验性但看起来很有希望。
    • @Lumi,你当然是对的,我认为那是 nyquil 说话。
    【解决方案2】:

    我正在研究这个问题的替代解决方案:How to run some but not all tests in a Perl test suite in parallel?

    我的路径是修补 prove 以添加像 --serial-tests FILE 这样的选项,该选项将引用一个列出必须始终串行运行的测试的文件。您可以“设置并忘记它”,然后根据需要使用“-j”选项。如果您碰巧指定了其中一项测试,其余测试将并行运行,但这些测试仍将串行运行。

    这对我来说似乎比避免运行测试或将它们分成自己的测试运行更可取。

    今晚我有一个有效的概念证明,我将与证明的维护者分享。我将通过另一个 Q/A 页面发布进一步的进度说明。

    【讨论】:

      【解决方案3】:

      我认为可以使用调用者来做到这一点 - (caller(4))[0] 将假设返回它被调用的参数 - 可能是 j3 - 值得与调用者的其他值。

      我认为值得我在此线程上提及它,因为该线程通常也是检测何时从线束或测试调用脚本的第一个命中,(调用者)[1] 是我见过的最好的方法如果某件事是作为测试的一部分开始的

      【讨论】:

        【解决方案4】:

        我对检测prove 内的执行也有类似的需求。如果我使用prove 运行整个测试套件,我想抑制Test::More::diag() 的输出。但是当手动单独执行测试时,我确实希望看到这些诊断消息。我通过检查 STDERR 是否连接到终端来做到这一点。

        diag("prove will not see this message") if (-t STDERR);
        

        我认为这不仅仅在 prove 环境中使用是有意义的,其想法是,如果 STDERR 被显示给人类,那么假设交互使用并且更加健谈。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-19
          相关资源
          最近更新 更多