2009-04-23 5 views
7

단위 테스트에서 일부 정규 값을 적용하는 메서드를 테스트하고 메서드 계약을 위반하는 일부 값과 내가 생각해 낼 수있는 모든 경계 사례를 테스트하는 데 익숙해졌습니다. 테스트 실행은 다른 값이 전달 될 때마다 있도록 단위 테스트에서 임의성 및/또는 반복 사용?

그러나 임의의 값에

  • 테스트에 아주 나쁜 사례이다, 이것은 당신이 어떤 문제를주지 않을해야한다고 생각 범위 내의 값이며, 에서? 정기적 인 값의 광범위한 테스트로서?
  • 반복을 사용하여 전체 범위에서 테스트 했습니까?

나는 이러한 접근 방식이 전혀 좋지 않다는 느낌이 들었습니다. 범위 테스트를 통해 나는 그것을 수행하는 것이 실용적이지 않다는 것을 상상할 수 있습니다.

업데이트 :이 기술을 자신을 사용하지 않는

, 그냥 그것에 대해 궁금 해서요. 임의성은 좋은 도구가 될 수 있습니다. 필요할 때 언제든지 재현 가능하게 만들 수 있다면 지금 알고 있습니다.

http://en.wikipedia.org/wiki/Fuzz_testing

텍사스

+3

@Peter : 필자는 테스트 케이스에서 임의성을 사용하고 있습니다. 그것은 SUT에서 약간의 에러를 찾았고 테스트 케이스에서 약간의 에러를주었습니다. 테스트 케이스가 더 복잡해집니다. 실패한 임의의 값으로 테스트 케이스를 실행하는 메소드가 필요할 것이다 ... 결국, 나는 임의성을 사용하는 것에 다시 박차를 가할 것이지만 그것을 뻔뻔하게 기각하지는 않을 것이다. 모든 기술과 마찬가지로, 그것은 그 가치가 있습니다. "퍼지 (fuzzing)"용어를 찾아야합니다. –

+1

죄송합니다, 감사합니다. Ik zou het graag accepteren. – Peter

+0

@Peter, dat geval ... –

답변

3

나는 테스트 케이스에서 임의성을 사용하고 있습니다. SUT에서 오류를 발견하고 테스트 케이스에 오류가 발생했습니다.

테스트 케이스는 randomnes를 사용하면 더 복잡해집니다.

  • 당신은 임의의 값 (들) 당신이 모든 테스트에 사용되는 임의의 값을 기록해야합니다
  • 에 실패하여 테스트 케이스를 실행하는 방법이 필요합니다.
  • ...

모두 모두, 나는 다시 난수를 사용하는 방법에 대한 throthling 그러나있어 enterly을 기각하지. 모든 기술과 마찬가지로, 그것은 그 가치가 있습니다. 당신이 후에 무엇을 더 잘 설명은

, 용어

2

무엇을 테스트 :
가 가장 흥미로운 응답은 리벤의 '보풀'끝인가? 난수 생성기? 아니면 코드?

코드에 임의의 숫자를 생성하는 버그가있는 경우 어떻게해야합니까?

문제를 재현해야하는 경우 문제를 발견했을 때와 동일한 순서를 사용하기를 기대하면서 테스트를 계속 다시 시작합니까?

난수 생성기를 사용하여 데이터를 생성하려는 경우 최소한 알려진 상수 값으로 시드하여 재현하기 쉽습니다.

다른 말로하면, 귀하의 "난수"는 단지 "그다지 신경 쓰지 않는 숫자의 순서"일뿐입니다.

+0

나는 재앙이 아무 문제없이 재현 될 것이라고 생각한다. 어떤 숫자가 주장을 불쾌하게 만들었는지 로그에서 볼 수있다. – Peter

+0

어설 션이 문제가되는 입력 값을 재구성하지 못하게 할 수 있습니다 (예 : 일부 파생 값에서 assertNotNull 또는 assertTrue 일 때) –

+0

실제로이 문제를 해결할 수 없다면이 방법을 배제 할 수 있지만 어쩌면 물론 간단한 솔루션입니다. – Peter

5

단위 테스트가 빠를 필요가 있습니다. 그렇지 않으면 사람들은 정기적으로 그 사람들을 돌보지 않을 것입니다. 때때로 나는 전체 범위를 검사하기위한 코드를 작성했지만 @ Ignore'd는 테스트를 너무 느리게 만들었 기 때문에 결국 주석 처리했습니다. 난 임의의 값을 사용하는 경우, 모든 실행 실제로 같은 번호를 확인하도록 고정 씨앗과 PRNG 갈 것입니다.

1

어떤 식 으로든 그것이 무의미한 무언가를 말해 준다면 그렇게 나쁘지 않다고 생각하지는 않습니다. 그러나, 당신은 거의 운이 좋으면 응용 프로그램에서 문제를 찾을 수 있습니다.

전체 범위를 테스트하면 모든 애비뉴를 커버 할 수 있지만 가장자리가 덮여있을 때 과도한 것처럼 보이고 중간 정도의 허용되는 값이 있다고 가정합니다.

