【问题标题】:Testing DAX calculation with NBi使用 NBI 测试 DAX 计算
【发布时间】:2016-07-06 18:38:19
【问题描述】:

我正在对我们的 SSAS 表格项目的自动化测试工具进行一些研究。我找到了 NBI,觉得它真的很酷。我尝试设置它并成功运行了一些基本测试。但是,当我尝试测试 dax 计算时,它显示“未找到函数”(见屏幕截图)。听起来它不支持 SUM,但鉴于 SUM 是一个基本功能,我想它应该可以工作。由于我是这个工具的新手,我想仔细检查我是否做错了什么,或者这只是错误的意思......(不支持的功能)。

我回去查看了 NBi 文档,其中提到要检查他们的 NCAL.dll 以获取所有可用的表达式。不幸的是,我无法打开该 dll 文件的可读版本。任何帮助表示赞赏。

这是我要测试的公式:

=SUMX(FILTER(MyTable, AND(MyTable[Date] = EARLIER(MyTable[Date]), MyTable[Account] = EARLIER(MyTable[Account]))), MyTable[Amount])

XML 代码 (nbits) 文件

 <test name="My second test: Calculated column compared to DAX formula">
  <system-under-test>
   <execution>
    <query connectionString="Provider=MSOLAP.7;Data Source...">
     <![CDATA[    
    EVALUATE
    SUMMARIZE (MyTable, MyTable[Date], MyTable[Account], MyTable[Amount], MyTable[CalculatedAmount])
     ]]>
    </query>
   </execution>
  </system-under-test>
  <assert>
    <evaluate-rows>
      <variable column-index="0">Date</variable>
      <variable column-index="1">Account</variable>
      <variable column-index="2">Amount</variable>
      <variable column-index="3">CalculatedAmount</variable>
      <expression column-index="3" type="numeric" tolerance="0.01"> = SUMX(FILTER(MyTable, AND(MyTable[Date] = EARLIER(MyTable[Date]), MyTable[Account] = EARLIER(MyTable[Account]))), MyTable[Amount])</expression>
    </evaluate-rows>
  </assert>
 </test>

【问题讨论】:

  • 只是澄清一下 - 我在简单的 SUM 和我的实际表达式 SUMX 之间切换.. 都不起作用
  • 你能发布你的测试的 xml 吗?并用简单的英语描述您在此测试中要测试的内容? “我要测试的公式”是什么意思...是您项目中实现的公式还是您尝试在测试中指定以执行断言的公式?
  • 我刚刚根据您的要求发布了 XML。我想测试的很简单。在第一个结果集中,我从表格模型中选择 4 列,第四列 (CalculatedAmount) 作为计算列。现在,在第二个结果集中,我正在比较相同的数据,但我使用 DAX 表达式作为 CalculatedAmount 列的例外。这是我在表格模型中输入的相同表达式,用于获取第一个结果集的计算金额。我想看看这个工具是否可以支持我的 DAX 表达式。如果是这样,我的测试应该通过。如果仍然没有意义,请告诉我。

标签: automated-tests ssas dax ssas-tabular


【解决方案1】:

NBi 支持在查询标签中评估 DAX 查询,但不支持在表达式标签中。表达式和评估行标签并非旨在比较两个查询。为此,请更改您的测试以在两个查询之间使用断言 equalTo。它会更容易并且会起作用。

我想一个更好的问题是如何测试一个度量和一个 计算列以确保另一个开发人员不 不小心更改了我输入的计算/表达式 设计表格模型?

我将从三个层面回答:概念、逻辑和技术。

在概念层面,您的测试是错误的:您永远不应该在断言和被测系统中使用相同的实现。这不是特定于 NBI 或任何框架,而是特定于所有自动化测试。测试的作用不是确保某人不会改变某事,而是确保某事给出正确的结果。即使您的实现是错误的,将工件与其自身进行比较总是会导致绿色测试。在这种情况下,您必须使用具体的静态结果更改您的断言,或者您需要创建一个 sql 语句来导致对数据库进行相同的计算,或者在 MDX 中找到另一个查询,从而得到相同的结果。

在逻辑层面,下面这句话是不正确的

这是我要测试的公式:

您在assert 中定义了这个公式,而不是在system-under-test 中。这意味着这不是您要测试的内容,而是您的参考资料(您 100% 确定它是正确的)。您正在测试的是查询EVALUATE SUMMARIZE (MyTable, MyTable[Date], MyTable[Account], MyTable[Amount], MyTable[CalculatedAmount])

在技术层面,使用评估行不是正确的选择。这个断言不需要函数或查询,而是基于行变量的表达式(没有 DAX,没有 SQL,...)。 EARLIER 的使用清楚地表明这是不可能的。在您的情况下,您必须比较两个查询,可能是:

<assert>
  <equalTo>
    <column index="0" role="key" type="dateTime"/>
    <column index="1" role="key" type="numeric"/>
    <column index="2" role="value" type="numeric"/>
    <column index="3" role="value" type="numeric" tolerance="0.01"/>
    <query>
      EVALUATE SUMMARIZE (MyTable, MyTable[Date], MyTable[Account], MyTable[Amount], SUMX(FILTER(MyTable, AND(MyTable[Date] = EARLIER(MyTable[Date]), MyTable[Account] = EARLIER(MyTable[Account]))), MyTable[Amount])
    </query>
  </equalTo>
</assert>

PS:我显然不是 DAX 专家,从语法的角度来看,我不确定上面的查询是否有效。

【讨论】:

  • mm... 但是我的 DAX 表达式不是查询。如果我要打开 SSMS 并运行 Sumx... 它将无法正常工作。
  • 我想一个更好的问题是如何测试度量和计算列,以确保其他开发人员不会意外更改我在设计表格模型时输入的计算/表达式?
  • 我通过删除这一行“CalculatedAmount”设法解决了发布的原始 XML 的问题。测试通过了。但是鉴于您提供的答案,我可能不再需要它,除非我只想验证我的 DAX 语法而不是“测试”。感谢您为我指出正确的方向,以考虑使用静态数据或 sql 等效查询进行正确测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多