Laravel 6.2 / docker / docker-compose phpunit在本地环境中运行而不是测试

问题描述

我已经看到其他人遇到了这个问题,但是我找不到解决方案。我的Dockerfile:

FROM PHP:7.2-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    sudo \
    Nginx

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-PHP-ext-install pdo_MysqL mbstring exif pcntl bcmath gd zip opcache

# Set working directory
workdir /var/www
# Get latest Composer
copY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    mkdir -p /home/$user/.config/valet/Log && \
    chown -R www-data:www-data /home/$user && \
    chown -R www-data:www-data /var/www
RUN rm /etc/Nginx/sites-enabled/default && \
    pecl install xdebug
# install node
RUN /bin/bash -c "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash && \
    source /root/.bashrc && \
    nvm install v12.18.3"

ENTRYPOINT ["./entrypoint.sh"]

docker-compose.yml

version: '3.4'
services:
  db:
    image: MysqL:5.7
    restart: always
    container_name: ufr-MysqL-master
    environment:
      MysqL_DATABASE: workit
      MysqL_USER: local
      MysqL_PASSWORD: local
      MysqL_ROOT_PASSWORD: admin
    ports:
      - "3306:3306"
    volumes:
      - my-db:/var/lib/MysqL
  testdb:
    image: MysqL:5.7
    restart: always
    container_name: ufr-MysqL-test
    environment:
      MysqL_DATABASE: workit_test
      MysqL_USER: local
      MysqL_PASSWORD: local
      MysqL_ROOT_PASSWORD: admin
    ports:
      - "3307:3306"
    tmpfs: /var/lib/MysqL
  app:
    build:
      args:
        user: david
        uid: 1000
      context: ./
      dockerfile: Dockerfile
    image: workit
    container_name: workit-app
    restart: on-failure
    working_dir: /var/www/
    environment:
      PHP_IDE_CONfig: "serverName=localhost"
    volumes:
      - ./:/var/www
      - ./workit.conf:/etc/Nginx/conf.d/workit.conf
      - ./ext-xdebug.ini:/usr/local/etc/PHP/conf.d/ext-xdebug.ini
      - ./PHP-fpm.conf:/usr/local/etc/PHP-fpm.conf
      - ./log:/var/www/log
    ports:
    - "80:80"
  redis:
    image: redis
    command: ["redis-server","--appendonly","yes","--requirepass","Redis.123"]
    volumes:
      - redis-data:/data
    container_name: redis-master
    ports:
      - "6379:6379"
volumes:
  my-db:
  redis-data:

PHPunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<PHPunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/PHPunit/PHPunit/PHPunit.xsd"
         backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.PHP"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.PHP">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.PHP">./tests/Feature</directory>
        </testsuite>

        <testsuite name="View">
            <directory suffix="Test.PHP">./tests/View</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".PHP">./app</directory>
        </whitelist>
    </filter>
    <PHP>
        <env name="APP_ENV" value="testing" force="true"/>
        <env name="CACHE_DRIVER" value="array" force="true"/>
        <env name="SESSION_DRIVER" value="array" force="true"/>
        <env name="QUEUE_DRIVER" value="sync" force="true"/>
        <env name="DB_CONNECTION" value="workit_testing" force="true"/>
    </PHP>
</PHPunit>

当我运行docker exec -it workit-app /bin/bash并在该应用容器中尝试vendor/bin/PHPunit时,它将擦除我的本地数据库,而config('app.env')显然转储了测试中的“本地”。我曾尝试运行vendor/bin/PHPunit --configuration PHPunit.xml,但似乎PHPunit已经在使用PHPunit配置,并且环境可能在被覆盖回本地之前。我在force="true"添加PHPuni.xml作为实验,但没有帮助。我已经运行PHP artisan config:cachePHP artisan config:cache --env=testing很多次了,但仍然无法在测试环境中成功运行测试。 runningUnitTests中的vendor/laravel/framework/src/Illuminate/Foundation/Application.PHP方法也将$this['env']记录为“本地”。我确实有一个.env.testing文件,这是很好的措施:

APP_KEY=base64:qt79b9nmZiuikL3U98WbT9Z1TnEj2yf8DBaE7zY4GFg=
APP_ENV=testing
BCRYPT_ROUNDS=4
CACHE_DRIVER=array
MAIL_DRIVER=array
QUEUE_CONNECTION=sync
SESSION_DRIVER=array
DB_CONNECTION=MysqL
DB_DATABASE=workit_test
DB_HOST=127.0.0.1
DB_PORT=3307
DB_USERNAME=local
DB_PASSWORD=local
SCOUT_DRIVER=null
UNIVERSAL_TEST_PIN_CODE=true
TEST_PHONE_NUMBER='+61111111111,+61666666666,+61900900900'

“ workit_test”容器已启动并正在运行,并且“已准备好进行连接”。要补充的另一点是,Dockerfile和docker-compose.yml是由另一个使用PHPStorm作为其IDE的团队设置的,而我使用的是VS Code,由于它们的PHPStorm配置,它们没有遇到相同的问题。我想解决我的问题而不丢掉他们的情况。

在这一点上,我已经沉迷了好几个小时,因此,任何帮助或主要问题都将受到感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)