unit-testing - c# unit test 예제




세트 조합을 테스트 데이터로 사용하는 방법 (4)

프린지 케이스와 일반 값 집합에서 하나의 튜플로 함수를 테스트하고 싶습니다. 예를 들어, 유효한 삼각형을 구성하는 3 개의 길이가 주어질 때마다 true 를 반환하는 함수를 테스트하는 동안 특정 케이스, 음수 / 작은 / 큰 숫자, 오버 플로우 된 값 등이 있습니다. 무엇보다 중요한 것은 테스트 데이터 집합을 얻기 위해 반복 여부에 관계없이 이러한 값의 조합을 생성하는 것입니다.

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

참고로 : 저는 실제로 이것에 대한 답을 알고 있지만 다른 사람들에게 도움이 될 수 있으며 여기 사람들에게 도전이 될 것입니다! - 나중에 내 대답을 게시 할 것입니다.


물론, 특히 이러한 순열 / 조합을 많이 다루면 첫 번째 단계가 문제가된다는 것을 분명히 알 수 있습니다.

파이썬에서의 흥미로운 구현, "C"와 "Ocaml"에 "Algorithm 515"(아래 참조)를 기반으로 훌륭한 예제를 썼다. 그는 모든 "알고리즘 XX"논문들에 대해 공통적으로 보았던 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 : 사전 문자 색인에서 벡터 생성"; Buckles, BP, and Lybanon, M. ACM Transactions on Mathematical Software, Vol. 3, No. 2, June 1977.


난 당신이 하나의 단위 테스트를 채우기 위해 여러 세트를 지정할 수있는 행 테스트 속성 (MbUnit 및 NUnit의 이후 버전에서 사용 가능)을 사용하여이 작업을 수행 할 수 있다고 생각합니다.


새로운 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)]

"반복"인수를 제공하여 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 ()을 사용하여 튜플 또는 목록을 집합으로 변환하거나 그 반대로 변환 할 수 있다는 것을 기억하십시오.


흥미로운 질문!

파이썬에서 다음과 같은 조합을 선택하여이 작업을 수행 할 것입니다. 가장 어려운 부분은 아마도 첫 번째 패스 확인 일 것입니다. 즉 if f(1,2,3) returns 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);
...




testing