使用NBi测试DAX计算

时间:2016-07-06 18:38:20

标签: automated-tests ssas dax ssas-tabular

我正在为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])

enter image description here

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>

1 个答案:

答案 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的专家,而且从语法的角度来看,我不确定上述查询是否有效。