代码质量测试

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

请参阅 配置CI-CD管线 了解有关不同类型管道的更多信息。

了解代码质量规则

在“代码质量测试”中,会扫描源代码以确保其符合特定质量标准。 目前,这是通过SonarQube与使用OakPAL的内容包级别检查的组合来实现的。 有100多个规则可组合通用Java规则和特定于AEM的规则。 某些特定于AEM的规则是根据AEM Engineering中的最佳实践创建的,称为 自定义代码质量规则.

注意

您可以下载规则的完整列表 此处.

三层门

此代码质量测试步骤中有一个三层结构,用于测试已识别的问题:

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

  • 重要信息:这些是门标识的问题,会导致管道进入暂停状态。 部署经理、项目经理或业务所有者可以覆盖问题(在这种情况下管道会继续),也可以接受问题(在这种情况下,管道会因故障而停止)。

  • 信息:这些是门标识的问题,这些问题仅供参考,对管道执行没有影响

此步骤的结果将作为 评级.

下表汇总了每个“关键”、“重要”和“信息”类别的评级和故障阈值:

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

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

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

请参阅 量度定义 ,以了解更详细的定义。

注意

了解有关执行的自定义代码质量规则的更多信息 Cloud Manager,请参阅 自定义代码质量规则.

处理误报

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

在这些情况下,可以使用标准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 尽可能具体的注释(即仅对导致问题的特定语句或块添加注释)可以在类级别添加注释。

注意

虽然没有明确的安全测试步骤,但在代码质量步骤中仍会评估与安全相关的代码质量规则。 请参阅 AEMas a Cloud Service安全概述 了解有关Cloud Service安全性的更多信息。

在此页面上