DID测试套件

2024-08-22 07:12
文章标签 测试 套件

本文主要是介绍DID测试套件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DID测试套件

介绍

名称

  • DID Test Suite

网址

  • https://github.com/w3c/did-test-suite

功能

  • 用于验证DID实现是否符合W3C DID Core规范的一系列测试
  • 反映各DID方法(如did:orbdid:keydid:web等)的实现对DID Core规范的遵从程度
  • 确保不同DID方法解析器URL解引用器之间的互操作性

技术架构

  • 编程语言:HTML+JavaScript
  • 框架: Jest

维护团队

W3C的DID工作组(DID Working Group)

项目价值

  • W3C制定DID标准非常权威
  • 合作方众多,包括3Box Labs、ART GROUP LIMITED ARTRACX.COM、cheqd、ConsenSys Mesh、Knox Networks、Spruce Systems、Transmute 、EBSI等

项目组织结构

请添加图片描述

使用方式

  1. 拉取代码
git clone git@github.com:w3c/did-test-suite.git
  1. 安装依赖(请注意nodejs版本,16+)
npm i
  1. 将要测试的json文件放置到对应目录下,并添加到对应的default.js文件中
./packages/did-core-test-server/suites/implementations/
  • DID输入文件名称添加到相应测试套件的default.js文件中
  • DID方法应当将其自身添加至 did-identifierdid-core-propertiesdid-productiondid-consumption 测试套件
  • DID解析器实现只需添加至 did-resolution 测试套件
  • DID url解析器实现只需添加至did-url-dereferencers测试套件
  1. 切换到工作目录
cd ./packages/did-core-test-server
  1. 测试并生成报告
npm run test-and-generate-report

报告生成在./docs文件夹下,格式为html
其他测试方式:
a. 通过http启动

npm run start

![[Pasted image 20240417091111.png]]
b. 只测试不生成报告

npm run test

DID方法示例

参考文档: did-example-didwg.json
详细描述了 “Example DID Method” 的基本信息、支持的 DID 参数示例,以及 DID did:example:123 在不同内容类型(JSON 和 JSON-LD)下的表示及其相关元数据。

