如果未执行任何测试,则PHPUnit应失败

如果未执行任何测试,则PHPUnit应失败,php,phpunit,gitlab,Php,Phpunit,Gitlab,我使用PHPUnit在Gitlab CI服务器上执行单元测试。如果未执行任何测试,则生成过程可能会出错(例如自动加载问题) 有没有办法告诉PHPUnit命令行运行程序,如果没有执行测试,它应该以代码1退出?如果没有测试,PHPUnit就没有任何东西可以标记为失败。因此,PHPUnit不能这样做。你可以使用的是塞巴斯蒂安·伯格曼的另一个工具 这件事已经发生了。在运行phpunit之前运行该命令,处理结果,如果计数为0,则从脚本中退出1 更新,我刚刚意识到我错过了早些时候要做的明显的事情 一个简单

我使用PHPUnit在Gitlab CI服务器上执行单元测试。如果未执行任何测试,则生成过程可能会出错(例如自动加载问题)


有没有办法告诉PHPUnit命令行运行程序,如果没有执行测试,它应该以代码1退出?

如果没有测试,PHPUnit就没有任何东西可以标记为失败。因此,PHPUnit不能这样做。你可以使用的是塞巴斯蒂安·伯格曼的另一个工具

这件事已经发生了。在运行
phpunit
之前运行该命令,处理结果,如果计数为0,则从脚本中退出
1


更新,我刚刚意识到我错过了早些时候要做的明显的事情

一个简单的方法是:

 count=$(./phploc.phar --count-tests src | awk '/Tests/{getline; print}' | awk '{print $NF}') && [ "${count}" -ne "0" ]
exit $?
下面的大部分命令分解都适用,所以我将保持原样。主要区别在于结尾处:

[ "${count}" -ne "0" ]
exit $?
这基本上意味着:将
${count}
0
进行比较,如果不匹配0,比较将以状态0退出,如果为0,则退出状态为1。然后,我们在自己的
exit
语句中简单地重用退出状态:
exit$?
基本上是说:退出时的退出状态与上次的退出状态相同


使用以下命令可以获得获取要查找的退出状态的简单命令:

 count=$(./phploc.phar --count-tests src | awk '/Tests/{getline; print}' | awk '{print $NF}') && [ "${count}" -eq "0" ] && exit 1 || exit 0
把它分解一下:

./phploc.phar --count-tests src
这基本上是在src目录上运行
phploc
,输出将包含一个类似以下内容的部分:

Tests
    classes      123
    methods      1234
我们所追求的是
测试后的行。因此,命令的输出被传递给awk,它将匹配
测试
,获取下一行并打印它(即:
classes 123
)。这在这里发生:

| awk '/Tests/{getline; print}'
该字符串再次传递给awk,以提取最后一部分(找到的实际测试数):

该值将被分配给
count
,因为我们是这样运行这些命令的:

count=$(phploc | awk | awk)
因此,最终的输出被分配给
count
。接下来,我们想看看测试计数是否为零,基于此,我们需要以零或非零状态退出。这是我们可以轻松做到的:

 [ "${count}" -eq "0" ] && exit 1 || exit 0
这基本上是以下内容的简写:

if [ "${count}" -eq "0" ]; then
    exit 1
else
    exit 0
fi
这要感谢短路求值:如果
[“${count}”-eq“0”]
求值为true,则需要求值
&&
子句,这是一个
出口1
语句,返回所需的非零出口代码

如果省略
| | exit 0
,最后一个状态代码将是
[“${count}”-eq“0”]&exit 1
求值的结果,这是false,导致状态代码为1。为了避免这种情况,我们必须添加
| | exit 0

您可以通过在CLI上编写类似以下内容来轻松检查:

foo="bar" && [ "${foo}" -eq "123" ] && echo 'foo matched 123'
//run this, then run
echo $?
输出为1(最后一个命令的退出状态)


最后更新 如果单元测试的运行时间不超过几分钟,并且您不在乎运行两次,那么您可以检查phpunit的输出。在删除tests目录后,我很快尝试在我正在处理的一个项目上运行phpunit5.4.6。输出是这样的:

PHPUnit 5.4.6 by Sebastian Bergmann and contributors.



Time: 51 ms, Memory: 8.50MB

No tests executed!
如此运行:

vendor/bin/phpunit | grep -q 'No tests executed'
如果没有测试,则生成退出状态0;如果有测试,则生成退出状态1。只需检查退出状态,然后使用相反的代码退出。类似的方法可能会奏效:

vendor/bin/phpunit | grep -q 'No tests executed' && exit 1 || exit 0

非常感谢你详尽的回答。我一定要试试这个!您认为将此功能添加到phpunit中值得吗?可能有一个param
——没有测试失败,退出代码1。@wuethrich44:很可能不会添加类似的内容。它超出了测试框架的范围(即它用于测试代码,而不是在未测试的情况下使构建失败)。事实上,PHPUnit背后的人为这项工作创建了一个单独的工具,这告诉我这不太可能很快发生。。。即使如此,除非深入进行静态代码分析,否则几乎不可能确定测试的数量。在PHP7之前是完全不可能的事情…也许在这个相关的答案下面放一条评论,由Bergmann himeslf发布,以得到一个明确的答案(或者打开一个github问题):你是对的。再次感谢你的帮助。我将使用上次更新。
vendor/bin/phpunit | grep -q 'No tests executed' && exit 1 || exit 0