27

一連のフリンジ ケースと通常値のタプルを使用して関数をテストしたいと思います。たとえばtrue、有効な三角形を形成する 3 つの長さが与えられるたびに戻る関数をテストしているときに、特定のケース、負/小さい/大きい数値、オーバーフローに近い値などがあります。さらに、主な目的は、一連のテスト データを取得するために、繰り返しの有無かかわら、これらの値の組み合わせを生成することです。

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

注:私は実際にこれに対する答えを知っていますが、他の人にとっては役に立ち、ここの人々にとっては挑戦になるかもしれません! --私の答えは後で投稿します。

4

5 に答える 5

18

絶対に、特にこれらの順列/組み合わせの多くを扱う場合、最初のパスが問題になることは間違いありません。

Pythonでの興味深い実装ですが、「アルゴリズム515」(以下を参照)に基づいてCとOcamlで素晴らしい実装を作成しました。彼はFortranで彼のことを書いた。それは当時、すべての「アルゴリズムXX」の論文で一般的だったからである。私はそれを書き直して、数の範囲ではなく配列で動作するようにいくつかの小さな改善をしなければなりませんでした。これはランダムアクセスを行います。私はまだKnuth第4巻の筋肉束2で言及されているもののいくつかの素晴らしい実装を取得するために取り組んでいます。これがどのように機能するかを読者に説明します。誰かが好奇心を持っているなら、私は何かを書くことに反対しません。

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

〜"アルゴリズム515:辞書式インデックスからのベクトルの生成"; Buckles、BP、and Lybanon、M. ACM Transactions on Mathematical Software、Vol。3、No。2、1977年6月。

于 2008-08-03T19:06:00.327 に答える
4

真新しい Python 2.6 では、 iterables のデカルト積を返す itertools モジュールを使用した標準ソリューションがあります。

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

"repeat" 引数を指定して、 iterable とそれ自体で積を実行できます。

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

組み合わせで何かを微調整することもできます:

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

順序が重要な場合は、順列があります:

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

もちろん、これらすべての優れた機能がまったく同じことを行うわけではありませんが、問題を解決するために何らかの方法でそれらを使用できます。

list()、tuple()、および set() を使用して、タプルまたはリストをセットに、またはその逆に変換できることを覚えておいてください。

于 2008-10-04T08:52:47.767 に答える
3

興味深い質問です!

これは、Python で次のような組み合わせを選択することで行います。最も困難な部分は、おそらく最初のパスの検証です。つまりif f(1,2,3) returns true、それは正しい結果ですか? それを確認したら、これは回帰テストの良い基礎となります。

おそらく、すべて真であることがわかっている一連のテスト ケース (たとえば、このトライアングル ケースでは 3,4,5) と、すべて偽であることがわかっている一連のテスト ケース (たとえば、0,1 ,inf)。これにより、テストが正しいことをより簡単に検証できます。

# http://code.activestate.com/recipes/190465 からの xpermutations
xpermutationsインポートから *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3): # または xuniqueselections
    cを印刷する
(-1,-1,-1);
(-1,-1,0);
(-1,-1,1);
(-1,-1,5);
(-1,-1,10);
(-1,-1,0);
(-1,-1,1000);
(-1,-1,inf);
(-1,0,-1);
(-1,0,0);
...
于 2008-08-03T00:04:59.023 に答える
2

これは、行テスト属性(MbUnit以降のバージョンのNUnitで使用可能)を使用して実行できると思います。この属性では、複数のセットを指定して1つの単体テストにデータを取り込むことができます。

于 2008-08-16T13:31:37.727 に答える
0

大量のテスト データを作成して何が起こるかを確認することは可能ですが、使用するデータを最小限に抑えることを試みる方が効率的です。

典型的な QA の観点から、入力のさまざまな分類を識別したいと思うでしょう。分類ごとに一連の入力値を生成し、適切な出力を決定します。

入力値のクラスのサンプルを次に示します。

  • (10 億、2、10 億、20 億) のような小さい数の有効な三角形
  • (0.000001, 0.00002, 0.00003) のような大きな数を持つ有効な三角形
  • (10, 10, 19.9999) のような「ほぼ」平らな有効な鈍角三角形
  • (10, 10, 0000001) のような「ほぼ」平らな有効な鋭角三角形
  • 少なくとも 1 つの負の値を持つ無効な三角形
  • 二辺の和が三辺に等しい無効な三角形
  • 2 辺の合計が 3 辺よりも大きい無効な三角形
  • 数値以外の入力値

...

この関数の入力分類のリストに満足したら、実際のテスト データを作成できます。おそらく、各項目のすべての順列をテストすると役立つでしょう。(例: (2,3,4)、(2,4,3)、(3,2,4)、(3,4,2)、(4,2,3)、(4,3,2))通常、見逃した分類がいくつかあることに気付くでしょう (入力パラメーターとしての inf の概念など)。

一定期間のランダム データも同様に役立つ場合があり、コード内の奇妙なバグを見つけることができますが、一般的には生産的ではありません。

この関数は、追加のルールが適用される特定のコンテキストで使用されている可能性があります (たとえば、整数値のみ、または値が 0.01 単位である必要があるなど)。これらは、入力パラメーターの分類のリストに追加されます。

于 2008-09-17T03:15:18.467 に答える