phpstrom、laradock、phpunit 进行单元测试
背景:
- 环境: windows 系统电脑,laradock 套集成环境,phpstrom开发
- 容器中的项目与的本地项目为同一路径,这是基于映射机制实现的,日常开发使用
phpstrom(IDE)
直接打开本地的项目进行开发 - 如今我想实现单元测试,本地修改代码,在
IDE
中点击运行,就能使用容器中的环境来运行。这想法是可以实现的!!
实现原理:
- IDE 中进行单元测试,IDE 会使用 SSH 命令连接到容器(实现方式很多,这里介绍 SSH 模式)
- 根据映射关系找到服务器项目的对应目录、类、方法
- 使用 phpunit 来进行单元测试
实现步骤:
步骤一:容器上运行单元测试
- 进入项目所在容器(workspace 容器)的项目目录下运行命令
php artisan make:test UserTest --unit
来生成一个单元测试类,其路径为tests/Unit/UserTest.php
root@62d044ee2a7e:/var/www/test.love.com# php artisan make:test UserTest --unit
Test created successfully.
提示:将
use PHPUnit\Framework\TestCase;
替换成use Tests\TestCase
- 给
tests/Unit/UserTest.php
类添加一个testExample
方法,已存则替换。使用echo
输出内容,可以方便看到结果,如下:
public function testExample()
{
echo '单元测试跑起来了';
}
- 运行命令
./vendor/bin/phpunit tests/Unit/UserTest.php
并查看结果,如果看到单元测试跑起来了
就表明容器的单元测试 OK 了
root@62d044ee2a7e:/var/www/test.love.com# ./vendor/bin/phpunit tests/Unit/UserTest.php
PHPUnit 7.5.20 by Sebastian Bergmann and contributors.
R 1 / 1 (100%)单元测试跑起来了
Time: 878 ms, Memory: 32.00 MB
步骤二: 设置允许使用 ssh 方式连接容器
- 打开
laradock
目录的.env
文件,将WORKSPACE_INSTALL_WORKSPACE_SSH
环境变量设为true
; - 在
laradock
目录下执行命令docker-compose build workspace
来重新构建workspace
容器 - 在
laradock
目录下执行命令docker-compose up -d workspace
来停止旧并重新创建workspace
容器(保留装入的卷)
步骤三: phpstrom(IDE) 连接容器
- 按以下步骤
File -> Settings... -> Languages & Frameworks -> PHP
打开 PHP 配置,按照图指示步骤去设置连接容器的 ssh 配置
图片步骤解释:
1 打开 PHP 配置
2 打开复杂选项
3 打开添加 CLI 解释器弹窗
4 选择 SSH 类型的远程PHP解释器(新建一个 SSH 类型的远程PHP解释器)
5 打开复杂选项
6 新建一个指定类型的 SSH。选择From Docker,Vagrant,VM, Remote...
选项
7 容器的IP
8 容器 SSH 端口。上面IP填写主机的,那则填写映射端口号 22->2222
9 连接用户名
10 选择key pair
类型的 ssh 授权方式。选它是因为laradock
提供了workspace
容器的秘钥
11 选择workspace
容器秘钥所在路径
12 测试连接
13 确定连接成功信息
14 15 应用与确定配置
- 打开 PHP 配置,按照图指示设置本地 web 目录与容器 web 目录的映射关系
图片步骤解释:
3 本地工作环境目录
4 容器工作环境目录
步骤四: 运行单元测试
- 点击方法或者类左侧的三角,即可看到单元测试的结果。yes,大功告成!
疑问解答:
- Q:为什么不在本地安装一个PHP来跑单元测试呢?
A: 开发环境都安装在容器中,本地安装的PHP无法正确读取配置。或许可以,暂时还不知道如何配置。 - Q: 我为什么要使用单元测试?
A: 提示自己的代码解耦,快速模拟各种情况测试,测试按钮更加近,操作起来更加块了,且可以减少切换应用带来的时间 - Q:为什么跳过安装
phpunit
的步骤
A:laravel
框架自带phpunit
扩展,其配置phpunit.xml
就在项目根目录下
程序代码:
./phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit 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>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<php>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="MAIL_DRIVER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
</php>
</phpunit>