如何在运行“cover -test”时收集子进程的覆盖率,而不是其他情况? (开发::封面)

2023-12-28

(我想我已经看到了这个问题的答案,但我找不到了。我遇到的最接近的是这个问题 https://stackoverflow.com/q/24420346/2877364).

我正在黑客攻击prt https://metacpan.org/pod/distribution/App-PRT/script/prt并正在尝试获取我的更改的完整覆盖数据。我的一些新测试调用system($^X, 'prt', ...)运行子进程。然后我测试这些过程的输出。但是,Devel::Cover 不会收集子进程中的覆盖率数据。如何收集该数据,而不导致 Devel::Cover 在我执行常规操作时运行make test?目前我有一个丑陋的解决方法(见下文),但我认为必须有一个更简单的方法。

完整的 MCVE 是here https://github.com/cxw42/multi-process-devel-cover-test。为了方便起见,复制命令行:

git clone https://github.com/cxw42/multi-process-devel-cover-test.git ; cd multi-process-devel-cover-test ; perl Makefile.PL ; make ; cover -test

注释掉第11行t/01-help.t对于下面描述的解决方法。

Edit我使用的原因system是要达到 100% 的覆盖率-h/--help/--version。这些开关由Getopt::长 https://metacpan.org/pod/Getopt::Long,这称为exit()自动地。如果需要的话我可以使用-exitval=>NOEXIT并用我自己的代码处理退出。

不起作用的事情

PERL5OPT

$ PERL5OPT=-MDevel::Cover=-silent,1 cover -test
/home/cxw/perl5/perlbrew/perls/perlcygbrew-5.26.2-1/bin/cover shouldn't be run with coverage turned on.

HARNESS_PERL_SWITCHES+cover

$ HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 cover -test
...
t/01-help.t .. # Devel::Cover not covering
...
----- ------ ------ ------ ------ ------ ------ ------
File    stmt   bran   cond    sub    pod   time  total
----- ------ ------ ------ ------ ------ ------ ------
Total    n/a    n/a    n/a    n/a    n/a    n/a    n/a
----- ------ ------ ------ ------ ------ ------ ------

HARNESS_PERL_SWITCHES+EUMM make test

$ HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 make test
...
t/01-help.t .. # Devel::Cover not covering
...
$ (export HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 ; make test)
...
t/01-help.t .. # Devel::Cover not covering
...

目前的解决方法

目前我找到的唯一办法就是手动添加-MDevel::Cover当我调用时到命令行system。灵感来自这个答案 https://stackoverflow.com/a/24429239/2877364 and 相应的测试 https://github.com/pjcj/Devel--Cover/blob/7f365d2e412675bc741adef43d6cc9353cf1885b/t/internal/criteria.t#L10-L18,我有以下解决方法:

# Detect whether Devel::Cover is running
my $is_covering = !!(eval 'Devel::Cover::get_coverage()');
my @perl = ($^X, $is_covering ? ('-MDevel::Cover=-silent,1') : ());
diag $is_covering ? 'Devel::Cover running' : 'Devel::Cover not covering';

# Pass the Devel::Cover option, if any, to the child process
system(@perl, 'prt', ...);

在 MCVE 中,解决方法是here https://github.com/cxw42/multi-process-devel-cover-test/blob/5395b4f0894790db01773a4f90c4713110f39e63/t/01-help.t#L9-L12它被使用here https://github.com/cxw42/multi-process-devel-cover-test/blob/5395b4f0894790db01773a4f90c4713110f39e63/t/01-help.t#L25.


我认为这或类似的事情可能是你能做的最好的事情了。

Devel::Cover 几乎被设计为一种开发工具,因此假设您一次将测试一个项目。看来你真的想在这里测试两个项目。如果情况并非如此,那么也许有比使用系统更好的组合部件的方法?

但是,如果您当前的解决方案是组合此代码的最佳方法,那么我不确定是否有更好的方法来获得完整的覆盖。例如,如果您想要覆盖,您可能可以明确地设置一个环境变量,或者您可以设置 $PERL5OPT 而不是更改系统调用,但本质上这是相同的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在运行“cover -test”时收集子进程的覆盖率,而不是其他情况? (开发::封面) 的相关文章

  • 如何在 perl 中合并两个数组,交替每个数组中的值

    假设我有 2 个如下所示的数组 a1 Vinay Raj harry b1 dude rock 合并后我想要这样的结果 Vinay dude Vinay rock Raj dude Raj rock harry dude harry roc
  • Perl 的反引号、system 和 exec 有什么区别?

    有人可以帮帮我吗 在 Perl 中 以下之间有什么区别 exec command and system command and print command 还有其他方法可以运行 shell 命令吗 exec 执行命令并一去不复返 这就像一个
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • Perl:测试输入阅读器?

    有没有一种方法可以使用标准 Test 等模块自动测试 Perl 程序是否正在读取输入 例如标准输入正确吗 例如 测试一个从 STDIN 读取两个整数并打印它们之和的程序 这不是 100 清楚你的意思 我会回答假设你想编写一个测试脚本来测试你
  • 在 Windows 7 中使用 ActivePerl @ARGV 为空

    我有以下 Perl 脚本 我正在尝试使用 ActivePerl 在 Windows 7 中运行它 c Perl64 bin perl exe w use strict my mp3splt exe c Program Files x86 m
  • Intellij IDEA 代码覆盖率不起作用

    当我尝试运行具有覆盖范围的 JUnit 测试时 我收到以下错误 FATAL ERROR in native method processing of javaagent failed java lang reflect Invocation
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • 如何彻底删除 Perl 中的包?

    如何在 Perl 中彻底删除一个包 这不仅意味着包变量 还意味着 Perl 更新以处理继承更改和其他事情的任何魔术表 这个简单的测试 use warnings use strict use Test LeakTrace use Symbol
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • perl - 子进程向父进程发送信号

    我编写了以下代码来测试孩子和父母之间的信号传递 理想情况下 当子进程向父进程发出 SIGINT 时 父进程应该在新的迭代中返回并等待用户输入 我在 perl 5 8 中观察到了这一点 但在 perl 5 6 1 我被要求使用 中 父级实际上
  • Perl `join` 生成多行字符串

    我有这个程序来对两个数组进行排序 usr bin perl w movies movies txt open FHD movies die could not open movies n movies
  • 我使用 TT(perl 模板工具包)获得额外的 CR

    我使用 perl v5 10 在 Windows 7 上 TT v2 22 当我使用 TT 时 对于每个源代码行 我都会在生成的 html 中获得一个额外的内容CR 源文本 Windows 格式 Some html CR LF 输出文本 S
  • 如何在 Perl 中使用变量作为模块名称?

    我知道可以在 Perl 中使用变量作为包变量的变量名 我想使用变量的内容作为模块名称 例如 package Foo our names blah1 blah2 1 在另一个文件中 我希望能够将标量的内容设置为 foo 然后访问中的名称数组F
  • 如何从 Perl 中的文本文件中提取/解析表格数据?

    我正在寻找类似的东西HTML 表格提取 http search cpan org dist HTML TableExtract 只是不适用于 HTML 输入 而是适用于包含采用缩进和间距格式化的 表格 的纯文本输入 数据可能如下所示 Her
  • 如何在node.js子进程模块中将消息以及标准输出从子进程传递到父进程?

    我的子进程模块有问题 特别是 child spawn 和 child fork 我依赖 child process fork 的文档 其中表示 这是 child process spawn 功能的一个特例 生成 Node js 进程 除了将
  • 与 6 位随机字母数字代码发生冲突的概率是多少?

    我使用以下 Perl 代码生成随机字母数字字符串 仅限大写字母和数字 用作 MySQL 数据库中记录的唯一标识符 数据库的行数可能会保持在 1 000 000 行以下 但实际的绝对最大值约为 3 000 000 行 我是否有 2 条记录具有
  • Xcode 代码覆盖率和 fopen$UNIX2003

    我面临着一个似乎相当广泛的问题 当我使用 Lion 激活 Xcode 4 2 1 中的代码覆盖率时 它显示以下错误 Detected an attempt to call a symbol in system libraries that
  • 如何检测FTP文件传输完成?

    我正在编写一个脚本 用于轮询 FTP 站点上的文件并在可用时将它们下载到本地 文件由各个来源方随机存放到 FTP 站点 我需要一种方法能够在下载之前检测 FTP 站点上的文件是否已被源方完全传输 关于如何解决这个问题有什么想法吗 如果您可以

随机推荐