Haskell 테스트 워크 플로


101

방금 새 Haskell 프로젝트를 시작했고 처음부터 좋은 테스트 워크 플로를 설정하고 싶었습니다. Haskell은 훌륭하고 독특한 테스트 도구가 많고이를 통합하는 다양한 방법이있는 것 같습니다.

나는 조사했다 :

모두 자신의 영역에서 잘 작동하는 것처럼 보이지만 테스트에 대한 포괄적 인 접근 방식을 찾고 있으며 다른 사람들에게 무엇이 잘 작동하는지 궁금합니다.

답변:


70

단위 테스트, 코드 범위 및 벤치 마크를 올바르게 얻는 것은 대부분 올바른 도구를 선택하는 것입니다.

  • test-framework는 하나의 하네스에서 모든 HUnit 테스트 케이스 및 QuickCheck 속성을 모두 실행할 수있는 원 스톱 상점을 제공합니다 .
  • 코드 커버리지는 HPC 의 형태로 GHC에 내장됩니다. 도구 있습니다.
  • Criterion은 꽤 훌륭한 벤치마킹 기계를 제공합니다.

단위 테스트, 코드 적용 범위 및 벤치 마크로 활성화하기 시작한 패키지를 실행 예제로 사용하겠습니다.

http://github.com/ekmett/speculation

테스트 및 벤치 마크를 섹션을 추가하고 플래그 뒤에 마스킹하여 라이브러리의 모든 사용자가 액세스 할 수 있도록 (그리고 스스로 사용하고 싶어하지 않도록) cabal 파일에 직접 통합 할 수 있습니다. ) 선택한 테스트 도구의 정확한 버전.

http://github.com/ekmett/speculation/blob/master/speculation.cabal

그런 다음 cabal에게 테스트 스위트를 실행하는 방법을 알릴 수 있습니다. cabal 테스트가 아직 존재하지 않기 때문에 올해 여름 코드를 위해 작업하는 학생이 있습니다! -우리가 가진 최고의 메커니즘은 여기 cabal의 사용자 후크 메커니즘을 사용하는 방법입니다. 이것은 cabal을 사용하여 'Custom'빌드로 전환하고 testHook을 설정하는 것을 의미합니다. test-framework로 작성된 테스트 프로그램을 실행 한 다음 hpc를 프로필에 적용하는 testHook의 예는 여기에서 찾을 수 있습니다.

http://github.com/ekmett/speculation/blob/master/Setup.lhs

그런 다음 테스트 프레임 워크를 사용하여 QuickCheck 및 HUnit 테스트를 하나의 프로그램으로 묶을 수 있습니다.

http://github.com/ekmett/speculation/blob/master/Test.hs

cabal 파일은 코드 검사 테스트를 활성화하기 위해 -fhpc를 설정하도록주의를 기울인 다음 Setup.lhs의 testHook은 hpc를 수동으로 실행하고 출력을 dist dir에 기록합니다.

벤치마킹의 경우 이야기는 좀 더 수동적이며 '캐벌 벤치 마크'옵션이 없습니다. 벤치 마크를 테스트 후크에 연결할 수 있지만 Criterion에는 그래픽보고 옵션이 너무 많기 때문에 직접 실행하는 것이 좋습니다. 위와 같이 벤치 마크를 cabal 파일에 추가하고, 별도의 컴파일 플래그를 부여하고, cabal 플래그 뒤에 숨긴 다음 Criterion을 사용하여 모든 무거운 작업을 수행 할 수 있습니다.

http://github.com/ekmett/speculation/blob/master/Benchmark.hs

그런 다음 명령 줄에서 벤치 마크를 실행하고 벤치 마크 결과 등이 포함 된 팝업 KDE 창을 가져올 수 있습니다.

실제로 Haskell 코드를 개발하는 동안 어쨌든 cabal에 살고 있기 때문에 도구 체인을 그것과 통합하는 것이 좋습니다.

편집 : 이제 기갑 단 테스트 지원이 존재합니다. 참조 http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites를


2
그리고 cabal bench지금도 존재합니다.
nh2

6
진실. 나는 가리 것이다 github.com/ekmett/lens 를 처리하는 방법에 대한보다 현대적인 예로서 cabal testcabal bench혼합, HUnit, doctest,과 quickcheck에 따라 검사 criterion벤치 마크를. 의 코드 speculation선행 cabal testcabal bench.
Edward KMETT

2
@EdwardKmett : lense 패키지가 exitcode-stdio-1.0 테스트 스위트 인터페이스 만 사용하는 것을 보았습니다. Cabal 사용자 가이드는``세부 1.0 인터페이스에 대해 새로운 테스트 스위트를 작성하는 것이 바람직합니다 ''라고 말합니다. 그것에 대한 의견이 있습니까?
copton

9
@copton 그들은 그것을 구현하지 않았습니다. 그 문서는 다시 꺼내서 촬영해야합니다.
Edward KMETT

2
불행히도 github에 대한 링크는 모두 마스터 브랜치를 가리키고 있으며 테스트와 관련된 모든 것이 cabal 파일에서 제거 된 것처럼 보이므로 링크가 효과적으로 끊어졌습니다.
Andrew Thaddeus Martin

52

이 접근 방식은 RWH ch 11 에서 옹호 되며 XMonad 에서는 대략 다음과 같습니다.

QuickCheck를 통해 주요 불변이 설정되면 리팩토링을 시작하여 해당 테스트를 유형 불변으로 이동할 수 있습니다.

귀하의 노력을 지원하는 관행 :

  • 모든 커밋에서 단순화 된 QuickCheck 회귀를 실행합니다.
  • HPC 커버리지 세부 정보를 게시합니다.

14

테스트 프레임 워크 패키지 정말 굉장합니다. HUnit 및 QuickCheck 테스트를 쉽게 통합하고 명령 줄 플래그를 기반으로 지정된 제품군 만 실행하는 실행 파일을 여러 출력 대상과 함께 가져올 수 있습니다.

테스트와 프로파일 링은 다른 짐승입니다. 프로파일 링을 위해 프로파일 링하려는 섹션 만 강조하는 별도의 실행 파일을 설정하고 빌드 및 실행 프로파일 링 결과를주의 깊게 살펴 봅니다 (컴파일의 경우 -prof-auto-all, 런타임의 경우 + RTS -p 사용) 깃발).


테스트 프레임 워크의보다 적극적으로 유지되는 후속 작업은 맛있습니다 .
sjakobi

10

테스트를 위해 HUnit 및 QuickCheck 속성에 의존하고 Haskell 테스트 프레임 워크를 사용합니다. 를 사용하여 모든 단위 테스트와 모든 QuickCheck 속성을 자동으로 수집합니다.

면책 조항 : 저는 Haskell Test Framework의 주요 개발자입니다.


5
스테판, 이것에 대한 문서는 거의 없습니다. 그것이 인기가없는 주된 이유라고 생각합니다. : 질문은 여기에 당신의주의 확실히 가치가있다 stackoverflow.com/questions/8919556/testing-with-htf
니키타 볼코프

2
새 릴리스 0.9.0.0의 HTF는 이제 많은 문서와 함께 제공됩니다. 또한 개발을 github.com/skogsbaer/HTF 로 옮겼 습니다 . 사람들이 HTF를 사용하고 HTF에 대한 질문을 더 쉽게 할 수 있기를 바랍니다. 그렇게하세요!
stefanwehr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.