{
### DID 方法基本信息"didMethod": "did:example",                   定义了所使用的 DID 方法前缀。"implementation": "Example DID Method",       描述了具体的 DID 方法实现名称"implementer": "DID Working Group",           指出负责实现和维护此 DID 方法的组织或团队"supportedContentTypes": [                    列出了该 DID 方法支持的文档表示格式:"application/did+json",JSON 格式表示 DID 文档。"application/did+ld+json"JSON+ld 格式表示 DID 文档,包含链接数据上下文。],
### DID 参数示例 "dids": ["did:example:123"],                   提供了一个使用该 DID 方法的实际 DID 示例列表"didParameters": {                             展示了与 DID 关联的可选查询参数的示例"hl": "did:example:123?hl=zQmWvQxTqbG2Z9HPJgG57jjwR154cKhbtJenbyYTWkjgF3e", 高亮(Highlight)参数"service": "did:example:123?service=agent&relativeRef=%2Fpath%2Fto%2Fresource", 服务查询参数,指定了服务类型(`agent`)和相对引用路径。"relativeRef": "did:example:123?service=agent&relativeRef=%2Fpath%2Fto%2Fresource",相对引用参数,与上述服务查询参数相同,但作为独立条目列出。"versionId": "did:example:123?versionId=0.1.0", 版本标识符参数,提供了一个版本号"versionTime": "did:example:123?versionTime=2020-09-26T20:14:02Z" 版本时间戳参数,给出了一个具体的时间点},
### DID `did:example:123` 的详细信息"did:example:123": {#### DID Document Data Model (通用属性)"didDocumentDataModel": {"properties": {"id": "did:example:123",   DID 文档的唯一标识符。"verificationMethod": [   包含两个公钥对象,每个对象代表一种可用于验证签名的密钥{"id": "did:example:123#key-0",  key-0:使用 Ed25519 曲线的 JsonWebKey2020 类型密钥"type": "JsonWebKey2020","controller": "did:example:123","publicKeyJwk": {"kty": "OKP","crv": "Ed25519","x": "VDXDwuGKVq91zxU6q7__jLDUq8_C5cuxECgd-1feFTE"}},{"id": "did:example:123#key-1", key-1:使用 X25519 曲线的 JsonWebKey2020 类型密钥"type": "JsonWebKey2020","controller": "did:example:123","publicKeyJwk": {"kty": "OKP","crv": "X25519","x": "3kY9jl1by7pLzgJktUH-e9H6fihdVUb00-sTzkfmIl8"}}],"authentication": ["#key-0"], 指定 `#key-0` 为身份认证所使用的密钥。"assertionMethod": ["#key-0"], 同样指定 `#key-0` 为断言方法所使用的密钥"capabilityInvocation": ["#key-0"], 指定 `#key-0` 为能力调用所使用的密钥"capabilityDelegation": ["#key-0"], 指定 `#key-0` 为能力委托所使用的密钥"keyAgreement": ["#key-1"], 指定 `#key-1` 为密钥协商所使用的密钥"bespokeDatetime": "2020-09-26T20:14:02Z", 一个定制的日期时间字符串"bespokeDouble": 1.2, 一个定制的双精度浮点数"bespokeInteger": 5, 定制的整数"bespokeBoolean": true, 定制的布尔值"bespokeNull": null  定制的空值}},#### application/did+json 表示"application/did+json": {"didDocumentDataModel": {}},"representation": "{\"id\":\"did:example:123\",\"verificationMethod\":[{\"id\":\"did:example:123#key-0\",\"type\":\"JsonWebKey2020\",\"controller\":\"did:example:123\",\"publicKeyJwk\":{\"kty\":\"OKP\",\"crv\":\"Ed25519\",\"x\":\"VDXDwuGKVq91zxU6q7__jLDUq8_C5cuxECgd-1feFTE\"}},{\"id\":\"did:example:123#key-1\",\"type\":\"JsonWebKey2020\",\"controller\":\"did:example:123\",\"publicKeyJwk\":{\"kty\":\"OKP\",\"crv\":\"X25519\",\"x\":\"3kY9jl1by7pLzgJktUH-e9H6fihdVUb00-sTzkfmIl8\"}}],\"authentication\":[\"#key-0\"],\"assertionMethod\":[\"#key-0\"],\"capabilityInvocation\":[\"#key-0\"],\"capabilityDelegation\":[\"#key-0\"],\"keyAgreement\":[\"#key-1\"],\"bespokeDatetime\":\"2020-09-26T20:14:02Z\",\"bespokeDouble\":1.2,\"bespokeInteger\":5,\"bespokeBoolean\":true,\"bespokeNull\":null}",提供了以纯 JSON 格式表示的 DID 文档字符串,与 DID Document Data Model 中的通用属性一致。"didDocumentMetadata": {   描述了 DID 文档的元数据"canonicalId": "did:example:one-two-three",DID 文档 ID 相同"equivalentId": "did:example:one-two-three",DID 文档 ID 相同,"created": "2020-09-26T20:14:02.000Z", 创建的时间戳"updated": "2020-09-27T20:14:02.000Z", 更新的时间戳"nextUpdate": "2020-09-28T20:14:02.000Z",  下次更新的时间戳"versionId": "0.1.0",  版本标识号"nextVersionId": "0.2.0" 下一版本标识号},"didResolutionMetadata": {"contentType": "application/did+json" 描述了 DID 解析过程中的元数据,仅包含 **contentType** 字段,其值为}},#### application/did+ld+json 表示"application/did+ld+json": {"didDocumentDataModel": {"representationSpecificEntries": {"@context": ["https://www.w3.org/ns/did/v1"]}},"representation": "{\"@context\":[\"https://www.w3.org/ns/did/v1\"],\"id\":\"did:example:123\",\"verificationMethod\":[{\"id\":\"did:example:123#key-0\",\"type\":\"JsonWebKey2020\",\"controller\":\"did:example:123\",\"publicKeyJwk\":{\"kty\":\"OKP\",\"crv\":\"Ed25519\",\"x\":\"VDXDwuGKVq91zxU6q7__jLDUq8_C5cuxECgd-1feFTE\"}},{\"id\":\"did:example:123#key-1\",\"type\":\"JsonWebKey2020\",\"controller\":\"did:example:123\",\"publicKeyJwk\":{\"kty\":\"OKP\",\"crv\":\"X25519\",\"x\":\"3kY9jl1by7pLzgJktUH-e9H6fihdVUb00-sTzkfmIl8\"}}],\"authentication\":[\"#key-0\"],\"assertionMethod\":[\"#key-0\"],\"capabilityInvocation\":[\"#key-0\"],\"capabilityDelegation\":[\"#key-0\"],\"keyAgreement\":[\"#key-1\"],\"bespokeDatetime\":\"2020-09-26T20:14:02Z\",\"bespokeDouble\":1.2,\"bespokeInteger\":5,\"bespokeBoolean\":true,\"bespokeNull\":null}",提供了以 JSON-LD 格式表示的 DID 文档字符串,包含了 `"@context"` 属性,其值为 `"https://www.w3.org/ns/did/v1"`,确保文档符合 W3C DID 规范的语义。"didDocumentMetadata": {},"didResolutionMetadata": {"contentType": "application/did+ld+json"}}}
}

