arcoteste / projetodocker
学习 Docker
README
Docker
Docker 是一个开源虚拟化平台,允许您使用容器来创建、部署和运行应用程序。容器允许您将软件及其所有依赖项(包括库、操作系统和其他依赖项)打包在一起。这意味着您可以确信您的应用程序将按完全相同的方式运行,而不管它在哪个环境中运行。
有关更多信息或下载链接,请访问 Docker 的官方网站 https://dockerd.com.cn/。
在 VS Code 中使用 Docker
- 在 VS Code 中安装 Dev Container 扩展
- 创建一个包含 Dockerfile 和 devcontainer.json 的 .devcontainer 文件夹
- 在 VS Code 的侧边菜单中,有 Dev Container 扩展的图标,可以打开管理器(创建、暂停、打开)容器和容器中的目录。可选地,当打开已配置 .devcontainer 的项目目录时,VS Code 会建议在容器中重新打开它。
- 通过 VS Code 的终端访问文件
注意:第一次访问容器时,将进行安装和配置过程,可能需要几分钟。
注意:在容器外使用 git。尽管在容器内也可以使用,但需要配置 ssh 密钥,但由于项目已版本化,可以在多个工作站克隆,因此不建议保存 git 凭据。
Docker 配置文件
- devcontainer.json 文件配置 VS Code 内的容器,启用/禁用其他扩展的使用,并在容器虚拟卷内封装目录
{ "name": "PHP", "build": { "dockerfile": "Dockerfile", "args": { "VARIANT": "8.1", "NODE_VERSION": "none" } }, "customizations": { "vscode": { "settings": { "php.validate.executablePath": "/usr/local/bin/php" }, "extensions": [ "xdebug.php-debug", "bmewburn.vscode-intelephense-client", "mrmlnc.vscode-apache" ] } }, "forwardPorts": [8080], "remoteUser": "vscode" }
- Dockerfile 文件包含容器的规格,可以在任何配置有 docker 的环境中使用,包括生产服务器。
ARG VARIANT="8.1-apache-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/php:0-${VARIANT}
ARG NODE_VERSION="none"
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends wget graphviz \
&& wget https://phpdoc.org/phpDocumentor.phar \
&& chmod +x phpDocumentor.phar \
&& mv phpDocumentor.phar /usr/local/bin/phpDocumentor \
&& echo xdebug.mode=coverage >> /usr/local/etc/php/conf.d/xdebug.ini
注意:上述容器由 Microsoft 提供,包括一个带有 PHP 和 Node 安装的 Linux 环境,以及通过 Unix 命令安装的系统级别依赖项和 PHP Documentor 及 Xdebug 的覆盖模式配置。
PHP 内置服务器
PHP 内置服务器是从 PHP 5.4 版本开始嵌入到特定 PHP 版本中的 Web 服务器。它允许开发人员快速启动本地开发服务器,而无需安装和配置其他服务器,如 Apache 或 Nginx。内置服务器仅应用于开发目的,不应用于生产环境。
要启动服务器,请通过终端访问公共目录并输入以下命令
php -S localhost:8888
之后,在浏览器中访问 URL。
注意:请使用任何高端口,不强制使用 8888,并避免使用 8080,因为 VS Code 会将其用于隧道。
使用 Ngrok 公开内置服务器访问
Ngrok 是一个工具,允许您创建一个用于测试本地托管的应用程序和服务的安全服务器。它创建一个隧道,将本地服务器暴露给公共互联网,使其可以从任何地方访问,同时保持本地 IP 和端口的隐私。它用于开发、测试、演示和其他应用。
在网站上注册 https://ngrok.com/ 并在启动内置服务器后,在另一个终端中输入以下命令
ngrok http 8888
注意:O终端将在Ngrok应用中锁定,Ngrok将提供一个公共链接,以供访问您的开发环境。
Composer
什么是?
Composer是PHP的一个依赖关系管理器。它用于管理项目的依赖关系,如库、框架和其他工具。Composer允许您轻松快速地创建项目,同时保持代码始终更新和可访问。
访问文档
https://getcomposer.org.cn/doc/
安装
https://getcomposer.org.cn/download/
在哪里可以找到通过Composer安装的PHP包
- 官方下载存储库的站点 - https://packagist.org.cn/
- GitHub上的存储库,维护着多个领域的最佳和常用库的列表 - https://gist.github.com/llbbl/7607016
如何使用Composer开始一个项目?
composer init
然后回答问题并配置您的composer.json。
您也可以手动创建composer.json文件。
主要命令
- init - 使用Composer初始化项目
- install 或 i - 安装所有依赖项
- update 或 u - 更新所有依赖项
- clear-cache - 清除Composer缓存
- dumpautoload -o - 更新PSR-0和PSR-4的autoload类路径
composer.json中存在的主要属性
- name: 使用[vendor/name]格式,指定供应商名称和项目名称
- description: 项目描述
- type: 项目的类型,可以是library、project或metapackage
- version: 项目版本,通常使用数字格式,包含大版本和小版本
- autoload: 指定用于加载类的类路径,仅使用Composer的autoload功能
- require: 项目所有依赖项的列表
- scripts: 使用Composer的通用功能,如函数、快捷方式和脚本
注意:autoload和require具有类似的属性,具有dev后缀,其中存储仅对开发环境有效的定义。要安装依赖项而不加载开发资源,请使用以下命令
composer install --no-dev
完整的composer.json文件示例
{ "name": "senaces/sig-integration", "type": "project", "description": "SENAC | ES", "authors": [ { "name": "Felipe Gaspar" } ], "autoload": { "psr-4": { "Senac\\Cron\\": "scripts/", "Senac\\Services\\": "src/integration/", "WebApp\\Platform\\Core\\Utils\\": "src/utils", "WebApp\\Platform\\Core\\Database\\": "src/database", "WebApp\\Platform\\OpenApi\\Senac\\": "src/api/" } }, "autoload-dev": { "psr-4": { "Test\\UnitTest\\": "tests/unit" } }, "require": { "php": "^8", "symfony/yaml": "^5.3", "guzzlehttp/guzzle": "^7.0", "monolog/monolog": "^3.2", "symfony/mailer": "^6.1", "symfony/mime": "^6.1", "phuml/phuml": "^6.1", "code-simplify/ciesta-project": "^0.0.1" }, "require-dev": { "phpunit/phpunit": "^9", "codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", "phpmetrics/phpmetrics": "^2.8", "phpunit/php-code-coverage": "^9", "rregeer/phpunit-coverage-check": "^0.3.1" }, "scripts": { "clear": [ "rm -f composer.lock", "@composer clear-cache" ], "code-coverage": "codecept run --coverage", "code-coverage-details": [ "codecept run --coverage --coverage-html", "mv reports/coverage docs" ], "unit-test": "codecept run unit", "test-application": [ "@code-coverage" ], "build-application": [ "@clear", "@composer install", "@test-application" ], "doc": [ "rm -rf docs", "mkdir docs", "mkdir docs/metrics", "mkdir docs/code", "mkdir docs/class", "mkdir docs/coverage", "vendor/bin/phpmetrics --report-html=docs/metrics src", "phpdoc -d src/ -t docs/code", "vendor/bin/phuml phuml:diagram -r -a -i -o -e php -p dot src/ docs/class/diagram.png", "@code-coverage-details" ] }, "scripts-descriptions": { "clear": "Limpa o cache de dependências e o arquivo composer.lock", "code-coverage": "Executa o teste de cobertura de código com saida pelo console", "code-coverage-details": "Gera um relatório completo do teste de cobertura de código em formato HTML", "code-coverage-test": "Verifica o sucesso da cobertura de código com base em um parâmetro numérico especificado", "unit-test": "Executa os testes unitários utilizando o framework PHPUnit", "test-application": "Executa todas as rotinas de testes configuradas. OBS.: Habilite apenas as rotinas implementadas", "build-application": "Limpa o cache e instala as dependências, e em seguida executa todas as rotinas de testes configuradas", "doc": "Gera a documentação completa do projeto" } }
composer.lock和vendor
composer.lock文件包含对环境中所有安装的引用,包括每个库的安装版本信息,作为Composer保留指定版本的一个参考。
而vendor目录包含所有已安装库的源代码、autoload类路径和二进制脚本。它是使用Composer的项目的基础。要使用它,只需在任何项目文件中加载/vendor/autoload.php即可。
通常不会在版本控制中保存这两个文件。为了简化此管理,请使用.gitignore文件指定从项目根目录到任何想要保留在版本控制之外的文件和目录的路径。
创建使用composer执行的脚本
在此示例中,我们将创建一个用于清除缓存和composer文件的脚本
- 如以下示例所示,创建script部分
"scripts": {
},
- 添加键"clear",并分配一个空数组
- 添加命令"rm -f composer.lock",使用引号并在最后添加逗号。(Composer接受任何Unix命令和通过-r标志的PHP命令。例如:php -r "echo 'test';";)
- 添加命令"@composer clear-cache"。要使用脚本中的Composer命令,只需在关键字composer前加上@即可
- 使用以下命令测试您的脚本
composer clear
活动
现在创建一个名为"build-app"的命令,它将清除您的环境并安装所有依赖项
使用composer创建您的第一个库
- 使用 composer init 创建 composer.json 文件
- 在 /src 文件夹内创建一个名为 Conexao.php 的文件
- 将以下代码复制到该文件中
<?php namespace Treinamento\Teste; final class Conexao { private array $data = []; public function __construct() { $this->data = [ (object)[ 'titulo' => 'Exemplo 01', 'autor' => 'Fulano', 'corpo' => 'Foo' ], (object)[ 'titulo' => 'Exemplo 02', 'autor' => 'Beltrano', 'corpo' => 'Bar' ], (object)[ 'titulo' => 'Exemplo 03', 'autor' => 'Cicrano', 'corpo' => 'Baz' ] ]; } public function lerNoticiasDoBanco() : array { return $this->data; } }
- 为连接类创建 PSR-4 自动加载配置
"autoload": {
"psr-4": {
"Treinamento\\Teste\\": "src/"
}
}
- 在您的 GitHub 上创建一个公共仓库。(将 vendor 名称更改为您的 GitHub 账户名称)
- 将代码上传到您的 GitHub
- 为您的项目创建一个版本和标签 1.0
- 访问并登录到网站 https://packagist.org.cn/
- 点击提交菜单并提供您的 GitHub 仓库链接以发布您的仓库
- 在 Packagist 上发布您的仓库后,您可以将它作为依赖项添加到您的项目中。为此,关闭当前文件夹并使用 .devcontainer 创建一个新项目,然后将 Packagist 上的安装命令复制到新项目中。
文档生成器
PHUML
PHUML(处理和操作 UML 模型)是一种基于 UML(统一建模语言)的建模工具,它允许用户创建软件和系统模型。PHUML 允许用户查看、分析和操作这些模型,并提供从创建的模型自动生成代码的资源。
在上一活动创建的新项目中,添加以下开发依赖项
composer require --dev phuml/phuml ^6.1
使用以下命令生成类图
vendor/bin/phuml phuml:diagram -r -a -o -e php -p dot examples/ docs/class/diagram.png
如果需要,您可以将源目录和目标目录更改为其他位置。有关 PHUML 配置的更多信息,请访问 https://montealegreluis.com/phuml/docs/class-diagram.html。您可以通过仅显示方法、仅显示属性、是否包含关联以及选择可用的绘图工具(dot 和 neato)来生成文档的版本。上述建议的命令已使用 graphviz dot 生成 phuml 的完整版本,该工具已安装在 .devcontainer 中。
活动
为新闻类别添加一个新的类,并更新类图
PHP Documentor
PHP Documentor 是一个开源代码文档工具,它可以生成结构化和易读的 PHP 代码文档。PHP Documentor 用于提高生产率和简化维护,因为它可以帮助创建丰富、结构化和更新的文档。PHP Documentor 允许开发人员从源代码生成 HTML、PDF、DocBook 和 man 页面的文档。
要生成文档,请使用以下命令
phpDocumentor -d examples -t docs
请注意,文档是不完整的,仅包含类和文件的基本信息。
使用 docblocks,它是一组属性,它们附加在文件的定义中,以改进生成文档的质量,不仅限于生成的文件,还在于代码中对注释的明确说明。
DocBlocks
- 文件
通常通过指定包(namespace)和文件的目的来文档化文件。
/** * Breve descrição sobre o seu arquivo * @package Exemplo\Treinamento * @author Felipe Gaspar <felipesouzalimagaspar@gmail.com> */
- 类或接口
使用简短描述和 @final 或 @abstract docblocks 来文档化类,如果它们是抽象或最终类。
/** * Classe de exemplo Foo que não serve para nada * @abstract */ abstract class Foo {
- 函数
在函数文档中,通常使用 @access 定义函数的隐私级别,通过 @param 使用参数列表,使用 @return 定义返回值,如果函数可能抛出可预见的异常,则使用 @throws。
/** * Função de demonstração de docblocks * @access public * @param string $foo Parâmetro de exemplo * @param array $bar Outro parâmetro * @throws TypeError Minha função pode disparar exceptions da classe TypeError * @return int Minha função sempre retornará um inteiro */ public function minhaFuncao(string $foo, array $bar) : int {
- 属性
在属性的情况下,使用 @var docblock,后面跟着类型和描述。
/** * @access private * @var bool Minha váriavel que não serve para nada além de demonstração */ private bool $exemplo;
如果您有一个可以是多种类型或您不知道类型的变量、参数或返回值,请使用 mixed。mixed 是 PHP 的基本类型,从最初版本开始就允许变量改变类型。
访问 PHP Documentor 网站,查看可用的 docblocks 列表及其使用方法。
https://docs.phpdoc.org/3.0/guide/guides/docblocks.html#more-on-docblocks
活动
您已经了解了docblocks和PHP Documentor,现在请将docblocks添加到示例目录中的类中,并重新生成文档。
活动
利用Composer脚本和PHP Documentor以及PHUML的知识,创建一个名为“composer doc”的脚本,该脚本创建一个无内容的docs文件夹,并使用两种研究过的工具生成文档。
测试类型
单元测试
单元测试是验证单个代码单元的测试。它们被设计来检查特定代码单元是否正确运行。这些测试是在单个代码单元上执行的,这意味着它们是独立于其他代码执行的。
集成测试
集成测试用于检查不同的代码单元是否正确交互。这些测试用于检查代码单元能否良好地一起工作,并且能否产生预期的结果。
验收测试
验收测试用于检查系统是否满足用户的需求。这些测试用于检查系统是否按用户期望的方式运行。
代码覆盖率
代码覆盖率是一个用于衡量被测试的代码量的指标。代码覆盖率用于检查是否所有代码部分都得到了适当的测试。
断言
测试中的断言是声明,它声称测试中获得的结果是否为预期结果。它们用于检查代码是否正确执行并产生预期结果。断言通常用如“结果应该等于...”或“结果应该在...之间”之类的短语表示。
PHPUnit
PHPUnit是用于PHP编程语言的单元测试框架。它提供工具来测试PHP应用程序以确保其质量和可靠性。PHPUnit允许开发者为PHP应用程序和库编写和执行自动化的单元测试。PHPUnit基于xUnit构建并遵循敏捷开发原则。它是PHP中最流行的单元测试框架。
要安装PHPUnit,只需在composer.json中添加以下依赖项
composer require --dev phpunit/phpunit ^9
配置测试套件
测试套件是由在预定义配置的环境中执行的单元测试集合。
- 在项目根目录创建一个名为phpunix.xml的文件,并添加以下行
<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./src/vendor/phpunit/phpunit/phpunit.xsd" bootstrap="./tests/bootstrap.php" colors="true" > <testsuites> <testsuite name="Unit Test Suite"> <directory> ./tests/unit/</directory> </testsuite> </testsuites> </phpunit>
- 创建一个名为tests的目录,并在其中创建一个名为bootstrap.php的文件,其中包含以下代码
<?php require_once __DIR__ . '/../vendor/autoload.php'; /** * @todo acrescente aqui outras definições base para execução dos testes */
- 在composer.json中添加以下部分
"autoload-dev": { "psr-4": { "Test\\UnitTest\\": "tests/unit" } },
- 在tests目录中创建一个名为unit的目录,并开始创建您的测试。
使用PHPUnit创建单元测试
在此示例中,我们将处理基本数学运算以了解PHPUnit的功能。
使用PHPUnit编写的所有测试都必须具有以Test后缀命名的文件名和以test前缀命名的测试方法名。
- 创建一个名为MathTest.php的文件,并添加以下代码
<?php namespace Test\UnitTest; final class MathTest extends \PHPUnit\Framework\TestCase { public function testTaFuncionandoOPHPUnit(): void { $this->assertTrue(true); } }
-
创建您的第一个测试。为此,添加一个名为testSoma的函数。测试2 + 2是否等于4。为此,使用接收两个参数并比较它们的assertEquals断言。
-
让我们将创建的测试修改为使其动态。为此,将两个数字2和数字4替换为变量$n1、$n2和$n3作为函数的参数。
在运行测试之前,创建一个名为NumerosProvider的函数,其中包含以下代码
public function NumerosProvider() : array { return [ '2+2' => [2,2,4], '3+3' => [3,3,6], '2+3' => [2,3,5] ]; }
在testSoma函数之前添加以下docblock
/** * @dataProvider NumerosProvider */
数据提供者是测试实例的集合,可以用来扩展测试的精确性,通过提供多个参数和预期响应。
- 在您的类中添加以下函数
public static function setUpBeforeClass(): void { echo "Imagine que isso seja muito importante e tenha de ser executado antes dos testes"; } public static function tearDownAfterClass(): void { echo "Imagine que isso seja muito importante e tenha de ser executado após os testes"; }
活动
研究并实施测试,使用PHPUnit官方文档中可用的断言https://docs.phpunit.de/en/9.Para。为此,使用PHP的基本操作。
活动
使用Composer的自动加载功能加载examples目录中的类,并为每个类执行单元测试。
活动
加载您创建的库,并为Conexão类执行单元测试。
活动
实施一个集成测试,使用Conexão、Autor和Notícia类。
Codeception
Codeception是一个用于PHP Web应用的自动化测试框架。它提供了一系列工具来帮助测试Web应用,从单元测试到用户验收测试。它还包含一系列库和资源,以帮助自动化测试执行。
创建测试覆盖率
- 在composer.json中添加以下依赖项
"codeception/codeception": "^5.0", "codeception/module-asserts": "^3.0", "phpunit/php-code-coverage": "^9"
- 在项目根目录创建一个名为codeception.yml的文件,并粘贴以下代码
paths: tests: tests output: reports data: reports support: tests/.codeception envs: tests/_envs bootstrap: bootstrap.php settings: suite_class: \PHPUnit_Framework_TestSuite memory_limit: 1024M log: true colors: true actor_suffix: Tester extensions: enabled: - Codeception\Extension\RunFailed coverage: enabled: true include: - examples/* exclude: - examples/*log low_limit: 50 high_limit: 90 show_only_summary: false show_uncovered: true
- 将codeception.zip文件提取到tests目录中
- 执行以下命令以运行覆盖率测试
vendor/bin/codecept run --coverage
如果您想以图形方式生成报告,请使用以下命令
vendor/bin/codecept run --coverage --coverage-html
创建验收测试
- 使用PHP内置服务器,将view文件夹的内容发布在端口8888上。
- 在/tests目录下创建一个名为acceptance的文件夹
- 安装以下依赖项
"codeception/module-phpbrowser": "^3.0"
- 将以下代码复制到acceptance目录下创建的FirstCest.php文件中
<?php class FirstCest { public function frontpageWorks(AcceptanceTester $I) { $I->amOnPage('/'); $I->see('Exemplo'); } public function viewpageWorks(AcceptanceTester $I) { $I->amOnPage('/view.php?url=exemplo-01'); $I->see('Foo'); } }
活动
为在线表单实施测试,使用任何在线表单和文档中可用的方法https://codeception.com/docs/AcceptanceTests