У меня довольно простая проблема, которую я не могу понять.
Я разрабатываю PHP-приложение на основе ООП, используя Composer Dependency Manager, PHPUnit для тестирования. Я размещаю репозиторий на GitLab и использую GitLab-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 через интеграцию PHPUnit с PhpStorm, но когда я пытаюсь заставить работать GitLab-CI, я постоянно получаю сообщение об ошибке:
…
$ vendor / bin / phpunit —configuration phpunit.xml PHPUnit 5.5.4 от
Себастьян Бергман и соавторы.EE..EII 7
/ 7 (100%)Время: 32 мс, память: 4,00 МБ
Было 3 ошибки:
1) paycheckTest :: calcNetTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога/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:342) paycheckTest :: calcTaxesTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100
/builds/calebrw/paycheckCalculator/tests/paycheckTest.php:583) taxCalcTest :: calcFITTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога/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, поэтому я добавил исправление (или действительно хак), чтобы тест проходил к 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";
И сейчас сборка проходит.
Спасибо за помощь обоим людям, которые ответили.
Убедитесь, что файл зафиксирован (обычно вы не фиксируете данные, вы можете поместить его в ресурсы). Я думаю, что вы уже сделали.
Второе — это просто предложение:
определить константу PATH и использовать это. Потому что в вашем случае вы никогда не знаете, где находится ваш текущий рабочий каталог.
Определите файл начальной загрузки в phpunit и определите 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';
}
Весьма вероятно, что вы используете относительный путь в вашем требовании. Смотрите здесь для объяснений и решений: PHP — Не удалось открыть поток: нет такого файла или каталога