배포판(distribution) 테스트하기
배포판(distribution) 테스트하기 (distributions_testing)
배포판을 하나 만들었다면, 이제 제대로 동작하는지 검증해야겠죠. Raku 배포판을 테스트하는 방법을 정리한 문서예요. prove나 prove6로 테스트를 돌리는 방법부터, 배포판 특유의 주의점(-I. vs -Ilib), 그리고 meta-ok 같은 필수 검사까지 차근차근 살펴볼게요.
본문
Perl의 prove나 Raku 버전인 prove6 같은 테스트 프로그램을 distribution의 루트 디렉터리에서 실행할 수 있어요. 예를 들면:
prove -e 'raku -I.'
또는
prove6 -I.
두 경우 모두 테스트 프로그램이 t/ 디렉터리를 찾아 그 안의 테스트 프로그램들을 실행해요 (자세한 내용은 Testing 참고). 위 예에서 **-I.**을 썼지 **-Ilib**를 쓰지 않은 건 중요한 이유가 있어요. 그래야 컴파일러가 distribution 루트 디렉터리의 META6.json 파일을 살펴볼 수 있거든요.
모듈(또는 모듈 묶음) 개발을 막 시작했고, 코드를 뭐라고 부르고 어디에 둘지 아직 정하지 못했다면(여러 *.rakumod 파일로 쪼갤 수도 있겠죠) 모든 모듈 파일이 lib/ 디렉터리 아래 있다고 가정하고 다음처럼 쓸 수 있어요.
prove6 -Ilib
그런데 이건 좀 함정이에요. -Ilib로는 로컬 파일 기반 테스트와 릴리스 단계를 통과할 수 있어도, distribution(그리고 그 안의 모듈·클래스·role)이 자동으로 설치되지는 않을 수 있어요. 흔한 예를 들면 이렇죠. 어떤 distribution이 다른 distribution의 depends 목록에 들어 있고, 사용자가 zef install --deps-only . 같은 CLI 명령으로 그 다른 distribution을 zef으로 설치하려 한다고 해요. 그러면 zef은 의존 모듈의 테스트를 -Ilib가 아니라 -I. 기반으로 돌려요. 결과적으로 META6.json 파일이 올바르지 않으면, rakudo가 명명된 compunit이 없다는 오류를 내게 돼요.
use-ok 테스트
distribution에 정의된 각 compunit마다 돌려야 하는 가장 기본적인 테스트는 다음과 같아요.
use-ok 'MyModule';
META6.json 안에 다음 같은 줄이 있다고 가정하죠.
provides: { "MyModule": "lib/MyModule.rakumod" },
meta-ok 테스트
Test::META의 meta-ok 테스트를 쓰는 것도 강력 권장돼요. 이 테스트는 META6.json 파일의 유효성을 검증해요. (모듈을 담은) distribution을 Ecosystem에 추가하고 싶다면, 이 테스트가 그 distribution에 적용될 거예요.
확장 테스트 (Extended Tests)
meta-ok은 distribution의 개발자·유지보수자만 테스트하면 되기 때문에, /xt 같은 별도 디렉터리의 확장 테스트 묶음 안에 넣을 수 있어요. prove6이 기본적으로 t/ 안의 테스트만 돌리기 때문이죠. 확장 테스트를 돌리려면:
prove6 -I. xt/
실제로 Raku 커뮤니티 개발자들이 distribution의 광범위한 테스트를 xt/에 두고, 최소한의 스모크 테스트는 t/에 두는 게 점점 흔해지고 있어요. 광범위한 테스트는 개발과 품질 관리에 필수적이지만, 인기 있는 distribution의 설치를 느리게 만들 수 있어서 그래요.
meta-ok 테스트를 확장 테스트 디렉터리에 두는 대안으로, 개발자·유지보수자가 원할 때만 실행되도록 환경 변수에 의존하게 만드는 방법도 있어요. 예를 들어 t/99-author-test.rakutest에 다음 코드가 있다고 해요.
use Test;
plan 1;
if ?%*ENV<AUTHOR_TESTING> {
require Test::META <&meta-ok>;
meta-ok;
done-testing;
} else {
skip-rest "Skipping author test";
exit;
}
그러면 개발자가 distribution을 테스트할 때는 다음처럼 실행하면 돼요.
AUTHOR_TESTING=1 prove6 -I.
비-코어 테스트 도구 (Non-Core Testing Tools)
모듈 품질을 테스트하기 위한 몇 가지 커뮤니티 모듈이 있어요.
- Test::META — META6.json 파일 검증
- Test::Output — 프로그램이 생성하는 STDOUT·STDERR 출력 테스트
- Test::Screen — GNU screen으로 풀스크린 VT 애플리케이션 테스트
- Test::When — 테스트 실행 시점 제어 (author testing, online testing 등)
모듈 관련 도구의 일반적인 목록은 배포판: 도구를 참고하세요.
더 알아보기
- Testing — 일반적인 Raku 테스트 가이드
- 배포판: 입문 — 배포판 개념과 용어
- 배포판: 설정과 구조 —
META6.json과 디렉터리 구조 - 배포판: 도구 — 모듈 관련 도구 목록