【问题标题】:How does Gitlab CI determine if a PHPUnit test pass or fails?Gitlab CI 如何判断一个 PHPUnit 测试是通过还是失败?
【发布时间】:2019-05-29 05:06:06
【问题描述】:

我有这个基本的.gitlab-ci.yml 文件。

image: php:7.2

before_script:
  # install git
  - apt-get update -yqq
  - apt-get install git -yqq
  # Install composer
  - curl -sS https://getcomposer.org/installer | php
  # Install all project dependencies
  - php composer.phar install


tests:
  script:
    - vendor/bin/phpunit tests

这很好用,它会在单元测试失败或通过时提醒我。

我的问题是 Gitlab CI 究竟是如何知道这一点的?他们是否会解析 PHPUnit 的输出并查看字符串 FAILURES! 是否存在?

【问题讨论】:

  • 脚本返回除 0 以外的任何其他退出代码都被视为失败。
  • @SaschaFrinken 您能否简要解释一下与 PHPUnit 相关的退出代码是什么?你的意思是说 PHPUnit 内部返回 0 还是 1? Gitlab CI 是如何读取它的?人类的 PHPUnit 输出只是 Tests: 1, Assertions: 1, Failures: 1OK (1 test, 1 assertion)
  • @SaschaFrinken 我知道这一点,但我的问题是这与 Gitlab CI 有什么关系?它似乎神奇地知道测试是失败还是通过。如果我使用的是自制或私人测试软件,我想知道 Gitlab CI 如何知道我返回的是通过还是失败测试。
  • 您的单元测试只是一个脚本,当所有测试通过时,它将返回0 作为退出代码。 CI 检查返回码并将其处理为失败或通过。

标签: php unit-testing continuous-integration gitlab devops


【解决方案1】:

gitlab-ci 只检查在其中运行的进程的退出代码。如果一个进程以另一个状态码而不是 0 退出,则管道停止并声明失败。这就是 CI 管道的整体工作方式,不仅是 gitlab,还有 Jenkins 等。

【讨论】:

  • 好吧,如果我有一个自制的测试脚本,我只需 echo 1;echo 0; 表示通过和失败?
  • 不,echo 只会打印到您传递给它的标准输出字符串。对于通过和失败的 CI,它将是 exit 0exit 1
  • 您的意思是使用exit(0);exit(1); 识字
  • 是的。我的示例来自 bash,这就是它没有括号的原因。
  • 我明白了。从来不知道exit(); 除了终止脚本执行之外还有其他特殊用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2012-08-19
  • 2017-05-07
  • 2018-06-05
  • 1970-01-01
相关资源
最近更新 更多