unit-testing - 書き方 - 単体テスト php




セットの組み合わせをテストデータとして使用する方法 (4)

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

興味深いPythonでの実装ですが、CとOcamlには "Algorithm 515"(以下を参照)に基づいて素敵な記述を書いています。 彼はFortranで彼が書いたのは、 "アルゴリズムXX"のすべての論文、一般的にアセンブリ、またはcで共通していたからです。 私はそれを書き直し、数の範囲ではなく配列で動作するように少し改良を加えなければなりませんでした。 これはランダムアクセスですが、Knuth 4th volume fascicle 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月。

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

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

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


私はあなたが行テスト属性 (MbUnitとそれ以降のバージョンのNUnitで利用可能)でこれを行うことができると思います。そこでは、1つの単体テストを設定するためにいくつかのセットを指定できます。


まったく新しいPython 2.6では、イタレートのデカルト積を返す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)]

反復可能な引数を指定すると、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()を使って、タプルまたはリストをセットに変換できます。


興味深い質問!

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

おそらく、すべてが真であることが分かっている一連のテストケース(この三角ケースの場合は3,4,5など)を作成することをお勧めします。 、inf)。 次に、テストが正しいことをより簡単に検証できます。

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print 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);
...




testing