问题是:
Manipulating external state in a test file reduces the possible parallelism of your test suite.
我正在测试的是精确操纵外部状态(然后重置它)。
我仍然希望大部分时间并行运行。然后,我想跳过操纵外部状态的测试,这可能会使其他人失败。
因此,我将通过检测并行性条件来解决此问题,然后跳过将操纵外部状态的测试,从而导致其他人失败。那可行吗?怎么样?
请注意,仅从脚本解析环境变量HARNESS_OPTIONS
不足以检测条件:例如,prove -j3
不会设置它。
虽然有很多方法可以让你的测试脚本知道它是在并行线束中运行的(参见下面的Brian的答案),但是没有一种标准方法这样做,我认为可能有(但没有在我的问题中正确地说明这一点)。
我在考虑类似的东西,嗯,好吧,我在你的(伟大的!)有效Perl编程书中读到它,brian,类似于维护者测试,而不是确定现在这个术语,你通常只在你是模块的维护者时运行,而不是在用户计算机上安装时。似乎记得有一个使用一些环境变量的惯例。
答案 0 :(得分:4)
prove
命令创建测试工具对象本身,因此它将参数直接传递给测试工具类的构造函数(通常为TAP::Harness)。你无法看到这些论点。
您可以通过以下几种方式:
prove
,请为-j3
编写一个包装器以设置环境变量。Test::Harness
参数获得jobs
参数并在您的配置中为prove
指定子类,请创建自己的prove
子类。答案 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显示给人类,则可以假设是交互式使用,并且更加健谈。