セットの組み合わせをテストデータとして使用する方法
-
08-06-2019 - |
質問
フリンジケースと正常値のセットからのタプルを使用して関数をテストしたいと考えています。たとえば、を返す関数をテストしているとき、 true
有効な三角形を形成する 3 つの長さが与えられた場合、負の数値、小さい数値、大きい数値、オーバーフローに近い値など、特定のケースが考えられます。さらに、主な目的はこれらの値の組み合わせを生成することです。 と または それなし 一連のテストデータを取得するために繰り返します。
(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
注意として:実は私はこれに対する答えを知っていますが、他の人にとっては役に立つかもしれませんが、ここにいる人たちにとっては挑戦となるかもしれません。--後で答えを投稿します。
解決
確かに、特にこれらの順列/組み合わせの多くを扱う場合、最初のパスが問題になることがわかります。
Python での興味深い実装ですが、私は「アルゴリズム 515」に基づいて C と Ocaml で優れた実装を書きました (以下を参照)。当時、すべての「アルゴリズム XX」論文、つまりそのアセンブリや c. でそれが一般的だったので、彼は Fortran で論文を書きました。数値の範囲ではなく配列を扱うために、それを書き直し、いくつかの小さな改良を加える必要がありました。これはランダム アクセスを行います。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:辞書編集索引からのベクトルの生成";バックル、B.P.、リバノン、M.数学ソフトウェアに関する ACM トランザクション、Vol.3、いいえ。1977 年 6 月 2 日。
他のヒント
新しい 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」引数を指定して、反復可能オブジェクトとそれ自体を使用して積を実行できます。
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
, 、それは正しい結果ですか?それを確認したら、これは回帰テストの良い基礎となります。
おそらく、すべてが true であることがわかっている一連のテスト ケースを作成することをお勧めします (例:この三角形の場合は 3、4、5)、すべて偽になることがわかっている一連のテスト ケース (例:0,1,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); ...
でこれができると思います 行テスト属性 (MbUnit 以降のバージョンの NUnit で利用可能) 複数のセットを指定して 1 つの単体テストを設定できます。
大量のテスト データを作成して何が起こるかを確認することもできますが、使用するデータを最小限に抑えるほうが効率的です。
一般的な QA の観点からは、入力のさまざまな分類を識別する必要があります。分類ごとに一連の入力値を生成し、適切な出力を決定します。
以下は入力値のクラスのサンプルです。
- (10 億、2、10 億、20 億) などの小さな数字を含む有効な三角形
- (0.000001、0.00002、0.00003) などの大きな数値を含む有効な三角形
- (10, 10, 19.9999) など、「ほぼ」平坦な有効な鈍角三角形
- (10, 10, 0000001) など、「ほぼ」平坦な有効な鋭角三角形
- 少なくとも 1 つの負の値を持つ無効な三角形
- 2 つの辺の合計が 3 番目の辺と等しい無効な三角形
- 2 つの辺の合計が 3 番目の辺よりも大きい無効な三角形
- 数値以外の入力値
...
この関数の入力分類のリストに満足したら、実際のテスト データを作成できます。おそらく、各項目のすべての順列をテストすると役立つでしょう。(例えば。(2,3,4)、(2,4,3)、(3,2,4)、(3,4,2)、(4,2,3)、(4,3,2)) 通常、見逃していた分類がいくつかあることがわかります (入力パラメーターとしての inf の概念など)。
一定期間のランダム データも役立つ場合があり、コード内の奇妙なバグを見つけることができますが、通常は生産的ではありません。
おそらく、この関数は追加のルールが適用される特定のコンテキストで使用されています。整数値のみ、または値は 0.01 増分である必要があるなど) これらは、入力パラメータの分類リストに追加されます。