代码质量测试

代码质量测试会评估应用程序代码的质量。 它是仅代码质量管道的核心目标,在所有非生产和生产管道中立即执行构建步骤。

请参阅配置CI-CD管道以进一步了解不同类型的管道。

了解代码质量规则

在“代码质量测试”中,将扫描源代码,确保它满足某些质量标准。 目前,这是通过SonarQube和使用OakPAL的内容包级别检查的组合来实现的。 有100多个规则,这些规则结合了通用Java规则和AEM特定规则。 某些AEM特定规则是根据AEM工程部门的最佳实践创建的,称为自定义代码质量规则

注意

您可以在此处](/docs/experience-manager-cloud-service/implementing/cloud-manager/assets/CodeQuality-rules-latest-CS.xlsx?lang=zh-Hans)下载规则[的完整列表。

三层门

此代码质量测试步骤中有三层结构,用于解决已发现的问题:

  • 关键:这些问题由门确定,导致管道立即失效。

  • 重要说明:这些是由门标识的问题,导致管道进入暂停状态。部署经理、项目经理或业务所有者可以改写问题,在这种情况下,管道将继续,或者他们可以接受问题,在这种情况下,管道会因故障而停止。

  • 信息:这些问题由网关确定,它们仅用于提供信息,对管道执行没有影响

此步骤的结果以​Ratings​的形式提供。

下表总结了每个“严重”、“重要”和“信息”类别的等级和故障阈值:

名称 定义 类别 失败阈值
安全等级 A = 0漏洞
B =至少1个次要漏洞
C =至少1个主要漏洞
D =至少1个关键漏洞
E =至少1个阻止程序漏洞
关键 < B
可靠性等级 A = 0错误
B =至少1个次要错误
C =至少1个主要错误
D =至少1个关键错误E =至少1个阻止程序错误
重要信息 < C
可维护性等级 代码气味的未平仓修复成本为:
  • <>
  • 评级在6%到10%之间是B
  • 11%到20%的评级是C
  • 21%到50%的评级是D
  • 超过50%的东西
重要信息 < A
范围 单位测试线覆盖和条件覆盖的混合使用以下公式:
Coverage = (CT + CF + LC)/(2*B + EL)
其中:CT =运行单元测试时已至少一次评估为“true”的条件,运行单元测试时,CF =已至少一次评估为“false”的条件,运行单元测试时,LC =覆盖行= linestocover —— 未覆盖行

B =条件总数
EL =可执行行总数(linestocover)

重要信息 < 50%
跳过的单元测试 跳过的单元测试数。 信息 > 1
未解决问题 总体问题类型——漏洞、错误和代码气味 信息 > 0
复制行 重复块中涉及的行数。
对于要视为重复的代码块:
  • 非Java项目:
  • 至少应有100个连续令牌和重复令牌。
  • 这些令牌至少应在以下位置传播:
  • COBOL的30行代码
  • ABAP的20行代码
  • 10行代码,适用于其他语言
  • Java项目:
  • 无论令牌和行的数量如何,都至少应有10个连续和重复的语句。

在检测重复时,会忽略缩进和字符串文本中的差异。
信息 > 1%
Cloud Service兼容性 已识别的Cloud Service兼容性问题数。 信息 > 0
注意

有关更详细的定义,请参阅度量定义

注意

要进一步了解由云管理器执行的自定义代码质量规则,请参阅自定义代码质量规则

处理误报

质量扫描过程并不完美,有时会错误地识别实际上没有问题的问题。 这称为​假阳性

在这些情况下,可以使用标准Java @SuppressWarnings注释对源代码进行注释,该注释将规则ID指定为注释属性。 例如,一个常见问题是,用于检测硬编码密码的SonarQube规则在如何识别硬编码密码方面可能具有攻击性。

要查看特定示例,此代码在AEM项目中很常见,该项目具有连接到某些外部服务的代码:

@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

然后,SonarQube将引发阻止程序漏洞。 查看代码后,您会发现这不是漏洞,并可以使用相应的规则ID对此进行注释。

@SuppressWarnings("squid:S2068")
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

但是,另一方面,如果代码是:

@Property(label = "Service Password", value = "mysecretpassword")
private static final String PROP_SERVICE_PASSWORD = "password";

然后,正确的解决方案是删除硬编码密码。

注意

尽管最好尽可能使@SuppressWarnings注释具体,即仅注释导致问题的特定语句或块,但也可以在类级别添加注释。

注意

虽然没有明确的安全测试步骤,但在代码质量步骤中仍会评估与安全相关的代码质量规则。 请参阅AEM的安全概述(作为Cloud Service),进一步了解Cloud Service中的安全性。

在此页面上