+2

@ Gryry, 행운이라고하지는 않습니다. 퍼징이라고합니다. –

5
  1. 임의의 입력 - 테스트가되지 않을 것 반복 (일치하는 결과가 실행되고, 따라서 좋은 단위 테스트를 고려하지 때마다 생산 테스트는 자신의 마음을 변경하지 마십시오
  2. 범위 시험/RowTests을.. - 그들은 테스트 스위트 실행 속도를 늦추지 않는 한 좋다.각 테스트는 최대한 으로 실행해야합니다. (30 초에 완료된 테스트 스위트가 10 분보다 더 자주 실행됩니다.) - 바람직하게는 100ms 이하입니다. 즉, 각 입력 (테스트 데이터)은 '대표'입력이어야합니다. 모든 입력 값이 동일하면 각 값을 테스트하는 중에 값을 추가하지 않고 루틴 번호를 계산하는 것입니다. 당신은 그 값들의 집합으로부터 하나의 대표자를 필요로합니다. 경계 조건과 '특별'값에 대한 대표자가 필요합니다.
  3. 가이드 라인 또는 thumbrules에 대한 자세한 내용은

- 참조했다 ... 당신이 언급 한 기술은 .. 대표 입력을 찾을 에 좋을 그래서 코드가 실패하거나 성공 곳 scenarioX을 찾기 위해 사용할 수 'What makes a Good Unit Test?'

부정확하게 - 그런 시나리오 X에 대해 반복적 인, 빠른, 테스트 - 한 가지만의 단위 테스트를 작성하고 테스트 스위트에 추가하십시오. 이러한 도구가 계속해서 더 좋은 테스트 케이스를 찾도록 도와 준다면 ... 계속 사용하십시오. 영업 이익의 설명에

응답 : 각 테스트 실행에 무작위로 아무 발전기에 대해 동일한 시드 값 (테스트 입력)를 사용하는 경우

  • , 테스트는 무작위로하지 않습니다 - 값이 미리 정해진 수있다. 그러나 단위 테스트는 이상적으로 입출력을 필요로하지 않아야합니다. 이것이 xUnit 테스트 케이스가 void TC() 서명을 갖는 이유입니다.
  • 각 실행마다 다른 시드 값을 사용하면 이제 테스트는 무작위이며 반복 할 수 없습니다. 물론 로그 파일의 특수 시드 값을 검색하여 실패한 것을 알 수 있으며 오류를 다시 생성 할 수 있습니다. 그러나 테스트가 마음에 들지 않으면 즉시 알려줍니다. Red TestConversionForEnums()는 열거 형 변환 코드가 검사없이 손상되었음을 알려줍니다.

반복 가능 - 테스트가 SUT에서 실행될 때마다 동일한 결과 (합격/불합격)가 생성된다는 것을 의미합니다. '테스트 실패를 다시 재현 할 수 있습니까?' (반복 가능! = 재현 가능). 다시 말해 .. 이런 종류의 예비 테스트은 더 많은 테스트 케이스를 식별하는 데 도움이 될 수 있지만이 테스트 스위트에는이 코드를 추가하여 하루 동안 코드를 변경할 때마다 실행하지 않습니다. 수동으로 탐색 테스트를 수행하고 코드에서 망치와 집게가 될 수있는 좋은 (일부는 가학 적으로 사용하는) 테스터를 찾고 임의의 입력 생성기보다 더 많은 테스트 케이스를 찾을 것을 권장합니다.

+0

링크의 tx가 – Peter

+0

반복 될 수는 없습니다 -> 예, 링크에 C 링크 : "테스트 데이터가 보존됩니다. 퍼지 스트림이 생성 된 의사 난수 인 경우 시드 값을 저장하는 것이 더 쉽습니다 퍼즈 시도를 재현합니다. " – Peter

+0

응답이 내 대답에 대한 업데이트로 추가되었습니다. 내 키보드의 소리가 좋아 이후 :) – Gishu

0

나는 당신에게 잘못된 보안 감각을 줄 것이므로 완전히 임의의 값을 주장하지 않을 것입니다. 전체 범위 (대부분의 경우)를 통과 할 수 없다면 손으로 서브 세트를 선택하는 것이 훨씬 효율적입니다. 이 방법을 사용하면 가능한 "홀수"값, 코드가 다르게 실행되는 값 (가장자리 근처가 아님)을 생각해야합니다.

임의의 생성기를 사용하여 테스트 값을 생성하고, 이들이 좋은 샘플을 나타내는 지 확인한 다음 사용할 수 있습니다. 특히 손으로 선택하는 데 너무 많은 시간이 소요될 경우 이는 좋은 아이디어입니다.

