문제

빠른 확인 그리고 그 변형 (심지어 하나가 있습니다 자바), 흥미로운 것 같습니다. 그러나 학문적 관심과는 별도로 실제 응용 프로그램 테스트 (예 : GUI 응용 프로그램 또는 클라이언트/서버 또는 StackOverFlow 자체를 취하는 데 실제로 유용합니까? 비슷한 테스트 생성기에 대한 경험은 감사합니다.

도움이 되었습니까?

해결책

네, 글쎄요. 사실, 그러나 나는 원래 QuickCheck을 개발 한 사람 아래에서 공부했으며 그는 정말 흥미로운 사람입니다.

2004 년에, 우리는 Haskell 프로그램을 테스트하기 위해 QuickCheck을 사용해야했으며 좋은 것과 나쁜 것의 조합이었습니다. Haskell이 약간 어려웠 기 때문에 대부분 나쁘지만 작동 할 때 결코 덜 훌륭하지 않습니다.

그 후 John은 자신이 몇 년을 거슬러 올라가는 것을 완성하고 실제로 Ericssion이 복잡한 통신 하드웨어를 테스트하는 데 도움을 주었고, 2 천만 개 정도의 코드 라인에서 버그를 발견하여 접근 방식을 통해 3 단계로 줄였습니다. 그는 훌륭한 연사이기 때문에 항상 그가 잘하는 일을 듣는 것은 항상 기쁨이지만, 그가 QuickCheck로 한 일은 나에게 새로운 것이 었습니다. 그래서 나는 그에게 이것을 시장에 가져 오는 데 관심이 무엇인지 물었다. 그는 아이디어에 개방적 이었지만 당시 그의 사업 (QuickCheck을 기반으로)은 비교적 새롭기 때문에 그가 집중할 다른 영역이있었습니다. 이것은 2007 년입니다. 제 요점은, 당신이 그것을 사용하지 않더라도 QuickCheck에서 배울 수 있다는 것입니다.

그러나 QuickCheck은 무엇입니까? AA 조합 테스트 프레임 워크이며 프로그램 테스트 방법입니다. Microsoft Research의 사람들이 구축했습니다 PEX 그것은 일종의 비슷합니다. PEX는 IL을 검사하여 자동으로 테스트를 생성합니다. 그러나 John은 함수의 입력 및 테스트 속성에 대한 생성기를 작성합니다. 속성은 쉽게 테스트 할 수있는 것이며 훨씬 더 형식적입니다. 예를 들어 목록을 뒤집고 있습니까? 글쎄, 목록을 뒤집는 것은 목록을 두 개의 반쪽으로 나누고 각각 개별적으로 역전시킨 다음 두 개의 반전 된 반쪽을 역 순서로 연결하는 것과 동일합니다.

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

이것은 사양이라는 QuickCheck으로 테스트하기에 좋은 속성이며 결과는 매우 놀랍습니다.

Pex는 멋지지만 빠른 체크만큼 멋지지는 않지만 Pex는 사물을 단순화하지만 QuickCheck은 좋은 사양을 작성하려면 많은 노력이 필요합니다.

QuickCheck의 힘은 실패에 빠지면 테스트가 실패하여 가능한 가장 작은 형태로 입력이 줄어든다는 것입니다. 상태의 진행 상황에 대한 자세한 설명으로 테스트가 실패했습니다. 다른 테스트 프레임 워크와 비교하여 코드를 무차별적인 방식으로 깨뜨 리려고합니다.

테스트 사양을 작성하는 방법으로 인해 가능합니다. QuickCheck은 의사 랜덤에 의존하여 입력을 발명하기 위해 의사 무작위성에 의존하며, 이로 인해 역 추적이 가능하며 테스트를 통과하지 못하는 실제로 작은 입력을 찾습니다.

QuickCheck 속성을 작성하는 것이 훨씬 더 많은 작업이지만 최종 결과는 더 나은 테스트입니다. John 자신이 말했듯이, 버그의 70%가 단위 테스트에 의해 잡히지 만 다른 30%는 프로그램이 충돌하게됩니다. QuickCheck은 마지막 30%를 테스트하고 있습니다.

다른 팁

나는 개별 이벤트 시뮬레이션과 관련된 실제 Haskell 문제를 수행했습니다. 그래서 나는 MVARS 및 채널과 동등한 요소와 함께 Monad Monad를 기반으로 DES 라이브러리를 썼습니다. 나는 이것이 올바르게 작동하는지 확인해야했기 때문에 많은 QuickCheck 속성을 썼다.

또한 QuickCheck을 사용하여 내 속성을 문서화하고 확인했습니다. 원거리 세트 그리고 소수 도서관.

내 경험상 QuickCheck은 때때로 훌륭합니다. 중요한 속성을 간결한 방식으로 요약 할 수 있다면 해당 속성을 전달하는 알고리즘은 털이 많지만 QuickCheck은 큰 승리입니다. 반면에 나는 종종 알고리즘이 확인하고 싶은 속성과 동일하다는 것을 알게됩니다. 이 경우 더 간단한 특성을 찾습니다. 예를 들어, 기능 "foo"가 엄격하게 단조로운 일이어야한다고 가정합니다. 그런 다음 글을 쓸 수 있습니다

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

나는 많은 개인적인 것들을 위해 QuickCheck을 사용합니다. 지난 6 개월 안에 :

  • 이미지 압축기에서 색상 변환을 테스트하고 개별 코사인 변환을 테스트하기 위해 빠른 체크를 실행했습니다.

  • 수치 최적화를 위해 휘핑 된 상징적 인 분화 모듈을 테스트하기 위해 QuickCheck을 실행했습니다.

  • Bentley와 Sedgewick의 스타일로 Ternary-search 트리를 테스트하기 위해 빠른 체크를 실행했습니다.

QuickCheck은 거의 만나지 않습니다 모두 내 단위 테스트 요구 사항이지만 시작하는 좋은 방법입니다. QuickCheck 법률은 좋은 문서를 만듭니다.

나는 주로 테스트 프로토콜 및 파서 구현을 위해 주로 Straighforward 방식으로 많이 사용했습니다.

그러나 여기 내 개인적인 경험에서 사소한 비트가 덜 있습니다. http://www.haskell.org/haskellwiki/quickcheck_as_a_test_generator

스칼라 크 (스칼라의 빠른 체크)는 테스트에 사용됩니다. 기능적 자바, 무엇보다도 도서관 Java의 빠른 체크.

Afaik Xmonad는 QuickCheck로 광범위하게 테스트되었습니다

나는 작은 도구 도구를 개발하기 위해 생산 환경에서 Haskell 만 사용했습니다. 주로 내가 유일한 개발자이기 때문에 Haskell을 읽는다는 것을 알고 있습니다. 그래도 QuickCheck을 광범위하게 사용했으며 C#에서 비슷한 것을 사용할 수 없다는 것이 정말 화가났습니다. 그래서 나는 시도하고 결정했다 직접 작성하십시오. 나는 PEX도 보았지만 QuickCheck이하는 방식보다 최소한의 입력을 찾는 데 사용되는 프로그램 탐색 기술을 발견했습니다.

나는 QuickCheck을 사용하여 모든 언어로 작성된 명령 줄 프로그램의 행동을 테스트합니다.

저수준 또는 동적으로 입력 한 프로그램이 충돌하는 입력을 찾는 것이 특히 유용합니다.

편의를 위해 나는 썼다 http://hackage.haskell.org/package/proctest, 여기에는 HSPEC 및 Hunit과 함께 사용되는 QuickCheck의 몇 가지 예가이 방식으로 명령 줄 프로그램을 테스트합니다.

우리는 사용 fscheck OCAML에서 F# 번역이 정확하고 최적화 된 버전이 최적화되지 않은 버전과 동일하게 작동하는지 확인합니다. 나는 또한 그것을 사용하여 Lexer와 Parser를 테스트 할 계획입니다. nhol 프로젝트를 사용합니다 파서 콤바네이터.

또한 테스트를 실행할 수있는 도우미 기능도 있습니다. NUNIT (.NET 용 xunit). 보다 AssertProp.

LG Linux 모바일 플랫폼에서 SMS PDU 인코더 및 디코더를 테스트하기 위해 QuickCheck을 사용했습니다. 그 당시 내가 개발 한 소프트웨어의 (오래된) 버전에서 다운로드 할 수 있습니다. http://hackage.haskell.org/package/gensmspdu-0.1

내 프로젝트가 아니라 containers 패키지는 QuickCheck을 상당히 광범위하게 사용합니다. 개인적으로, 나는 그것을 사용하여 내가 쓴 바보 같은 작은 프라임 체를 비교해 보았습니다. arithmoi, 그로 인해 나는 그것을 발견하게되었습니다 arithmoi 때때로 segfaults.

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