黑客语言的代码覆盖工具

Code coverage tool for hack language

是否有 Hack 语言的代码覆盖工具(在 hhvm 上)?

这个问题不是关于在 hhvm 上运行的 PHP 源代码的代码覆盖率(例如可以使用 PHPUnit),而是生成用 hack 语言编写的源代码的代码覆盖率.

Hack 代码的内部表示与PHP非常相似。根据现有代码覆盖率库进行检查的具体方式,它们可能会正常工作。您是否尝试过使用 PHPUnit 通过 Hack 代码编写测试用例?例如,他们的报道可能会奏效!

虽然 OP 在 PHP 单元中 编写 测试代码可能很有用,但大多数 PHP 测试覆盖工具(包括 PHPUnit as I understanding it) 使用 XDEBUG 来收集他们的测试覆盖率数据。我不熟悉 Hack 实现,但我知道它与 Zend 无关......所以它包含 XDEBUG 的可能性似乎有点遥远。 (也许 Hack 完全复制了 XDEBUG?)如果 XDEBUG 在 Hack 下不可用,那些基于 XDEBUG 的覆盖工具实际上无法收集他们需要的数据。

就 Hack 与 PHP 相同的程度而言,我们的 PHP Test Coverage Tool 可能会直接工作。它检测 source 代码,因此不以任何方式依赖于 XDEBUG 的存在。我怀疑 PHPUnit 可以很容易地进行调整。

(如果 Hack 不完全相同,可以修改测试覆盖工具以非常容易地处理更改的语法,因为它基于通用程序转换系统)。

当前版本的 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无法识别它们。

尽管修复非常简单,您可以创建未定义的 class 并从 PHP_Token 扩展它。例如,对于我的项目,我必须创建这些 classes:

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 to detect the executed line and in that project, on HHVM it's using fb_get_code_coverage