youritservices / mock-server-bundle
Symfony 命令,用于将 API 模拟数据加载到 MockServer 中
Requires
- php: ^7.4|^8.0
- ext-json: *
- nesbot/carbon: ^2.61
- symfony/config: ^5.4|^6.0
- symfony/dependency-injection: ^5.4|^6.0
- symfony/http-client: ^5.4.|^6.0
- symfony/http-kernel: ^5.4|^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- mikey179/vfsstream: ^1.6
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
- rregeer/phpunit-coverage-check: ^0.3.1
- slevomat/coding-standard: ^8.3
- squizlabs/php_codesniffer: ^3.7
- symfony/dotenv: ^5.4|^6.0
- symfony/phpunit-bridge: ^5.4|^6.0
README
Mock Server Bundle 的目标是使在自动化测试和本地开发过程中模拟远程 API 调用更加容易,移除应用程序本身中的远程 API 模拟代码的需求,并确保 API 调用在待测系统外部进行。
该组件利用 MockServer 通过 Docker 容器提供远程模拟 API,并添加了 Symfony 命令来加载和重置模拟 API 数据到该系统中。
模拟数据目前可以使用以下格式
- JSON
- JSON:API
- SOAP
以及以下方法
- GET
- DELETE
- PATCH
- POST
该组件将提供的模拟文件(见下文)组装成适合 MockServer 的请求,允许开发人员或测试人员只需添加预期的请求和响应负载(例如,通过复制实际 API 调用的现有负载),而无需编写实现它们的代码。
安装
该组件使用 contrib 食谱,因此您需要在安装过程中启用它,或者在 composer 配置中添加选项
composer config extra.symfony.allow-contrib true
使用以下命令安装软件包
composer require youritservices/mock-server-bundle --dev
启用组件
如果您没有使用 Symfony Flex,您需要通过在项目的 config/bundles.php
文件中添加以下行来启用组件
<?php
declare(strict_types=1);
return [
...
YourITServices\MockServerBundle\MockServerBundle::class => ['dev' => true, 'test' => true],
...
];
配置
编辑 config/packages/mock_server.yaml
文件,根据您的环境设置适当的值。该文件和环境变量 MOCK_SERVER_HOST
已由 flex 食谱添加到您的 .env
文件中。
# config/packages/mock_server.yaml
when@test: &test
mock_server:
host_url: '%env(MOCK_SERVER_HOST)%'
mocks_directory: '%kernel.project_dir%/tests/apiMocks'
when@dev: *test
参数
host_url
必需
MockServer Docker 容器设置的 URL
mocks_directory
必需
要加载的 API 模拟数据的根路径。
MockServer 服务
命令使用了 MockServer,因此它需要可用于您的项目,最简单的方法是在 docker-compose.yml
中定义一个服务。
# docker-compose.yml
version: '3.9'
services:
mock-api:
image: mockserver/mockserver:5.15.0
ports:
- "1080:1080"
environment:
JVM_OPTIONS: -Dmockserver.enableCORSForAllResponses=true
MockServer 提供了仪表板,因此您可以查看加载的模拟数据以及针对该服务发出的请求。如果按照上述方式定义了服务,则可以通过 http://mock-api:1080/mockserver/dashboard 访问
用法
API 模拟
API 模拟可以存储在 mocks_directory 下的任何目录结构中,允许您根据需要组织模拟。
每个模拟由多个文件组成,具体取决于涉及的格式和使用的 HTTP 方法,如下所述。
模拟按目录顺序加载,每个目录按目录中包含的文件(s)的序列号排序。MockServer 按创建顺序处理加载的模拟,因此默认或后备响应应在更具体的响应之后排序。
URL
用于 JSON 或 JSON:API 基于模拟的 URL 文件遵循以下文件命名约定
<序列号>.<描述>.url.txt
文件包含以下内容
<状态码> <动词> <url 编码路径> <格式> <响应时间(可选)>
SOAP
用于基于 SOAP 的模拟的 soap 文件遵循以下文件命名约定
<序列号>.<描述>.soap.txt
文件包含以下内容
<状态码> <动词> <url 编码路径> <SOAP 操作> <响应时间(可选)>
请求
此文件包含请求体(如有需要)以期望的格式(json或xml),与发送到远程API的格式完全相同,并遵循文件命名约定。
<序列号>.<描述>.request.<格式>
响应
此文件包含响应体以期望的格式(json或xml),与远程API在响应请求时发送的格式完全相同,并遵循文件命名约定。
<序列号>.<描述>.response.<格式>
示例
GET (JSON)
1.sending-postcode-with-available-addresses.url.txt
200 GET /v1/autocomplete/addresses/paf_1/gbr?api_key=TestAddressApiKey JSON 500ms
1.sending-postcode-with-available-addresses.response.json
{
"result": [
{
"line_1": "1 Test Street",
"line_2": "Test Line 2",
"line_3": "Test Line 3",
"post_town": "TOWN",
"traditional_county": "Test County",
"postal_county": "Test County",
"postcode": "POST C01",
"id": "paf_1"
}
],
"code": 2000,
"message": "Success",
"limit": 100,
"page": 0,
"total": 1
}
POST (JSON:API)
1.create-customer.url.txt
201 POST /api/v1/test JSON:API 100ms
1.create-customer.request.json
{
"data": {
"type": "customers",
"attributes": {
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com"
}
}
}
1.create-customer.response.json
{
"jsonapi": {
"version": "1.0"
},
"meta": {
"version": "0.1.0"
},
"data": {
"type": "customer",
"id": "1",
"attributes": []
}
}
POST (SOAP)
1.validate-address.soap.txt
200 POST /services/ValidateAddressServiceSoap ValidateAddressRequest 100ms
1.validate-address.request.xml
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://xmlns.example.com/Address/ValidateAddress">
<soap-env:header></soap-env:header>
<soap-env:body>
<ns1:ValidateAddressRequest>
</ns1:ValidateAddressRequest>
</soap-env:body>
</soap-env:envelope>
1.validate-address.response.xml
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">
<soap-env:body>
<ns0:ValidateAddressResponse xmlns:ns0="https://xmlns.example.com/Address/ValidateAddress">
</ns0:ValidateAddressResponse>
</soap-env:body>
</soap-env:envelope>
命令
加载模拟
此操作加载配置的 mocks_directory 中所有可用的模拟。
bin/console mockserver:load
重置/移除模拟
此操作重置/移除所有当前加载的模拟,通常在加载之前使用,以确保只加载/可用当前模拟。
bin/console mockserver:reset
开发
此包附带Makefile,可轻松设置开发环境。只需克隆存储库,确保满足要求,然后运行 make up
要求
基本命令
启动所有Docker容器
make up
停止所有Docker容器
make down
从零开始(删除供应商并重建容器)
make rebuild
在推送远程分支并触发CI流水线之前运行所有测试
make pre-push
所有可用的make命令
make help