3

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

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

4

3 回答 3

4

当前版本的 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

于 2015-01-10T07:16:53.487 回答
1

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

于 2015-01-10T02:57:46.273 回答
1

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

在某种程度上,Hack 与 PHP 相同,我们的PHP 测试覆盖工具可能会直接工作。它检测代码,因此不依赖于 XDEBUG 的存在。我怀疑 PHPUnit 很容易适应。

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

于 2015-01-10T06:06:21.607 回答