使用 NBi 测试 DAX 计算
Testing DAX calculation with NBi
我正在为我们的 SSAS 表格项目研究自动化测试工具。我找到了 NBi,觉得它真的很酷。我尝试设置它并成功 运行 一些基本测试。但是,当我尝试测试 dax 计算时,它显示 "Function not found"(见屏幕截图)。听起来它不支持 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>
NBi 支持在查询标签中评估 DAX 查询,但不支持在表达式标签中评估。 Expression 和 evaluate-rows 标签不是为比较两个查询而设计的。为此,请更改您的测试以在两个查询之间使用断言 equalTo。它会更容易并且会起作用。
I guess a better question would be how do I test a measure and a
calculated column in term of ensuring that another developer doesn't
accidentally change the calculation/expression I entered when
designing the Tabular model?
我会分三个层次回答:概念、逻辑和技术。
在概念层面上,你的测试是错误的:你不应该在你的断言和你的被测系统中使用相同的实现。这不是特定于 NBi 或任何框架,而是所有自动化测试。测试的作用不是确保某人不改变某些东西,而是确保某些东西给出正确的结果。即使您的实现是错误的,将工件与自身进行比较也总是会导致绿色测试。在这种情况下,您必须使用具体的静态结果更改您的断言,或者您需要创建一个 sql 语句来对您的数据库进行相同的计算,或者在 MDX 中找到另一个查询来产生相同的结果。
下面这句话在逻辑层面上是不正确的
Here is the formula I want to test:
您在 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 专家,从语法的角度来看,我不确定上面的查询是否有效。
我正在为我们的 SSAS 表格项目研究自动化测试工具。我找到了 NBi,觉得它真的很酷。我尝试设置它并成功 运行 一些基本测试。但是,当我尝试测试 dax 计算时,它显示 "Function not found"(见屏幕截图)。听起来它不支持 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>
NBi 支持在查询标签中评估 DAX 查询,但不支持在表达式标签中评估。 Expression 和 evaluate-rows 标签不是为比较两个查询而设计的。为此,请更改您的测试以在两个查询之间使用断言 equalTo。它会更容易并且会起作用。
I guess a better question would be how do I test a measure and a calculated column in term of ensuring that another developer doesn't accidentally change the calculation/expression I entered when designing the Tabular model?
我会分三个层次回答:概念、逻辑和技术。
在概念层面上,你的测试是错误的:你不应该在你的断言和你的被测系统中使用相同的实现。这不是特定于 NBi 或任何框架,而是所有自动化测试。测试的作用不是确保某人不改变某些东西,而是确保某些东西给出正确的结果。即使您的实现是错误的,将工件与自身进行比较也总是会导致绿色测试。在这种情况下,您必须使用具体的静态结果更改您的断言,或者您需要创建一个 sql 语句来对您的数据库进行相同的计算,或者在 MDX 中找到另一个查询来产生相同的结果。
下面这句话在逻辑层面上是不正确的
Here is the formula I want to test:
您在 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 专家,从语法的角度来看,我不确定上面的查询是否有效。