PORTABILITY TEST

PORTABILITY TEST

该 DOCX 包含不完整的 Office 元数据关系,已使用兼容模式恢复正文和媒体。

参考资料DOCX下载原文件
> 该 DOCX 包含不完整的 Office 元数据关系,已使用兼容模式恢复正文和媒体。

可移植性、解耦与隐藏依赖测试规范

文件建议名称:PORTABILITY_TEST.md

1. 测试目的

本测试用于检查当前项目是否存在:

平台强绑定

域名强绑定

服务器强绑定

云服务强绑定

数据库强绑定

存储服务强绑定

API 强绑定

文件路径强绑定

本地开发环境依赖

第三方 CDN 强依赖

外部字体强依赖

特定操作系统依赖

特定端口依赖

特定目录依赖

隐藏环境变量依赖

隐藏全局工具依赖

不必要的第三方 SDK

难以替换的基础设施依赖

跨模块过度耦合

配置散落

硬编码

部署不可复现

换环境后无法运行的问题

本测试的目标不是判断:

当前电脑上是否可以运行。

而是判断:

当前项目能否在未知服务器、未知域名、未知部署平台、未知存储供应商、未知数据库环境下,以较低成本完成迁移和部署。

2. 核心原则

测试期间必须遵守以下原则。

2.1 先测试,后修复

第一轮测试期间:

禁止发现问题后立即修改代码。

必须先完整记录所有问题。

测试完成后统一输出:

问题位置

问题类型

严重程度

触发条件

影响范围

修复建议

未经明确要求,不得开始修复。

2.2 不允许只做静态判断

禁止仅通过阅读代码后得出:

未发现明显问题。

必须尽可能通过:

搜索

构建

启动

环境变化

配置变化

路径变化

网络变化

Provider 替换

干净环境

实际验证。

2.3 不允许为了通过测试修改测试条件

禁止:

修改测试要求

降低测试标准

注释问题代码

临时删除失败模块

为测试添加特殊绕过逻辑

把生产代码改成只适用于测试的代码

遇到失败后直接跳过

任何失败必须记录。

3. 第一阶段:静态扫描

首先对整个项目进行静态扫描。

重点扫描以下内容。

4. 域名硬编码扫描

搜索项目中所有:

http://https://www.

检查是否存在:

固定生产域名

固定 API 地址

固定 CDN 地址

固定图片地址

固定后台地址

固定跳转地址

固定 Webhook 地址

固定 OAuth 回调地址

允许存在的位置:

README

测试数据

示例文件

.env.example

明确标记的配置文件

业务代码中不得直接依赖具体域名。

发现后记录:

文件:行号:具体值:用途:是否可配置:风险:

5. IP 地址扫描

扫描 IPv4 / IPv6 地址。

重点检查:

192.0.2.10192.0.2.10192.168.*10.*172.*公网 IP

判断是否进入:

API 请求

数据库连接

上传逻辑

WebSocket

服务调用

回调地址

前端页面逻辑

生产逻辑不得依赖固定 IP。

6. 端口扫描

检查是否硬编码:

3000300151734173808080007860543233066379

以及其他服务端口。

判断端口是否:

可配置

只属于开发环境

泄漏到了业务逻辑

被前端直接依赖

7. 绝对路径扫描

搜索类似:

C:\D:\E:/Users//home//var//opt//root/

生产代码不得依赖开发者电脑绝对路径。

重点检查:

文件上传

图片资源

字体

日志

缓存

临时文件

数据库文件

构建脚本

部署脚本

8. 第三方平台扫描

搜索项目中所有特定平台名称。

包括但不限于:

VercelCloudflareNetlifyAWSAzureGoogle CloudFirebaseSupabaseHuawei CloudAliyunTencent CloudRailwayRenderFly.io

检查这些依赖是否:

A. 只存在于适配层

可以接受。

B. 大量散落于业务代码

视为架构问题。

9. 第三方 SDK 扫描

检查:

package.jsonlock 文件源码 import配置文件

列出所有第三方 SDK。

分类:

UI

数据库

存储

认证

日志

分析

部署

CDN

AI

邮件

搜索

图片处理

每项回答:

是否必须?是否可以替换?是否直接侵入业务代码?删除后影响范围多大?

10. 外部资源扫描

检查是否依赖:

Google Fonts

CDN CSS

CDN JS

外链字体

外链图标

外链图片

第三方脚本

在线组件库

在线追踪脚本

重点搜索:

@import url(<link<script src=fetch(axios(

必须明确哪些资源在断网后会失效。

11. 环境变量审计

列出项目当前使用的全部环境变量。

输出表格:

变量 用途 必填 默认值 缺失后表现

重点检查:

是否存在类似:

process.env.API_URL || “https://production.example.com”

这种情况视为风险。

原则:

关键基础设施变量缺失时,应明确报错,而不是偷偷回退到某个固定生产环境。

12. 配置散落检查

检查以下内容是否散落在多个页面和模块:

URL

API 地址

字体

颜色

路径

端口

上传限制

文件大小限制

分页数量

缓存时间

Provider 名称

数据库配置

存储 Bucket

Feature Flag

如果同一配置出现多个地方:

记录为:

Configuration Duplication

13. 业务层与基础设施层耦合检查

重点检查业务代码是否直接调用:

数据库 SDK云存储 SDK第三方认证 SDK部署平台 SDK云厂商 SDK

理想结构:

业务逻辑↓Service↓Interface↓Adapter↓具体 Provider

而不是:

页面↓某云厂商 SDK

14. 第二阶段:运行测试

完成静态扫描后开始实际测试。

第一轮禁止修复代码。

15. Clean Install Test

创建一个干净环境。

删除或不使用:

node_modules构建缓存.nextdistbuild缓存目录旧日志本地数据库缓存

只保留:

源代码package.jsonlock 文件配置模板必要文档

执行正常安装。

验证:

InstallBuildStart

记录:

PASS / FAIL

如果失败,记录完整原因。

16. Clean Build Test

禁止依赖之前生成的:

缓存

构建结果

临时文件

本地生成文件

执行全新 Build。

必须验证:

生产构建是否成功

17. Directory Relocation Test

将整个项目复制到完全不同目录。

例如原目录:

/project/starmo

测试目录:

/tmp/random-project-38291

Windows 可使用不同盘符和目录。

重新执行:

installbuildstart

目的:

发现隐藏绝对路径和工作目录假设。

18. Port Mutation Test

将开发或运行端口修改为其他端口。

至少测试:

41738088

验证:

页面

API

资源

登录

WebSocket

回调

上传

是否仍正常。

19. Domain Mutation Test

将网站域名模拟修改。

例如:

https://通用数字产品.com

替换为:

https://example.test

验证:

页面跳转

图片地址

SEO

Metadata

Canonical URL

API

登录

分享

下载

回调

是否存在域名依赖。

20. Host Mutation Test

测试:

localhost192.0.2.10192.0.2.10测试域名局域网 IP

检查服务是否假设固定 Host。

21. Base Path Test

模拟网站不是部署在:

/

而是:

/starmo/

重点检查:

图片字体CSSJS页面跳转API静态文件下载文件

发现是否存在固定根路径依赖。

22. Offline Runtime Test

断开外部互联网连接。

再启动项目。

检查:

核心页面能否加载

本地字体能否显示

UI 是否完整

图标是否丢失

CSS 是否缺失

JavaScript 是否失败

图片是否异常

是否存在第三方资源导致页面白屏

第三方业务功能本身允许失败。

但失败不得导致无关功能整体崩溃。

23. External Resource Failure Test

模拟以下资源不可访问:

外部字体CDN统计平台第三方 API外链图片第三方脚本

验证网站是否能够:

Graceful Degradation

即:

局部功能失败,

但整体网站仍然可使用。

24. Missing Environment Variable Test

逐项移除重要环境变量。

例如:

DATABASE_URLAPI_BASE_URLSTORAGE_KEYSTORAGE_ENDPOINTSITE_URL

验证系统是否:

正确:

启动时明确告诉用户缺少哪个变量。

错误:

运行到某个页面才莫名报错。

严重错误:

偷偷 fallback 到生产服务器。

25. Invalid Configuration Test

故意提供错误值:

错误数据库地址错误存储 Endpoint无效 Token错误路径错误端口

检查:

报错是否明确

是否泄露敏感信息

是否导致整个系统崩溃

是否影响无关模块

26. Provider Removal Test

临时关闭一个外部 Provider。

例如:

Storage ProviderDatabase ProviderAnalytics ProviderEmail ProviderAI Provider

测试:

Provider 不可用时,

是否只影响对应模块。

不应:

上传服务失败↓整个后台失败↓整个网站失败

27. Provider Swap Test

如果项目使用 Adapter / Interface 架构,

创建一个最简单的测试 Provider。

例如:

FakeStorageAdapter

实现最基础:

uploadreaddelete

将真实 Provider 替换。

如果大量业务文件必须同时修改:

说明 Provider 并未真正解耦。

记录需要修改:

文件数量代码范围模块范围

28. Database Coupling Test

分析当前数据库依赖。

检查切换数据库时需要修改多少内容。

业务层不应该大量存在:

Supabase 特定写法Firebase 特定写法Prisma 特定结构SQL 方言云厂商专属 API

允许在:

RepositoryAdapterInfrastructure

层存在。

29. Storage Coupling Test

模拟当前存储服务退出。

回答:

如果明天更换:

Cloudflare R2→Huawei OBS

需要修改多少文件?

输出:

预计修改文件数量:业务层修改:Infrastructure 修改:UI 修改:配置修改:

如果必须大面积修改业务页面:

判定存在强耦合。

30. Linux Compatibility Test

如果开发环境为 Windows,

必须在 Linux 环境执行:

installbuildtest

重点检查:

路径分隔符

文件名大小写

Shell 命令

权限

环境变量

文件系统差异

31. Case Sensitivity Test

检查:

Logo.pnglogo.pngLOGO.png

等问题。

Windows 可能正常。

Linux 可能失败。

必须扫描所有 import 和静态资源引用。

32. Fresh Environment Test

在一个没有以下内容的环境执行:

全局 npm 包IDE 插件开发者环境变量开发者 SSH 配置开发者 Git 配置依赖特殊系统 PATH本地数据库本地缓存

只按照项目文档操作。

验证是否可以运行。

33. Dependency Reproducibility Test

验证是否存在:

开发者本地安装了某包但 package.json 没有记录

或:

依赖版本不明确

必须检查:

package.jsonlock 文件Node 版本Package Manager 版本

34. Secret Scan

扫描:

API Key

Token

Password

Secret

Access Key

Private Key

Session

数据库密码

重点搜索:

sk-tokensecretpasswordapikeyapi_keyaccess_keyprivate_key

发现后立即标记:

CRITICAL

第一阶段只报告,不擅自删除或更换。

35. Git / Repository Leak Test

检查敏感文件是否可能进入 Git。

确认:

.env.env.local密钥私钥日志数据库文件上传文件缓存构建产物

是否正确忽略。

36. 第三阶段:隐藏假设测试

完成已知测试后,

不得直接结束。

需要主动寻找:

当前测试规范没有明确列出,但未来迁移时可能产生问题的隐藏假设。

至少检查:

时间区

Locale

编码

文件权限

文件系统

CPU 架构

Node 版本

浏览器差异

HTTPS 假设

CORS

CSP

Proxy

Reverse Proxy

WebSocket

CDN

Cache

Session Storage

Upload Path

MIME Type

文件名编码

中文路径

数据库时区

日期格式

大小写敏感

环境变量格式

Runtime 差异

发现任何项目特有的问题必须追加。

37. 架构影响范围测试

选择以下任意一个变更进行分析:

更换数据库更换云存储更换域名更换服务器更换部署平台更换字体更换 CDN

回答:

需要修改多少个文件?

理想状态:

配置+Adapter+极少量基础设施代码

而不是:

大量页面大量组件业务代码APIUI

38. 禁止项

项目正式业务代码中尽量不得存在以下形式:

固定域名固定公网 IP固定端口固定本地路径生产密钥生产 Token云厂商专属逻辑散落数据库 SDK 散落外链核心字体外链核心 UI 资源未经说明的第三方脚本隐藏 fallback

39. 测试评分

最终输出 0–100 分。

Domain Independence

__/100

Server Independence

__/100

Platform Independence

__/100

Storage Independence

__/100

Database Independence

__/100

API Independence

__/100

Resource Independence

__/100

Configuration Quality

__/100

Build Reproducibility

__/100

Environment Independence

__/100

Maintainability

__/100

40. 总评分

输出:

通用数字产品 Portability Score:__/100

并给出等级:

95–100 Excellent85–94 Good70–84 Needs Improvement50–69 High Coupling Risk0–49 Not Portable

41. 问题严重等级

所有问题必须分类。

P0 — Critical

例如:

Secret 泄露

必须使用特定服务器

无法 Clean Build

大范围平台锁定

生产配置硬编码

P1 — High

例如:

更换存储需要修改大量业务代码

域名大量硬编码

本地路径依赖

平台 SDK 深度侵入业务层

P2 — Medium

例如:

配置重复

部分资源依赖 CDN

错误处理耦合

Base Path 不兼容

P3 — Low

例如:

文档缺失

配置命名不统一

非关键资源可移植性较弱

42. 最终测试报告格式

必须严格输出:

# XXXXXXX Portability Audit Report## 总结Overall Score:主要风险:是否建议上线:—## P0### Issue 001文件:位置:问题:测试方式:测试结果:影响:建议:—## P1…—## P2…—## P3…—# Portability ScoreDomain Independence:Server Independence:Platform Independence:Storage Independence:Database Independence:API Independence:Resource Independence:Configuration Quality:Build Reproducibility:Environment Independence:Maintainability:Overall:—# Hidden Assumptions列出本次测试中新发现、原测试规范没有明确指出的问题。—# Migration Simulation如果明天迁移至:- 新服务器- 新域名- 新对象存储- 新数据库- 新部署平台分别需要修改:文件:配置:代码:基础设施:预计风险:—# ConclusionPASS / CONDITIONAL PASS / FAIL

43. 第一轮执行要求

当前阶段只执行:

检测测试记录分析输出报告

禁止:

修复重构升级依赖删除依赖更换架构自动修改配置

除非我后续明确要求:

开始修复。

44. 测试顺序

严格按照:

静态扫描↓依赖审计↓配置审计↓Clean Install↓Clean Build↓目录迁移↓端口变化↓域名变化↓Base Path↓断网↓外部服务故障↓环境变量缺失↓Provider Removal↓Provider Swap↓Linux Compatibility↓Secret Scan↓隐藏假设分析↓迁移模拟↓最终报告

45. 最终原则

本测试的目标不是证明项目:

在当前环境能够运行。

而是证明:

即使域名、服务器、部署平台、数据库、存储服务、目录、端口和运行环境全部改变,项目仍然具有清晰、可控、低成本的迁移路径。

如果测试无法证明这一点:

不得标记为:

Portability PASS

测试必须以实际证据为准,而不是根据架构描述、README 或开发者意图进行判断。