두 개의 다른 칩에서 hw 블록을 사용하기 위해 세마포어 드라이버를 작성할 때 무작위 테스트 값을 사용했습니다. 이 경우에는 타이밍에 의미있는 값을 선택하는 방법을 알 수 없으므로 칩이 (자주) 블록에 액세스하려고하는 빈도를 무작위로 추출했습니다. 두 가지 칩이 서로 정렬되지 않는 방식으로 테스트 환경을 작동하게하는 것이 생각만큼 간단하지 않았기 때문에 되돌아 보면 여전히 손으로 선택하는 것이 더 좋을 것입니다. 이것은 실제로 무작위 값이 무작위 표본을 생성하지 않을 때의 좋은 예입니다.

이 문제는 다른 칩이 블록을 예약 할 때마다 다른 스레드가 기다렸다가 실제로 세마포어를 읽었을 때 바로 액세스가 발생한다는 사실 때문에 문제가 발생했습니다. 칩이 얼마나 오랫동안 액세스를 기다려야하는지 플롯 할 때 그 값은 사실 무작위 적이 지 않았습니다. 최악의 경우 두 임의 값 모두 동일한 값 범위를 가졌지 만 다른 범위로 변경 한 후에는 약간 더 좋았지 만 여전히 임의적이지는 않았습니다. 내가 무작위 테스트 무언가를 얻기 시작한 것은 단지 액세스가 차단 된 시간과 기다리는 시간을 랜덤화한 후에 4 개의 세트를주의 깊게 선택했다.

결국 나는 처음부터 의미있는 값을 선택하는 것보다 "임의"값을 사용하는 코드를 작성하는 데 더 많은 시간을 사용하게되었습니다.

+0

이러한 임의 값은 물론 보완 적입니다. 잘 선택된 값은 당연히 핵심 가치입니다. – Peter

+0

그러면 문제는 그 임의의 값이 어떤 용도로 사용되는 것입니까? 더 많은 테스트 케이스를 실행하면 좋을 것이라는 것이 일반적인 오해입니다. 이것은 사실이 아닙니다. 테스트를 분석하지 않으면 동일한 코드 경로를 반복해서 테스트 할 가능성이 높습니다. 사전 정의 된 값으로 테스트를 실행하면 무작위 요소를 추가 할 때와 같은 확신을 가질 수 있습니다. – Makis

3

일반적으로 사양 기반 테스트라고하며 QuickCheck (하스켈), scalacheck (스칼라) 및 Quviq QuickCheck (얼랭)과 같은 프레임 워크로 구현되었습니다.

데이터 기반 테스트 도구 (예 : DataProvider : TestNG)는 비슷한 결과를 얻을 수 있습니다.

기본 원칙은 일종의 사양을 기반으로 테스트 대상의 입력 데이터를 생성하는 것이며 "나쁜 습관"에서 멀리 떨어져 있습니다.

+0

+1에 대한 빠른 확인. 스펙 기반 테스트의 주요 이점은 실수로 하드 코드 된 값이 아닌 데이터의 중요한 특성에 대해 주장한다는 것입니다. –

1

단위 테스트의 목표는 코드에 대한 신뢰를 얻는 것입니다. 따라서 을 사용하면 임의의 값을 사용하면 더 많은 버그를 찾는 데 도움이 될 수 있으므로 자신감을 높이려면 더 많은 테스트가 필요합니다.

그런 상황에서는 반복 테스트를 통해 문제를 확인할 수 있습니다. 루프 테스트에서 발견 된 사례에 대한 새로운 특정 테스트를 작성하고 반복 테스트를 제거하는 것이 좋습니다. 그래서 그들은 당신의 시험 속도를 늦추지 않습니다.

+0

목표는 자신감을 얻지 않고 저렴하게 버그를 찾는 것입니다. –

1

리소스를 유출하는 상태 시스템에서 필드 문제를 디버깅하는 데 임의성을 사용했습니다. 코드를 검사하고 단위 테스트를 실시하여 누출을 재현 할 수 없었습니다.

가능한 전체 이벤트 공간에서 무작위 이벤트를 상태 시스템 단위 테스트 환경으로 보냈습니다. 우리는 각 사건 후에 불변량을보고 위반되었을 때 멈췄습니다.

임의의 이벤트가 결국 누수가 발생한 일련의 이벤트를 노출했습니다. 첫 번째 오류에서 복구하는 동안 두 번째 오류가 발생하면 상태 시스템이 리소스를 유출했습니다.

그런 다음 현장에서 누출을 재연 할 수있었습니다.

그래서 무작위성은 발견하기 어려운 문제를 발견했습니다. 약간의 무력이 있지만 컴퓨터는 주말 근무에 신경 쓰지 않았습니다.

0

Theory-Based Testing에 참조 데이비드 SAFF의 작품 fuzzing를 찾아보십시오.

일반적으로 단위 테스트에서 임의성을 피할 수 있지만 이론적 인면은 흥미 롭습니다.

0

'키'는 단위 테스트입니다. 시드가 일정하다면 좋은 케이스와 나쁜 케이스의 경계/경계에 대한 예상 원점과 예상 원점의 무작위 값은 회귀 테스트에서 유용합니다.

단위 테스트는 전후에 입력/출력 (있는 경우)을 항상 저장할 수 있으면 예상되는 범위에서 임의의 값을 사용할 수 있습니다.

관련 문제