我正在为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代码(位)文件
<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查询。表达式和评估行标记不旨在比较两个查询。为此,请更改测试以在两个查询之间使用断言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的专家,并且从语法的角度来看,我不确定上面的查询是否有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句