emanooel/teste

仅用于arco的composer培训测试。

1.0 2023-03-20 18:37 UTC

This package is not auto-updated.

Last update: 2024-10-02 00:10:34 UTC


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提供,包含一个Linux环境,预装了PHP和Node,并通过Unix命令安装了操作系统级别的依赖项以及PHP Documentor和Xdebug的覆盖配置。

PHP内置服务器

PHP内置服务器是从PHP 5.4版本开始嵌入的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包

如何使用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文件

  1. 如以下示例中创建script部分
"scripts": {

},
  1. 添加键"clear"并将格式为json的空数组分配给它
  2. 添加命令unix"rm -f composer.lock",使用引号,在末尾放置逗号。(Composer接受任何Unix命令和通过flag -r执行的PHP命令。例如:php -r "echo 'teste';";)
  3. 添加命令"@composer clear-cache"。要使用脚本中的Composer命令,请使用@在composer之前引用关键字
  4. 使用以下命令测试您的脚本
composer clear

活动

创建一个名为 "build-app" 的命令,该命令将清理您的环境并安装所有依赖项

使用 composer 创建您的第一个库

  1. 使用 composer init 创建 composer.json
  2. 在 /src 文件夹中创建一个名为 Conexao.php 的文件
  3. 将以下代码复制到该文件中
<?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;
    }
}
  1. 为连接类创建 PSR-4 自动加载
"autoload": {
    "psr-4": {
        "Treinamento\\Teste\\": "src/"
    }
}
  1. 在您的 GitHub 上创建一个公共仓库。 (将 vendor 名称更改为您的 GitHub 账户名称)
  2. 将代码上传到您的 GitHub
  3. 为您的项目创建一个版本和一个标签 1.0
  4. 访问并登录到网站 https://packagist.org.cn/
  5. 点击 submit 菜单并为您提供 GitHub 仓库链接以发布您的仓库
  6. 在 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)来生成文档的版本。上述建议的命令已经使用了 phuml 生成器的完整版本,该版本使用了已安装在 .devcontainer 中的 graphviz dot。

活动

为新闻类别添加一个新的类并更新类图

PHP Documentor

PHP Documentor 是一个开源代码文档工具,它为 PHP 代码生成结构化、易于阅读的文档。PHP Documentor 用于提高生产力和简化维护,因为它有助于创建丰富、结构化且更新的文档。PHP Documentor 允许开发人员从源代码生成 HTML、PDF、DocBook 和手册页面。

要生成文档,请使用以下命令

phpDocumentor -d examples -t docs

请注意,文档是不完整的,并且只包含类和文件的基本信息。

使用 docblocks,它们是一组属性,它们添加到文件、类、函数和变量的定义中,以改善生成的文档质量,不仅限于生成的文件,而且通过在代码中的注释进行明确。

DocBlocks

  1. 文件

通常通过指定包(namespace)和此文件的目的来文档化文件。

/**
 * Breve descrição sobre o seu arquivo
 * @package Exemplo\Treinamento
 * @author Felipe Gaspar <felipesouzalimagaspar@gmail.com>
 */
  1. 类或接口

使用简短描述和 @final 或 @abstract 的 docblocks 来文档化类,如果这些是抽象或最终类。

/**
 * Classe de exemplo Foo que não serve para nada
 * @abstract
 */
