3

SSAS Tabular プロジェクトの自動テスト ツールについて調査しています。NBi を見つけて、本当にクールだと思いました。セットアップを試み、いくつかの基本的なテストを正常に実行しました。ただし、dax 計算をテストしようとすると、「関数が見つかりません」と表示されます (スクリーンショットを参照)。SUM をサポートしていないように聞こえますが、SUM が基本的な機能であることを考えると、動作するはずだと思います。私はこのツールを初めて使用するので、何か間違ったことをしたのか、それとも単にエラーが言っているのかを再確認したかったのです... (サポートされていない機能)。

戻って NBi のドキュメントを確認したところ、利用可能なすべての式について NCAL.dll をチェックするように記載されていました。残念ながら、その dll ファイルの読み取り可能なバージョンを開くことができません。どんな助けでも大歓迎です。

テストしたい式は次のとおりです。

=SUMX(FILTER(MyTable, AND(MyTable[日付] = EARLIER(MyTable[日付]), MyTable[アカウント] = EARLIER(MyTable[アカウント]))), MyTable[金額])

ここに画像の説明を入力

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>
4

1 に答える 1

3

NBi は、クエリ タグでの DAX クエリの評価をサポートしていますが、式タグではサポートしていません。Expression および evaluate-rows タグは、2 つのクエリを比較するようには設計されていません。これを実現するには、2 つのクエリ間でアサーション equalTo を使用するようにテストを変更します。それはより簡単になり、機能します。

表形式モデルの設計時に入力した計算/式を別の開発者が誤って変更しないようにするために、メジャーと計算列をテストするにはどうすればよいでしょうか?

概念、論理、技術の 3 つのレベルでお答えします。

概念レベルでは、テストは間違っています。アサーションとテスト対象のシステムで同じ実装を使用するべきではありません。これは、NBi やフレームワークに固有のものではなく、すべての自動テストに固有のものです。テストの役割は、誰かが何かを変更しないことを保証することではなく、何かが正しい結果をもたらすことを保証することです。アーティファクトをそれ自体と比較すると、実装が間違っていても、常にグリーン テストになります。この場合、具体的な静的結果でアサーションを変更するか、SQL ステートメントを作成してデータベースの同じ計算を行うか、MDX で別のクエリを見つけて同じ結果を得る必要があります。

論理レベルでは、次の文は正しくありません

テストしたい式は次のとおりです。

この数式は、assertではなく で定義しましたsystem-under-test。それはあなたがテストしているものではなく、あなたの参照であることを意味します (それが正しいことを 100% 確信しているもの)。テストしているのは queryEVALUATE SUMMARIZE (MyTable, MyTable[Date], MyTable[Account], MyTable[Amount], MyTable[CalculatedAmount])です。

技術レベルでは、評価行を使用することは正しいオプションではありません。このアサーションは、関数やクエリではなく、行の変数に基づく式 (DAX や SQL など) を想定していません。の使用EARLIERは、それが不可能であることを明確に示しています。あなたの場合、おそらく次のような2つのクエリを比較する必要があります。

<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 の専門家ではなく、上記のクエリが構文の観点から有効かどうかはわかりません。

于 2016-07-06T22:22:52.573 に答える