php - 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"]
码头工人-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
并尝试时,它会擦除我的本地数据库并清楚地在测试中转储“本地”。我试过运行,但似乎 phpunit 已经在使用 phpunit 配置,并且环境可能在被覆盖回本地之前。我在实验中添加了,但没有帮助。我已经运行了很多次,但仍然无法在测试环境中成功运行测试。日志中的方法也为“本地”。我确实有一个文件,这是一个很好的衡量标准:vendor/bin/phpunit
config('app.env')
vendor/bin/phpunit --configuration phpunit.xml
force="true"
phpuni.xml
php artisan config:cache
php 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 配置,他们没有遇到同样的问题。我想在不抛弃他们的情况下解决我的情况。
在这一点上,我已经沉没了好几个小时,所以任何帮助或引导性问题都将不胜感激。
解决方案
推荐阅读
- python - MultinomialNB 在预测阶段失败并出现“ValueError:形状未对齐”
- oracle - oracle 中的 CROSS APPLY 和 LATERAL 有什么区别?
- ffmpeg - NodeMediaServer:RTMP 中继推送不接受命令
- css - 无法从 css-loader 读取
- nginx - 如何检查 Nginx 规则中是否存在 X-Request-ID 标头?
- flutter - 颤振复杂的线性梯度不起作用
- database - 知道谁在 APPSHEETS 中编辑信息
- linux - 如何使用 NBIS 工具对图像进行二值化?
- django - 如何更改 Procfile 以在 Heroku 的非标准文件夹中运行 Gunicorn 进程?
- r - 计算每年两个日期之间的天数