문제

일련의 비정상 케이스와 일반 값의 튜플을 사용하여 함수를 테스트하고 싶습니다.예를 들어, 다음을 반환하는 함수를 테스트하는 동안 true 유효한 삼각형을 형성하는 세 가지 길이가 주어질 때마다 특정한 경우, 음수/작은 숫자/큰 숫자, 오버플로에 가까운 값 등이 발생합니다.게다가 주요 목표는 이러한 값의 조합을 생성하는 것입니다. ~와 함께 또는 없이 테스트 데이터 세트를 얻기 위해 반복합니다.

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

참고 사항:나는 실제로 이에 대한 답을 알고 있지만 다른 사람들에게는 도움이 될 수도 있고 여기 있는 사람들에게는 도전이 될 수도 있습니다!--나중에 답변을 게시하겠습니다.

도움이 되었습니까?

해결책

물론, 특히 이러한 많은 순열/조합을 처리할 때 첫 번째 단계가 문제가 될 것임을 분명히 알 수 있습니다.

Python에서의 흥미로운 구현이지만 "Algorithm 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)]

반복 가능 및 자체를 사용하여 제품을 수행하기 위해 "반복" 인수를 제공할 수 있습니다.

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);
...

내 생각엔 당신이 이걸로 할 수 있을 것 같아요 행 테스트 속성 (MbUnit 및 이후 버전의 NUnit에서 사용 가능) 여기서는 여러 세트를 지정하여 하나의 단위 테스트를 채울 수 있습니다.

많은 테스트 데이터를 생성하고 어떤 일이 일어나는지 확인하는 것이 가능하지만 사용되는 데이터를 최소화하는 것이 더 효율적입니다.

일반적인 QA 관점에서 입력의 다양한 분류를 식별하고 싶을 것입니다.각 분류에 대한 입력 값 세트를 생성하고 적절한 출력을 결정합니다.

다음은 입력 값 클래스의 샘플입니다.

  • (10억, 2, 10억, 20억)과 같은 작은 숫자가 포함된 유효한 삼각형
  • (0.000001, 0.00002, 0.00003)과 같은 큰 숫자를 가진 유효한 삼각형
  • (10, 10, 19.9999)와 같이 '거의' 평평한 유효한 둔각 삼각형
  • (10, 10, 0000001)과 같이 '거의' 평평한 유효한 예각 삼각형
  • 하나 이상의 음수 값이 있는 잘못된 삼각형
  • 두 변의 합이 세 번째 변과 같은 잘못된 삼각형
  • 두 변의 합이 세 번째 변보다 큰 잘못된 삼각형
  • 숫자가 아닌 입력 값

...

이 함수에 대한 입력 분류 ​​목록에 만족하면 실제 테스트 데이터를 생성할 수 있습니다.아마도 각 항목의 모든 순열을 테스트하는 것이 도움이 될 것입니다.(예:(2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) 일반적으로, 여러분이 놓친 몇 가지 분류(예: 입력 매개변수로서의 inf 개념)가 있다는 것을 알게 될 것입니다.

일정 기간 동안의 무작위 데이터도 도움이 될 수 있습니다. 이는 코드에서 이상한 버그를 찾을 수 있지만 일반적으로 생산적이지는 않습니다.

아마도 이 기능은 추가 규칙이 적용되는 특정 상황에서 사용되고 있을 가능성이 높습니다.(예:정수 값만 또는 0.01 단위로 증가해야 합니다. 등) 이는 입력 매개변수 분류 목록에 추가됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top