PHPUnit测试期间GitLab-CI与file_get_contents有关

时间:2016-09-04 22:48:45

标签: php phpunit composer-php gitlab gitlab-ci

我有一个相当简单的问题,我似乎无法弄明白。

我正在使用Composer Dependency Manager,PHPUnit开发基于OOP的PHP应用程序进行测试。我在GitLab上托管存储库,并使用Gi​​tLab-CI来运行PHPUnit测试。

我的文件目录非常简单:

├──_data
   ├──_2016
      ├──_federal
         ├──fit.json
├──_libs
   ├──_paycheckCalculator
      ├──paycheck.php
      ├──taxCalc.php
├──_public_html
   ├──index.php
├──_vendor
   ├──[composer dependencies]
   ├──autoload.php
├──_tests
   ├──paycheckTest.php
   ├──taxCalcTest.php
├──_templates
   ├──[Twig templates]

taxCalc.php 包含:

public static function calcFIT($taxableWages, array $taxStatus, int $frequency = 52):float {
    $fitFile = "../data/2016/federal/fit.json";
    ...

在我的生产服务器上工作得很好,我可以通过PHPUnit与PhpStorm集成来运行PHPunit测试,但是当我尝试让GitLab-CI工作时,我一直都会遇到错误:

  

...
  $ vendor / bin / phpunit --configuration phpunit.xml PHPUnit 5.5.4 by   Sebastian Bergmann和贡献者。

     

EE..EII 7   / 7(100%)

     

时间:32毫秒,内存:4.00MB

     

有3个错误:

     

1)paycheckTest :: calcNetTest   file_get_contents(../ data / 2016 / federal / fit.json):未能打开   stream:没有这样的文件或目录

     

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100   /builds/calebrw/paycheckCalculator/libs/paycheckCalculator/paycheck.php:49   /builds/calebrw/paycheckCalculator/libs/paycheckCalculator/paycheck.php:28   /builds/calebrw/paycheckCalculator/tests/paycheckTest.php:34

     

2)paycheckTest :: calcTaxesTest   file_get_contents(../ data / 2016 / federal / fit.json):未能打开   stream:没有这样的文件或目录

     

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100   /builds/calebrw/paycheckCalculator/tests/paycheckTest.php:58

     

3)taxCalcTest :: calcFITTest   file_get_contents(../ data / 2016 / federal / fit.json):未能打开   stream:没有这样的文件或目录

     

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100   /builds/calebrw/paycheckCalculator/tests/taxCalcTest.php:53

     

错误!测试:7,断言:11,错误:3,不完整:2。错误:   构建失败:退出代码1

我的 .gitlab_ci.yml 如下:

# Select image from https://hub.docker.com/_/php/
image: php:7.0

# Select what we should cache
cache:
  paths:
  - vendor/

before_script:
# Install git, the php image doesn't have installed
- 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

PHPUnit:testsuite:
  script:
  - vendor/bin/phpunit --configuration phpunit.xml

我的 phpunit.xml 文件包含:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"
        colors="false"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        stopOnFailure="false">

    <testsuites>
        <testsuite name="Paycheck Tests">
            <directory>tests/</directory>
        </testsuite>
    </testsuites>
    <php>
        <includePath>/builds/calebrw/paycheckCalculator</includePath>
    </php>
</phpunit>

请注意,无论是否使用<includePath>标记,我都使用了此标识,如果我使用<includePath>/../</includePath>或其他任何内容,则无效。

感谢您提供的任何帮助。

修改

我终于开始工作了。我在 config.php 文件中添加了一个函数(目前在全局空间中):

/**
 * Required Functions
 */

function getDirectory(bool $html = false):string
{
    $htmlBaseDirectory = '/webprojects/paycheckCalculator';

    if ($html == true) {
        return $htmlBaseDirectory;
    } else {
       return dirname(__DIR__);
    }
}

这意味着我可以更新 index.php

require_once('config.php'); // Configuration Variables
require_once( getDirectory() . '/vendor/autoload.php'); // Composer Autoload
$dir = getDirectory(true) . $htmlPublicDirectory; // Combined variable needed for Twig compatibility

但是我仍然遇到GitLab-Ci跑步者的问题,他们的环境完全不同,根本没有调用我的config.php,所以我添加了一个修复程序(或者真的是hack)来让测试传递给taxCalc.php:

if (getenv('CI_BUILD_ID') !== false) {
    define('MAIN_PATH', '/builds/calebrw/paycheckCalculator/');
} else {
    define('MAIN_PATH', dirname(__DIR__));
}

...
class taxCalc
{
...
    public static function calcFIT($taxableWages, array $taxStatus, int $frequency = 52):float {
        $fitFile = MAIN_PATH . "/data/2016/federal/fit.json";

现在构建过去了。

感谢所有回复者的帮助。

2 个答案:

答案 0 :(得分:2)

确保提交文件(通常您不提交数据,您可以将其放在资源下)。我想你已经做过了。

第二件事也只是一个建议: 定义PATH常量并使用它。因为在您的情况下,您永远不知道您当前的工作目录在哪里。

在phpunit中定义一个bootstrap文件并定义MAIN_PATH。例如:

<?php

define('MAIN_PATH', dirname(__DIR__));

require MAIN_PATH . '/vendor/autoload.php';

在索引中你也必须提供这个MAIN_PATH,在calcFit中你写:

<?php

function calcFit() {
   $fitFile = MAIN_PATH . '/data/2016/federal/fit.json';
}

答案 1 :(得分:0)

问题很可能是您在require中使用了相对路径。请参阅此处了解解释和解决方案:PHP - Failed to open stream : No such file or directory