DID解析器示例

参考文档: resolver-example-didwg.json
详细描述了 “Example Resolver” 解析器的基本信息、预期结果分类,以及在不同条件下解析 DID 的七个执行案例及其输入、输出细节。这些案例涵盖了成功解析、DID 格式错误、DID 不存在、DID 已撤销等不同场景,以及对 JSON、JSON-LD 和 CBOR 等不同内容类型的支持

{"implementation": "Example Resolver",   指定解析器的名称。"implementer": "DID Working Group",     明确解析器由 DID Working Group 开发和维护"didMethod": "did:example",             指出该解析器适用于以 `did:example` 为前缀的 DID"expectedOutcomes": {             定义了解析过程中可能出现的几种典型结果类别,并关联了执行案例的索引"defaultOutcome": [ 0, 4, 5, 6 ],    对应成功解析且无特殊状态的案例(索引为 0456"invalidDidErrorOutcome": [ 1 ],     对应解析时因 DID 格式不正确导致的错误案例(索引为 1"notFoundErrorOutcome": [ 2 ],       对应解析时因 DID 不存在导致的错误案例(索引为 2"representationNotSupportedErrorOutcome": [ ],  未关联任何案例,可能表示此解析器目前不处理任何特定表示不支持的情况"deactivatedOutcome": [ 3 ]        对应解析到已撤销/停用的 DID 的案例(索引为 3},"executions": [                      包含多个解析器执行案例{"function": "resolve",         调用的解析器函数,resolve为 解析 DID 并返回 DID 文档"input": {"did": "did:example:111",    待解析的 DID"resolutionOptions": {       解析选项,可能包含接受的内容类型(`accept`}},"output": {                    函数调用的预期输出  "didResolutionMetadata": {      解析过程的元数据,可能包含错误信息(`error`)或内容类型(`contentType`},"didDocument": {    成功解析时返回的 DID 文档,包含 `id``verificationMethod``service` 等字段;若解析失败,则为 `null`"id": "did:example:111","verificationMethod": [],"service": []},"didDocumentMetadata": {DID 文档相关的元数据,如 `canonicalId`(规范化的 DID)、`equivalentId`(等价的 DID 列表)或 `deactivated`(是否已撤销/停用)。"canonicalId": "did:example:oneoneone","equivalentId": ["did:example:one1one", "did:example:1one1"]}}},{"function": "resolve","input": {"did": "did:example_222","resolutionOptions": {}},"output": {"didResolutionMetadata": {"error": "invalidDid"},"didDocument": null,"didDocumentMetadata": {}}},{"function": "resolve","input": {"did": "did:example:333","resolutionOptions": {}},"output": {"didResolutionMetadata": {"error": "notFound"},"didDocument": null,"didDocumentMetadata": {}}},{"function": "resolve","input": {"did": "did:example:444","resolutionOptions": {}},"output": {"didResolutionMetadata": {},"didDocument": {"id": "did:example:444","verificationMethod": [],"service": []},"didDocumentMetadata": {"deactivated": true}}},{"function": "resolveRepresentation",  解析 DID 并返回特定内容类型的 DID 文档流"input": {"did": "did:example:555","resolutionOptions": {"accept": "application/did+json" 接受内容类型: `"application/did+json"`}},"output": {"didResolutionMetadata": {"contentType": "application/did+json"},"didDocumentStream": "{\"id\":\"did:example:555\",\"verificationMethod\":[],\"service\":[]}","didDocumentMetadata": {}}},{"function": "resolveRepresentation","input": {"did": "did:example:666","resolutionOptions": {"accept": "application/did+ld+json"  接受内容类型: `"application/did+cbor"`}},"output": {"didResolutionMetadata": {"contentType": "application/did+ld+json"},"didDocumentStream": "{\"@context\":\"https://www.w3.org/ns/did/v1\",\"id\":\"did:example:666\",\"verificationMethod\":[],\"service\":[]}",  返回一个 CBOR 编码的 DID 文档流"didDocumentMetadata": {}}},{"function": "resolveRepresentation","input": {"did": "did:example:777","resolutionOptions": {"accept": "application/did+cbor"}},"output": {"didResolutionMetadata": {"contentType": "application/did+cbor"},"didDocumentStream": "62a36469646f6469653a6178706d656c313a3332767272656669636974616f694d6e74656f68806473677265697665630080","didDocumentMetadata": {}}}]}

DID URL-解引用器示例

参考文档: dereferencer-example-didwg.json
详细描述了 “Example Dereferencer” 解析器的基本信息、预期结果分类,以及在不同条件下解析 DID URL 的四个执行案例及其输入、输出细节。这些案例涵盖了成功解析 DID 文档和其内部资源、DID URL 格式错误以及资源未找到等不同场景,所有案例都要求解析结果以 JSON 格式返回。

{"implementation": "Example Dereferencer","implementer": "DID Working Group","didMethod": "did:example",                指出该解析器适用于以 `did:example` 为前缀的 DID URL"expectedOutcomes": {                   定义了解析过程中可能出现的几种典型结果类别,并关联了执行案例的索引"defaultOutcome": [ 0, 1 ],           对应成功解析且无特殊状态的案例(索引为 01)。"invalidDidUrlErrorOutcome": [ 2 ],   对应解析时因 DID URL 格式不正确导致的错误案例(索引为 2)。"notFoundErrorOutcome": [ 3 ]          对应解析时因请求的资源不存在导致的错误案例(索引为 3},"executions": [{"function": "dereference","input": {"didUrl": "did:example:222",         待解析的 DID URL"dereferenceOptions": {"accept": "application/did+json"    解析选项,包含接受的内容类型(`accept`}},"output": {"dereferencingMetadata": {           解析过程的元数据,可能包含错误信息(`error`)或内容类型(`contentType`)。"contentType": "application/did+json"},"contentStream": "{\"id\": \"did:example:222\",\"verificationMethod\": [{\"id\": \"did:example:222#key-1\",\"controller\": \"did:example:222\",\"publicKeyBase58\": \"F6NxfeuPJ5NhmDM6QT2TeSFxcnnkQBgtv6yfQziS5NPM\"}],\"service\": []}",
返回一个完整的 DID 文档内容,包含 `id`、一个 `verificationMethod`(公钥信息)和空的 `service` 列表"contentMetadata": {}}},{"function": "dereference","input": {"didUrl": "did:example:222#key-1","dereferenceOptions": {"accept": "application/did+json"}},"output": {"dereferencingMetadata": {"contentType": "application/did+json"},"contentStream": "{\"id\": \"did:example:222#key-1\",\"controller\": \"did:example:222\",\"publicKeyBase58\": \"F6NxfeuPJ5NhmDM6QT2TeSFxcnnkQBgtv6yfQziS5NPM\"}","contentMetadata": {}}},{"function": "dereference","input": {"didUrl": "did:example_333","dereferenceOptions": {"accept": "application/did+json"}},"output": {"dereferencingMetadata": {"error": "invalidDidUrl"},"contentStream": "","contentMetadata": {}}},{"function": "dereference","input": {"didUrl": "did:example:444","dereferenceOptions": {"accept": "application/did+ld+json"}},"output": {"dereferencingMetadata": {"error": "notFound"},"contentStream": "","contentMetadata": {}}}]}

测试内容解析

文档中列举的“✅”符号表示特定测试已成功通过,即某个DID方法在特定测试点上符合DID Core规范要求。例如:

  • Metadata Structure 测试表明,对于给定的DID(如did:orb:bafkreiazah4qrybzyapmrmk2dhldz24...),其文档中的元数据结构正确采用了application/did+ld+json格式,且属性值均为字符串,符合规范。

  • DID Document Metadata 测试关注的是DID文档元数据中的canonicalId属性。结果显示,预期的规范化标识符(canonicalId)在解析过程中得到了正确的生成或验证,与规范中的预期结果一致。

  • did-core-properties 测试集中于DID文档中核心属性的结构和内容。例如,针对did:key:z6LSn9Ah7d33uokFv2pg66BMN5UY72Wt...,其所有属性值均为字符串,并且整个元数据结构符合规范要求。

  • MATTR Internal Libraries 示例展示了MATTR公司内部库对did:sovdid:web两种方法的支持情况。测试结果显示,这些库在处理特定DID时能够正确生成或验证相关的密钥、类型、链接等信息。

did-core-properties测试

此类测试主要关注DID文档中定义的核心属性是否符合DID Core规范。这包括:

  1. DID Subject(主体):验证DID文档中的id属性(即DID本身)是否正确设置,格式是否符合规范定义的ABNF(Augmented Backus-Naur Form)规则。

  2. Controller(控制器):检查DID文档中是否存在可选的controller属性,并确认其值是否为有效的DID或DID URL,代表了对DID文档具有控制权的实体。

  3. Verification Methods(验证方法):确保文档中列出的验证方法(如公钥、加密密钥等)结构正确,包括方法类型、公钥材料、关联的密钥用途标签等,并验证它们是否遵循规范的约束,如不包含保留字符等。

  4. Service Endpoints(服务端点):验证服务端点对象的完整性,包括类型、服务URL、关联的DID URL等属性是否正确设定,且类型为字符串。

  5. Metadata(元数据):检查DID文档的元数据(如创建时间、更新时间、版本标识符等)是否符合规范要求,格式正确且含义清晰。

did-identifier测试

这类测试专注于验证DID标识符本身的结构和语义。包括:

  1. Syntax(语法):确保DID字符串遵循规范定义的通用语法,如由did:前缀、方法名、方法特定的标识符段(可能包含路径、查询参数等)组成,各部分之间使用冒号分隔。

  2. Parameters(参数):检查DID中可能存在的版本标识符(versionId)、版本时间戳(versionTime)等参数是否符合规范定义的格式和使用规则。

  3. Relative DID URLs(相对DID URL):验证相对DID URL在解析和使用过程中的正确性,包括其相对于基DID的构建方式、解析后的绝对DID URL是否符合预期。

did-production测试

这类测试评估DID生成工具或库是否能正确地依据DID方法规范创建合法的DID文档。包括:

  1. Document Creation(文档创建):验证生成的DID文档是否包含所有必需的属性,并且属性值符合各自的格式要求。

  2. Method-Specific Rules(方法特定规则):确保在创建DID文档时,针对特定DID方法(如did:tzdid:orb等)的特殊要求得到满足,如特定的密钥格式、链上注册过程等。

  3. Consistency(一致性):检查生成的DID文档在多次独立生成过程中保持一致,除非有明确的更新意图。

did-resolution测试

此类测试关注DID解析器能否正确解析DID文档,包括:

  1. Resolution Process(解析过程):验证解析器能否通过DID找到对应的DID文档,解析过程符合规范定义的步骤。

  2. Content Retrieval(内容检索):检查解析器是否能从指定位置(如分布式账本、IPFS等)正确获取DID文档内容。

  3. Content Format(内容格式):验证获取的DID文档是否以规定的JSON-LD格式呈现,且内容结构符合DID Core规范。

did-url-dereferencing测试

这些测试围绕DID URL的解引用操作进行,包括:

  1. DID URL Syntax(DID URL语法):确认DID URL的构造符合规范定义,包括DID部分、路径、查询参数和片段等。

  2. Resource Retrieval(资源检索):测试解析器能否根据DID URL定位并返回相应的资源(如验证材料、服务端点指向的资源等)。

  3. Metadata Handling(元数据处理):验证在解引用过程中,解析器能否正确处理并返回与DID URL相关的元数据,如HTTP状态码、Content-Type等。

参考资料

  • W3C Decentralized Identifier Specification v1.0 DID主要规范文档
  • Home page of the Decentralized Identifier Working Group 负责开发和维护DID规范的工作组官网
  • Specs and documentation for all DID-related /.well-known resources 关于DID上下文中使用的标准化资源的详情
  • W3C Decentralized Characteristics Rubric v1.0 用于评估DID系统去中心化特性的量表
  • Decentralized Identifier Use Cases v1.0 展示DIDs在各种情境中应用的一系列用例
  • W3C DID Test Suite and Implementation Report DID测试套件以及已通过测试、表明符合DID规范的实现记录

其他

  1. 可以向仓库提交pull request将did实现加入到测试套件(可提升web3影响力)
  2. DID解析器 Universal Resolver (uniresolver.io)

这篇关于DID测试套件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095591

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗? 有必要。本文从三个方面论述。分别是可测试,可维护,可移植。 可测试 软件黑盒测试更普遍,但很难覆盖所有应用场景。于是有了接口测试、模块化测试以及单元测试。都是通过降低测试对象

day45-测试平台搭建之前端vue学习-基础4

目录 一、生命周期         1.1.概念         1.2.常用的生命周期钩子         1.3.关于销毁Vue实例         1.4.原理​编辑         1.5.代码 二、非单文件组件         2.1.组件         2.2.使用组件的三大步骤         2.3.注意点         2.4.关于VueComponen