abstract class Foo {
  1. 函数

在函数文档中,通常使用 @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 {
  1. 属性

在属性的情况下,使用 @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 文档网站查看可用的 docblocks 列表及其使用方法。

https://docs.phpdoc.org/3.0/guide/guides/docblocks.html#more-on-docblocks

活动

现在您已经了解了 docblocks 和 PHP 文档器,请将 docblocks 添加到示例目录中的类,并重新生成文档。

活动

利用 composer 脚本和 PHP 文档器以及 PHUML 的知识,创建一个 "composer doc" 脚本,该脚本创建一个空的 "docs" 文件夹,并使用这两种工具生成文档。

测试类型

单元测试

单元测试是验证单个代码单元的测试。它们旨在检查特定的代码单元是否正确运行。这些测试在单个代码单元上执行,这意味着它们独立于其他代码执行。

集成测试

集成测试用于验证不同的代码单元是否正确交互。这些测试用于检查代码单元是否能够良好协作并产生预期的结果。

验收测试

验收测试用于验证系统是否满足用户的要求。这些测试用于检查系统是否按用户的预期运行。

代码覆盖率

代码覆盖率是衡量测试了多少代码的指标。代码覆盖率用于检查是否已充分测试了代码的所有部分。

断言

测试中的断言是声明测试结果是否为预期的声明。它们用于检查代码是否正确执行并产生预期的结果。断言通常表示为“结果应等于 ...”或“结果应在 ... 之间”等短语。

PHPUnit

PHPUnit 是 PHP 编程语言的单元测试框架。它提供工具来测试 PHP 应用程序以确保其质量和可靠性。PHPUnit 允许开发者编写和自动执行单元测试,用于 PHP 应用程序和代码库。PHPUnit 基于 xUnit 构建并遵循敏捷开发原则。它是 PHP 中最受欢迎的单元测试框架。

要安装 PHPUnit,只需在 composer.json 中添加以下依赖项

composer require --dev phpunit/phpunit ^9

配置测试套件

测试套件是一组在预定义配置的环境中执行的单元测试。

  1. 在项目根目录创建一个名为 phpunit.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>
  1. 创建一个名为 tests 的目录,并在其中创建一个名为 bootstrap.php 的文件,包含以下代码
<?php
    require_once __DIR__ . '/../vendor/autoload.php';
    /**
    * @todo acrescente aqui outras definições base para execução dos testes 
    */
  1. 在 composer.json 中添加以下部分
"autoload-dev": {
    "psr-4": {
        "Test\\UnitTest\\": "tests/unit"
    }
},
  1. 在 tests 目录下创建一个名为 unit 的目录,并开始创建测试。

使用 PHPUnit 创建单元测试

在此示例中,我们将使用基本的数学运算来了解 PHPUnit 的功能。

使用 PHPUnit 创建的所有测试都必须以 Test 为后缀,以 test 为前缀的测试方法名。

  1. 创建一个名为 MathTest.php 的文件,并添加以下代码
<?php
    namespace Test\UnitTest;

    final class MathTest extends \PHPUnit\Framework\TestCase {
        public function testTaFuncionandoOPHPUnit(): void {
            $this->assertTrue(true);
        }
    }
  1. 创建您的第一个测试。为此,添加一个名为 testSoma 的函数。测试 2 + 2 是否等于 4。为此,使用接收两个参数并比较它们的 assertEquals 断言。

  2. 我们将修改之前创建的测试,使其变为动态。为此,将函数参数中的两个数字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
 */

数据提供者是测试实例的集合,可用于提高测试的精度,通过提供多个参数和预期的响应。

  1. 在其类中添加以下函数
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官方文档中提供的断言进行测试的测试。为此,请使用PHP的基本操作。

活动

使用Composer的autoload功能加载examples目录中的类,并对每个类进行单元测试。

活动

加载您创建的库,并对Conexão类进行单元测试。

活动

实现一个集成测试,使用Conexão、Autor和Notícia类。

Codeception

Codeception是一个用于PHP Web应用的自动化测试框架。它提供了一系列工具来帮助测试Web应用,从单元测试到用户验收测试。它还包含一组库和资源,以帮助自动化测试执行。

创建测试覆盖率

  1. 在composer.json中添加以下依赖
"codeception/codeception": "^5.0",
"codeception/module-asserts": "^3.0",
"phpunit/php-code-coverage": "^9"
  1. 在项目根目录创建一个名为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
  1. 将codeception.zip文件解压到tests文件夹内
  2. 运行以下命令以运行覆盖率测试
vendor/bin/codecept run --coverage

如果您希望以图形模式生成报告,请使用以下命令

vendor/bin/codecept run --coverage --coverage-html

创建验收测试

  1. 使用PHP内置服务器,在端口8888上提供view文件夹的内容。
  2. 在/tests目录下创建一个名为acceptance的文件夹。
  3. 安装以下依赖
"codeception/module-phpbrowser": "^3.0"
  1. 将以下代码复制到在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