我正在为SSAS Tabular项目做自动化测试工具的研究。我找到NBi并认为它真的很酷。我尝试设置它并成功运行了一些基本测试。但是,当我尝试测试dax计算时,它会说"找不到功能" (见截图)。听起来它不支持SUM,但鉴于SUM是一个基本函数,我认为它应该可以工作。由于我是这个工具的新手,我想仔细检查我是否做错了什么,或者只是错误说的是什么......(不支持的功能)。
我回去查看NBi文档,并提到检查他们的NCAL.dll所有可用的表达式。不幸的是,我无法打开该dll文件的可读版本。任何帮助表示赞赏。
这是我要测试的公式:
= SUMX(过滤器(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>
答案 0 :(得分:2)
NBi支持在查询标记中评估DAX查询,但不支持在表达式标记中评估。表达式和评估行标签不是为比较两个查询而设计的。要实现此目的,请更改测试以在两个查询之间使用断言equalTo。它会更容易并且会起作用。
我想一个更好的问题是如何测试一个测量和一个 计算的列,以确保另一个开发人员没有 不小心改变了我输入的计算/表达式 设计表格模型?
我将在三个层面回答:概念,逻辑和技术。
在概念层面,您的测试是错误的:您不应该在断言和被测系统中使用相同的实现。这不是NBi或任何框架的特定,而是所有自动化测试。测试的作用并不是确保某人不会改变某些东西,而是确保某些东西能够提供正确的结果。将工件与自身进行比较将始终导致绿色测试,即使您的实现是错误的。在这种情况下,您必须使用具体的静态结果更改断言,或者您需要创建一个sql语句,导致数据库的计算相同或在MDX中查找另一个查询,从而产生相同的结果。
在逻辑层面,以下句子不正确
这是我要测试的公式:
您已在assert
而非system-under-test
中定义了此公式。这意味着它不是您正在测试的,但它是您的参考(您可以100%确定它是正确的)。您正在测试的是查询EVALUATE SUMMARIZE (MyTable, MyTable[Date], MyTable[Account], MyTable[Amount], MyTable[CalculatedAmount])
。
在技术层面,使用evaluate-rows是nopt正确的选项。这个断言不是期望一个函数或一个查询,而是一个基于行变量的表达式(没有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的专家,而且从语法的角度来看,我不确定上述查询是否有效。