测试

用法

test: historic_revenue_is_accurate {
  explore_source:  orders {
    column:  total_revenue {
      field:  orders.total_revenue 
    }
    filters: [orders.created_date:  "2017"]
  }
  assert:  revenue_is_expected_value {
    expression: ${orders.total_revenue} = 626000 ;;
  }
}
层次结构
test

- 或 -

test

- 或 -

test
默认值

接受
数据测试的标识符,以及定义测试断言和查询的子参数。

定义

Looker 具有 LookML 验证器,用于验证 LookML 代码在语法上是否有效;还具有 内容验证器,用于验证内容与模型之间的对象引用。

除了这些验证器之外,您还可以使用 test 参数来验证模型的逻辑。对于每个数据测试,您都需要创建一个查询和一个 yesno 断言语句。数据测试会运行测试查询,并验证测试查询的每一行是否满足断言。如果断言语句为测试查询的每一行都返回 yes,则数据测试通过。

如果您的项目设置配置为在部署到生产环境之前需要通过数据测试,并且您的项目具有一个或多个test参数,则在您提交对项目的更改后,IDE 会显示运行测试按钮。LookML 开发者必须先运行数据测试,然后才能将更改部署到生产环境。

无论您的项目在部署到生产环境之前是否需要通过数据测试,开发模式下的 LookML 开发者都可以随时运行数据测试来验证模型的逻辑。

您可以在模型文件视图文件或单独的专用数据测试文件中创建数据测试。如果使用专用文件来存放数据测试,请务必在要运行数据测试的任何模型文件或视图文件中 include 数据测试文件。

数据测试的名称和 explore_source 不能与同一项目中的其他数据测试相同。如果您在项目中为多个数据测试使用相同的 explore_source,请确保数据测试的名称都是唯一的。

test 参数具有以下子参数:

  • explore_source:定义要在数据测试中使用的查询。
  • assert:定义在测试查询的每一行上运行以验证数据的 Looker 表达式。

定义测试的 LookML 后,您可以运行数据测试来验证测试是否正常运行,并查看模型的逻辑是否通过测试(您必须处于 开发模式 才能运行数据测试)。

您可以通过多种方式为项目启动数据测试:

  1. 如果您的项目设置配置为在将文件部署到生产环境之前需要通过数据测试,则在您提交对项目的更改后,IDE 会显示运行测试 按钮。无论哪个文件定义了测试,这都会运行项目的所有测试。您必须通过数据测试,然后才能将更改部署到生产环境。
  2. 项目运行状况 面板中,选择运行数据测试 按钮。无论哪个文件定义了测试,这都会运行项目中的所有数据测试。
  3. 从文件的菜单中选择运行 LookML 测试 选项。这只会运行当前文件中定义的测试。

运行数据测试后,项目运行状况 面板将显示进度和结果。

您可以为每个测试结果选择探索查询 链接,以打开一个探索,其中包含数据测试中定义的查询。

explore_source

数据测试中的 explore_source 参数使用与派生表的 explore_source 参数相同的语法和逻辑。唯一的区别是,数据测试的 explore_source 不支持 derived_columnbind_filtersbind_all_filters 子参数。

实用提示:获取 explore_source LookML 的一种简单方法是使用现有探索来创建查询。在探索中,从探索的齿轮菜单中选择 Get LookML ,然后选择派生表 标签页以获取查询的 LookML。如需了解详情,请参阅有关创建原生派生表的文档。

请注意数据测试的 explore_source 的以下事项:

  • 数据测试的 explore_source 查询是标准 Looker 查询,这意味着测试的 explore_source 查询的行数上限为 5,000 行。请确保您的查询不超过 5,000 行,以便获得完整的测试结果集。您可以在 explore_source 中加入过滤条件或排序,以减少查询中的行数,或将相关行置于查询顶部。

  • 具有 extension: requiredexplore 不能用作 数据测试explore_sourceLookML 验证器会生成找不到 explore_source 的错误。

assert

assert 子参数定义了 explore_source 查询结果被视为有效的条件。expression 子参数接受 Looker 表达式,该表达式会生成 yesno(布尔值)。运行 explore_source 查询后,系统会针对查询结果集的每一行评估断言的表达式。如果查询的任何行有 no 响应,则数据测试失败。如果查询本身存在错误,测试也会失败。

一项测试可以有多个 assert 声明。如需让测试通过,每个断言都必须对 explore_source 查询的每一行都为 true。

实用提示:您可以使用表计算对话框来测试要在测试的 expression 参数中使用的 Looker 表达式语法。

如需在数据测试中使用,Looker 表达式中的字段必须完全限定范围,这意味着它们是使用 view_name.field_name 格式指定的。例如,以下表达式将字段声明为 aircraft_engine_types.aircraft_engine_type_id

assert: engine_type_id_not_null {
  expression: NOT is_null(${aircraft_engine_types.aircraft_engine_type_id}) ;;
}

示例

确保主键是唯一的

以下数据测试从 orders 探索创建查询,并定义 expression 以测试订单 ID 在结果集中是否唯一。explore_source 查询会统计数据库中与每个 ID 关联的行数。如果 ID 是唯一的,则数据库中应该只有一个 ID 的行。此外,它还会按计数进行排序,并将结果集限制为一行,因此查询响应将是计数最高的 ID。如果任何 ID 的计数高于 1,我们就知道该 ID 有多行,因此该 ID 不是唯一的。如果是这种情况,此数据测试将失败。

test: order_id_is_unique {
  explore_source: orders {
    column: id {}
    column: count {}
    sorts: [orders.count: desc]
    limit: 1
  }
  assert: order_id_is_unique {
    expression: ${orders.count} = 1 ;;
  }

验证已知值

下一个数据测试会检查以确保 2017 年的收入值始终为 626,000 美元。在此数据集中,这是一个已知值,不应更改。

test: historic_revenue_is_accurate {
  explore_source: orders {
    column: total_revenue {
      field: orders.total_revenue
    }
    filters: [orders.created_date: "2017"]
  }
  assert: revenue_is_expected_value {
    expression: ${orders.total_revenue} = 626000 ;;
  }
}

确认没有 null 值

下一个数据测试会检查以确保数据中没有 null 值。此 explore_source 使用 sort 来确保任何 null 值都将返回到查询顶部。null 值的排序可能会因方言而异。以下测试以 desc: yes 为例。


test: status_is_not_null {
  explore_source: orders {
    column: status {}
    sorts: [orders.status: desc]
    limit: 1
  }
  assert: status_is_not_null {
    expression: NOT is_null(${orders.status}) ;;
  }
}