测试

用法

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 断言语句。数据测试会运行测试查询,并验证断言对于测试查询的每一行是否都为 true。如果断言语句针对测试查询的每一行都返回 yes,则数据测试通过。

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

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

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

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

test 参数具有以下子参数:

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

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

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

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

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

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

explore_source

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

实用提示:获取 explore_source LookML 的简单方法是使用现有探索创建查询。在探索中,从探索的齿轮菜单中选择获取 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 子形参接受可生成 yesno(布尔值)的 Looker 表达式。运行 explore_source 查询后,系统会针对查询结果集的每一行评估断言的表达式。如果查询的任何行存在 no 响应,则数据测试失败。如果查询本身存在错误,测试也会失败。

一个测试可以有多个 assert 声明。为了使测试通过,explore_source 查询的每一行都必须满足每个断言。

实用提示:您可以使用表计算对话框测试要在测试的 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 不是唯一 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}) ;;
  }
}