Perl测试脚本可以检测它是否从并行线束运行?

时间:2012-02-20 12:32:25

标签: perl testing parallel-processing

问题是:

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

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

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

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

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

更新

虽然有很多方法可以让你的测试脚本知道它是在并行线束中运行的(参见下面的Brian的答案),但是没有一种标准方法这样做,我认为可能有(但没有在我的问题中正确地说明这一点)。

我在考虑类似的东西,嗯,好吧,我在你的(伟大的!)有效Perl编程书中读到它,brian,类似于维护者测试,而不是确定现在这个术语,你通常只在你是模块的维护者时运行,而不是在用户计算机上安装时。似乎记得有一个使用一些环境变量的惯例。

4 个答案:

答案 0 :(得分:4)

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

您可以通过以下几种方式:

  • 如果您使用prove,请为-j3编写一个包装器以设置环境变量。
  • 如果Test::Harness参数获得jobs参数并在您的配置中为prove指定子类,请创建自己的prove子类。
  • 请勿使用{{1}}(我最喜欢的)。
  • 使用测试程序中的信号量注意另一个测试程序具有控制权
  • 将外部互动部分移动到一个公共图书馆,该公共图书馆可以告诉其来电者是否已有人控制
  • 许多其他事情

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

我认为可以使用调用方来执行此操作-(caller(4))[0]会假设返回从其调用的参数-可能是j3-值得与呼叫者的其他值。

我认为值得在此线程上提及它,因为该线程通常也是检测何时从线束或测试中调用脚本的首选,(调用方)[1]是我所知的最佳方式如果某项测试是作为测试的一部分开始的

答案 3 :(得分:0)

我在prove中检测执行情况有一些相似的需求。如果我使用Test::More::diag()运行整个测试套件,我想抑制prove的输出。但是当手动执行一个测试时,我要做要查看这些诊断消息。我通过检查STDERR是否已连接到终端来进行此操作。

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

除了在prove环境中使用外,我认为这是有意义的,其想法是,如果将STDERR显示给人类,则可以假设是交互式使用,并且更加健谈。