0

同じ形式の 2 つの csv ファイルを比較し、絶対差がしきい値未満の場合にのみ合格する JUnit テストを作成する必要があります。文字列と double の完全一致が必要であり、しきい値基準を満たす必要があります。

CSV形式:

最初の.csv
 名前 価格-1 価格-2
 アイテム1 5.12 6.12
 アイテム2 4.23 5.56
 アイテム3 11.2 12.23

秒.csv

 名前 価格-1 価格-2
 アイテム1 5.12 6.10
 アイテム2 4.20 5.50
 アイテム3 11.19 12.19

ここで、差のしきい値が 0.15 であるとしましょう。ここでは、first.csv と second.csv の item2 の price1 の絶対差が 0.03 の場合、JUnit テストに合格し、差のしきい値が 0.02 の場合は失敗します。

それに対する良い解決策は何ですか?

4

2 に答える 2

3

assertEquals を double で使用すると、しきい値を渡すことができます。これは、junit ではデルタと呼ばれます。

または、使用できます

assertTrue (Math.abs(val1 - val2) < threshold);

だからあなたの例では

価格 2 は 6.12 と 6.10 です

最初に使用できるもので

assertEquals(6.12d, 6.10d, 0.15)

これは合格だろう

また

assertEquals(Math.abs(6.12d - 6.10d) < 0.15)

これは通過します。

assertEquals をいじって数値を入力し、assertEquals のオーバーロードされたメソッドを理解することをお勧めします。

ファイルから読み取る場合、文字列を読み取る可能性があります。それらを二重にするには、次のようにします

try {
    Double d1 = Double.parseDouble(str1);
    Double d2 = Double.parseDouble(str2);
    assertEquals(d1, d2, 0.15);
}catch (NumberFormatException e) {
    //not a number so cannot compare - perhaps call fail("fail msg here")
}
于 2012-08-29T19:04:39.623 に答える
2

タグにjunitを記載しました。

Junit の .equals(double, double, accuracy) を使用すると、最後のパラメーターにどれだけ近づける必要があるかを指定できます。

値を読み込んで、テストでそれぞれに対して .equals を呼び出すだけです...

または、私が得ていない質問がありますか?

行を解析するために、例ではスペースを使用していますが、「CSV」(カンマ区切り)と言います。それらが実際に CSV である場合は、次のようなものを使用できます。

String[] line = currentLine.split(",")

各行で。それはあなたに line[0]="item1", line[1]="5.12", line[2]="6.12" を与えるでしょう

その後、Double.parseDouble() で line[1] と line[2] を解析してみてください

ちなみに、assertTrue ではなく assertEquals を使用してください。より具体的な assertEquals は、必要な値と、junit の結果のエラーの一部として取得した値を表示します。

オプションの文字列を渡すこともお勧めします。テスト行は次のようになります。

assertEquals("item "+file1.line[0]+" values do not match",
    Double.parseDouble(file1.line[1]),
    Double.parseDouble(file2.line[1]),
    0.001)

また、各ファイルに対して同じ行を読んでいることを確認するという全体的な問題もあります-それらを正しくペアにします. それらが同じ順序であることが保証されている場合は問題ありませんが、そうでない場合は、名前フィールドで最初のファイルをハッシュアップすることをお勧めします。

for(String line: file1.readNextLine()) 
    file1hash.put(line.split(",")[0],line)

次に、2 番目のファイルを反復処理すると、次のように簡単に実行できます。

for(String line2: file2.readNextLine())  {
    String line1=file1hash.get(line2.split(",")[0])

line1 と line2 が同じ行を参照していることを確認します。

于 2012-08-29T19:03:56.683 に答える