是否有适用于 Hack 语言的代码覆盖工具(在 hhvm 上)?
这个问题不是关于在hhvm上运行的PHP源代码的代码覆盖率(例如,使用PHPUnit可以),而是生成用黑客语言编写的源代码的代码覆盖率。
当前版本的 PHPUnit(4.4,4.5,4.6) 不会生成覆盖率,并且会失败并出现此错误。
$php phpunit-alpha.phar -coverage-html=cover t/
PHPUnit alpha-2015-01-09 by Sebastian Bergmann and contributors.
PHPUnit alpha-2015-01-09 by Sebastian Bergmann and contributors.
Fatal error: Class undefined: PHP_Token_TYPELIST_LT in phar://phpunit-alpha-2015-01-09.phar/php-token-stream/Token/Stream.php on line 185
我确实同意 Ira 的代码覆盖率使用 XDEBUG。然而,由于某种原因,PHPUnit 还没有决定覆盖 HackLang 代码。
第一次更新:
这是因为 Hacklang 有更多的注册命令(如形状、类型)和更多的结构(lambda),而 php-token-stream 无法识别它们。
不过,修复非常简单,您可以创建未定义的类并从PHP_Token扩展它。例如,对于我的项目,我必须创建以下类:
class PHP_Token_TYPELIST_LT extends PHP_Token {}
class PHP_Token_TYPELIST_GT extends PHP_Token {}
class PHP_Token_TYPE extends PHP_Token {}
class PHP_Token_SHAPE extends PHP_Token {}
class PHP_Token_LAMBDA_OP extends PHP_Token {}
class PHP_Token_LAMBDA_CP extends PHP_Token {}
class PHP_Token_LAMBDA_ARROW extends PHP_Token {}
第二次更新:
PHPUnit正在使用CodeCoverage来检测执行的行,在该项目中,在HHVM上使用fb_get_code_coverage
Hack 代码的内部表示与 PHP 非常相似。根据现有代码覆盖率库进行检查的确切方式,它们可能会正常工作。您是否尝试过使用 PHPUnit 通过 Hack 代码编写测试用例?例如,他们的覆盖范围可能只是有效的!
虽然 OP 用 PHPUnit 编写测试代码可能很有用,但大多数 PHP 测试覆盖率工具(包括我所理解的 PHPUnit)都使用 XDEBUG 来收集它们的测试覆盖率数据。 我不熟悉 Hack 实现,但我知道它与 Zend 无关......所以它包含XDEBUG的可能性似乎有点遥远。 (也许 Hack 完全复制了 XDEBUG?如果XDEBUG在Hack下不可用,那些基于XDEBUG的覆盖工具实际上无法收集他们需要的数据。
在某种程度上,Hack与PHP相同,我们的PHP测试覆盖工具可能会直接工作。 它检测源代码,因此不以任何方式依赖于XDEBUG的存在。 我怀疑PHPUnit可以很容易地适应。
(如果 Hack 不完全相同,可以修改测试覆盖率工具以非常容易地处理更改的语法,因为它基于通用程序转换系统)。