테스트 실행 환경의 포괄적인 사양입니다.
배경
Bazel BUILD 언어에는 여러 언어로 자동 테스트 프로그램을 정의하는 데 사용할 수 있는 규칙이 포함되어 있습니다.
테스트는 bazel test
를 사용하여 실행됩니다.
사용자는 테스트 바이너리를 직접 실행할 수도 있습니다. 이는 허용되지만 권장되지는 않습니다. 이러한 호출은 아래에 설명된 명령을 준수하지 않기 때문입니다.
테스트는 밀폐되어야 합니다. 즉, 선언된 종속 항목이 있는 리소스에만 액세스해야 합니다. 테스트가 적절하게 봉인되지 않으면 이전에 재현 가능한 결과를 제공하지 않습니다. 이는 원인 파악 (어떤 변경사항이 테스트를 중단했는지 확인), 출시 엔지니어링 감사 가능성, 테스트의 리소스 격리 (일부 테스트가 서버와 통신하므로 자동 테스트 프레임워크는 서버를 DDOS해서는 안 됨)에 심각한 문제가 될 수 있습니다.
목표
이 페이지의 목표는 Bazel 테스트의 런타임 환경과 예상 동작을 공식적으로 설정하는 것입니다. 또한 테스트 실행기와 빌드 시스템에 요구사항이 적용됩니다.
테스트 환경 사양은 테스트 작성자가 지정되지 않은 동작에 의존하지 않도록 도와주므로 테스트 인프라가 구현을 더 자유롭게 변경할 수 있습니다. 이 사양은 현재 적절하게 봉인되고, 결정론적이며, 재입력이 가능하지 않음에도 불구하고 많은 테스트가 통과할 수 있는 몇 가지 허점을 좁힙니다.
이 페이지는 규범적이고 공신력 있는 페이지로 작성되었습니다. 이 사양과 테스트 실행자의 구현된 동작이 일치하지 않으면 사양이 우선합니다.
제안된 사양
'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'MAY', 'OPTIONAL'은 IETF RFC 2119에 설명된 대로 해석됩니다.
테스트 목적
Bazel 테스트의 목적은 저장소에 체크인된 소스 파일의 일부 속성을 확인하는 것입니다. 이 페이지에서 '소스 파일'에는 테스트 데이터, 골드 출력, 버전 관리 대상인 기타 모든 항목이 포함됩니다. 한 사용자는 유지될 것으로 예상되는 불변식을 어설션하는 테스트를 작성합니다. 다른 사용자는 나중에 테스트를 실행하여 불변식이 손상되었는지 확인합니다. 테스트가 소스 파일 이외의 변수 (비밀 유지 불가)에 종속되는 경우 테스트가 통과하지 못할 때 나중에 변경사항이 잘못되었는지 확신할 수 없으므로 값이 감소합니다.
따라서 테스트 결과는 다음에만 종속되어야 합니다.
- 테스트에 선언된 종속 항목이 있는 소스 파일
- 테스트에 선언된 종속 항목이 있는 빌드 시스템의 제품
- 테스트 실행기에서 동작이 일정하게 유지되도록 보장하는 리소스
현재 이러한 동작은 시행되지 않습니다. 그러나 테스트 실행자는 향후 이러한 시정 조치를 추가할 권리를 보유합니다.
빌드 시스템의 역할
테스트 규칙은 각각 실행 파일을 생성해야 한다는 점에서 바이너리 규칙과 유사합니다. 일부 언어의 경우 언어별 하네스를 테스트 코드와 결합하는 스텁 프로그램입니다. 테스트 규칙은 다른 출력도 생성해야 합니다. 테스트 실행기에는 기본 테스트 실행 파일 외에 runfiles 매니페스트, 런타임에 테스트에 제공해야 하는 입력 파일이 필요하며 테스트의 유형, 크기, 태그에 관한 정보가 필요할 수 있습니다.
빌드 시스템은 runfile을 사용하여 코드와 데이터를 전송할 수 있습니다. 이는 동적 연결을 사용하는 등 테스트 간에 파일을 공유하여 각 테스트 바이너리를 더 작게 만드는 최적화로 사용될 수 있습니다. 빌드 시스템은 생성된 실행 파일이 소스 또는 출력 트리의 절대 위치에 대한 하드코딩된 참조가 아닌 테스트 실행기에서 제공하는 runfiles 이미지를 통해 이러한 파일을 로드하도록 해야 합니다.
테스트 실행기의 역할
테스트 실행자의 관점에서 각 테스트는 execve()
로 호출할 수 있는 프로그램입니다. 테스트를 실행하는 다른 방법이 있을 수 있습니다. 예를 들어 IDE에서 프로세스 내에서 Java 테스트를 실행할 수 있습니다. 하지만 테스트를 독립형 프로세스로 실행한 결과는 신뢰할 수 있는 것으로 간주해야 합니다. 테스트 프로세스가 완료되고 종료 코드 0으로 정상적으로 종료되면 테스트가 통과한 것입니다. 다른 결과는 테스트 실패로 간주됩니다. 특히 PASS
또는 FAIL
문자열을 stdout에 작성해도 테스트 실행기에는 아무런 의미가 없습니다.
테스트를 실행하는 데 시간이 너무 오래 걸리거나 일부 리소스 한도를 초과하거나 테스트 실행자가 금지된 동작을 감지하면 테스트를 종료하고 실행을 실패로 간주할 수 있습니다. 런너는 테스트 프로세스 또는 그 하위 프로세스에 신호를 보낸 후 테스트를 통과했다고 보고해서는 안 됩니다.
개별 메서드나 테스트가 아닌 전체 테스트 타겟에 완료까지 실행할 수 있는 제한된 시간이 주어집니다. 테스트의 시간 제한은 다음 표에 따라 timeout
속성을 기반으로 합니다.
제한 시간 | 시간 제한 (초) |
---|---|
short | 60 |
중간 | 300 |
long | 900 |
영원한 | 3600 |
제한 시간을 명시적으로 지정하지 않는 테스트에는 다음과 같이 테스트의 size
에 따라 암시된 제한 시간이 있습니다.
크기 | 암시적 시간 초과 라벨 |
---|---|
small | short |
중간 | 중간 |
대형 | long |
엄청난 | 영원한 |
명시적인 제한 시간 설정이 없는 '대규모' 테스트에는 실행 시간으로 900초가 할당됩니다. 제한 시간이 '짧음'인 '중간' 테스트에는 60초가 할당됩니다.
timeout
과 달리 size
는 일반 정의에 설명된 대로 로컬에서 테스트를 실행할 때 다른 리소스 (예: RAM)의 가정된 최대 사용량도 결정합니다.
size
및 timeout
라벨의 모든 조합은 유효하므로 '엄청난' 테스트의 제한 시간은 '짧음'으로 선언될 수 있습니다. 아마도 매우 끔찍한 일을 매우 빠르게 할 것입니다.
테스트는 제한 시간과 관계없이 임의로 빠르게 반환될 수 있습니다. 테스트는 과도하게 긴 제한 시간으로 인해 불이익을 받지 않지만 경고가 표시될 수 있습니다. 일반적으로 불안정성을 일으키지 않는 범위에서 제한 시간을 최대한 짧게 설정해야 합니다.
느린 것으로 알려진 조건에서 수동으로 실행할 때는 --test_timeout
bazel 플래그를 사용하여 테스트 제한 시간을 재정의할 수 있습니다. --test_timeout
값은 초 단위입니다. 예를 들어 --test_timeout=120
은 테스트 제한 시간을 2분으로 설정합니다.
테스트 시간 제한의 권장 하한값도 다음과 같습니다.
제한 시간 | 시간 최솟값 (초) |
---|---|
short | 0 |
중간 | 30 |
long | 300 |
영원한 | 900 |
예를 들어 'moderate' 테스트가 5.5초 후에 완료되면 timeout =
"short"
또는 size = "small"
를 설정하는 것이 좋습니다. bazel --test_verbose_timeout_warnings
명령줄 옵션을 사용하면 지정된 크기가 너무 큰 테스트가 표시됩니다.
테스트 크기 및 제한 시간은 여기의 사양에 따라 BUILD 파일에 지정됩니다. 지정하지 않으면 테스트 크기는 기본적으로 'medium'으로 설정됩니다.
테스트의 기본 프로세스가 종료되었지만 일부 하위 프로세스가 여전히 실행 중인 경우 테스트 실행자는 실행을 완료된 것으로 간주하고 기본 프로세스에서 관찰된 종료 코드에 따라 성공 또는 실패로 집계해야 합니다. 테스트 실행기가 유효하지 않은 프로세스를 종료할 수 있습니다. 테스트는 이러한 방식으로 프로세스를 유출해서는 안 됩니다.
테스트 샤딩
테스트는 테스트 샤딩을 통해 병렬화할 수 있습니다. 테스트 샤딩을 사용 설정하려면 --test_sharding_strategy
및 shard_count
를 참고하세요. 샤딩이 사용 설정되면 테스트 실행기가 샤드당 한 번 실행됩니다. 환경 변수 TEST_TOTAL_SHARDS
는 샤드 수이고 TEST_SHARD_INDEX
는 샤드 색인으로 0부터 시작합니다. 런너는 이 정보를 사용하여 실행할 테스트를 선택합니다(예: 로드 밸런싱 전략 사용). 일부 테스트 실행기는 샤딩을 지원하지 않습니다. 러너가 샤딩을 지원하는 경우 TEST_SHARD_STATUS_FILE
로 지정된 파일의 최종 수정 날짜를 생성하거나 업데이트해야 합니다. 그렇지 않고 --incompatible_check_sharding_support
가 사용 설정된 경우 샤딩된 경우 Bazel에서 테스트가 실패합니다.
초기 조건
테스트를 실행할 때 테스트 실행자는 특정 초기 조건을 설정해야 합니다.
테스트 실행기는 argv[0]
의 테스트 실행 파일 경로를 사용하여 각 테스트를 호출해야 합니다. 이 경로는 상대 경로여야 하며 테스트의 현재 디렉터리(runfiles 트리에 있음, 아래 참고) 아래에 있어야 합니다. 테스트 실행자는 사용자가 명시적으로 요청하지 않는 한 테스트에 다른 인수를 전달해서는 안 됩니다.
초기 환경 블록은 다음과 같이 구성되어야 합니다.
변수 | 값 | 상태 |
---|---|---|
HOME |
$TEST_TMPDIR 의 값 |
권장 |
LANG |
unset | 필수 |
LANGUAGE |
unset | 필수 |
LC_ALL |
unset | 필수 |
LC_COLLATE |
unset | 필수 |
LC_CTYPE |
unset | 필수 |
LC_MESSAGES |
unset | 필수 |
LC_MONETARY |
unset | 필수 |
LC_NUMERIC |
unset | 필수 |
LC_TIME |
unset | 필수 |
LD_LIBRARY_PATH |
공유 라이브러리가 포함된 디렉터리의 콜론으로 구분된 목록 | 선택사항 |
JAVA_RUNFILES |
$TEST_SRCDIR 의 값 |
지원 중단됨 |
LOGNAME |
$USER 의 값 |
필수 |
PATH |
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. |
권장 |
PWD |
$TEST_SRCDIR/workspace-name |
권장 |
SHLVL |
2 |
권장 |
TEST_INFRASTRUCTURE_FAILURE_FILE |
쓰기 가능한 디렉터리의 비공개 파일의 절대 경로입니다. 이 파일은 테스트 인프라에서 발생한 실패를 보고하는 데만 사용해야 하며 테스트의 불안정한 실패를 보고하기 위한 일반적인 메커니즘으로 사용해서는 안 됩니다. 이 맥락에서 테스트 인프라는 테스트에만 국한되지 않지만 오작동으로 인해 테스트 실패를 일으킬 수 있는 시스템 또는 라이브러리로 정의됩니다. 첫 번째 줄은 실패의 원인이 된 테스트 인프라 구성요소의 이름이고 두 번째 줄은 사람이 읽을 수 있는 실패 설명입니다. 추가 행은 무시됩니다.) | 선택사항 |
TEST_LOGSPLITTER_OUTPUT_FILE |
쓰기 가능한 디렉터리의 비공개 파일의 절대 경로입니다 (Logsplitter protobuffer 로그를 쓰는 데 사용됨). | 선택사항 |
TEST_PREMATURE_EXIT_FILE |
쓰기 가능한 디렉터리의 비공개 파일의 절대 경로 (exit() 호출을 포착하는 데 사용됨) |
선택사항 |
TEST_RANDOM_SEED |
--runs_per_test 옵션이 사용되면 TEST_RANDOM_SEED 은 각 개별 테스트 실행에 대해 run number(1부터 시작)로 설정됩니다. |
선택사항 |
TEST_RUN_NUMBER |
--runs_per_test 옵션이 사용되면 TEST_RUN_NUMBER 은 각 개별 테스트 실행에 대해 run number(1부터 시작)로 설정됩니다. |
선택사항 |
TEST_TARGET |
테스트 대상의 이름 | 선택사항 |
TEST_SIZE |
테스트 size |
선택사항 |
TEST_TIMEOUT |
테스트 timeout (초) |
선택사항 |
TEST_SHARD_INDEX |
샤드 색인(sharding 사용 시) |
선택사항 |
TEST_SHARD_STATUS_FILE |
sharding 지원을 나타내기 위해 터치할 파일의 경로 |
선택사항 |
TEST_SRCDIR |
runfiles 트리의 루트 경로의 절대 경로 | 필수 |
TEST_TOTAL_SHARDS |
total
shard count ,
sharding 이 사용되는 경우 |
선택사항 |
TEST_TMPDIR |
쓰기 가능한 비공개 디렉터리의 절대 경로 | 필수 |
TEST_WORKSPACE |
로컬 저장소의 작업공간 이름 | 선택사항 |
TEST_UNDECLARED_OUTPUTS_DIR |
비공개 쓰기 가능 디렉터리의 절대 경로입니다 (선언되지 않은 테스트 출력을 쓰는 데 사용됨). TEST_UNDECLARED_OUTPUTS_DIR 디렉터리에 쓰여진 모든 파일은 압축되어 bazel-testlogs 아래의 outputs.zip 파일에 추가됩니다. |
선택사항 |
TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR |
비공개 쓰기 가능한 디렉터리의 절대 경로입니다 (선언되지 않은 테스트 출력 주석 .part 및 .pb 파일을 작성하는 데 사용됨). |
선택사항 |
TEST_WARNINGS_OUTPUT_FILE |
쓰기 가능한 디렉터리의 비공개 파일의 절대 경로입니다 (테스트 대상 경고를 쓰는 데 사용됨). | 선택사항 |
TESTBRIDGE_TEST_ONLY |
지정된 경우 --test_filter 값 |
선택사항 |
TZ |
UTC |
필수 |
USER |
getpwuid(getuid())->pw_name 의 값 |
필수 |
XML_OUTPUT_FILE |
테스트 작업이 테스트 결과 XML 출력 파일을 작성해야 하는 위치입니다. 그렇지 않으면 Bazel은 테스트 작업의 일부로 테스트 로그를 래핑하는 기본 XML 출력 파일을 생성합니다. XML 스키마는 JUnit 테스트 결과 스키마를 기반으로 합니다. | 선택사항 |
BAZEL_TEST |
테스트 실행 파일이 bazel test 에 의해 실행되고 있음을 나타냅니다. |
필수 |
환경에 추가 항목이 포함될 수 있습니다. 테스트는 위에 나열되지 않은 환경 변수의 존재, 부재 또는 값에 의존해서는 안 됩니다.
초기 작업 디렉터리는 $TEST_SRCDIR/$TEST_WORKSPACE
여야 합니다.
현재 프로세스 ID, 프로세스 그룹 ID, 세션 ID, 상위 프로세스 ID는 지정되지 않습니다. 프로세스는 프로세스 그룹 리더 또는 세션 리더일 수도 있고 아닐 수도 있습니다. 프로세스에 제어 터미널이 있을 수도 있고 없을 수도 있습니다. 프로세스에는 실행 중인 하위 프로세스 또는 수확되지 않은 하위 프로세스가 0개 이상 있을 수 있습니다. 테스트 코드가 제어권을 획득할 때 프로세스에 여러 스레드가 있어서는 안 됩니다.
파일 설명자 0 (stdin
)은 읽을 수 있도록 열려야 하지만 연결된 대상은 지정되지 않습니다. 테스트에서 읽어서는 안 됩니다. 파일 설명자 1 (stdout
) 및 2(stderr
)는 쓰기 위해 열려야 하지만, 첨부되는 대상은 지정되지 않습니다. 터미널, 파이프, 일반 파일 또는 문자를 쓸 수 있는 기타 항목일 수 있습니다. 열려 있는 파일 테이블의 항목을 공유할 수 있습니다(즉, 독립적으로 탐색할 수 없음). 테스트는 다른 열린 파일 설명자를 상속해서는 안 됩니다.
초기 umask는 022
또는 027
여야 합니다.
대기 중인 알람이나 간격 타이머가 없어야 합니다.
차단된 신호의 초기 마스크는 비어 있어야 합니다. 모든 신호는 기본 작업으로 설정되어야 합니다.
초기 리소스 한도(소프트 및 하드)는 다음과 같이 설정해야 합니다.
리소스 | 한도 |
---|---|
RLIMIT_AS |
무제한 |
RLIMIT_CORE |
지정되지 않음 |
RLIMIT_CPU |
무제한 |
RLIMIT_DATA |
무제한 |
RLIMIT_FSIZE |
무제한 |
RLIMIT_LOCKS |
무제한 |
RLIMIT_MEMLOCK |
무제한 |
RLIMIT_MSGQUEUE |
지정되지 않음 |
RLIMIT_NICE |
지정되지 않음 |
RLIMIT_NOFILE |
1,024 이상 |
RLIMIT_NPROC |
지정되지 않음 |
RLIMIT_RSS |
무제한 |
RLIMIT_RTPRIO |
지정되지 않음 |
RLIMIT_SIGPENDING |
지정되지 않음 |
RLIMIT_STACK |
무제한 또는 2044KB <= rlim <= 8192KB |
초기 프로세스 시간 (times()
에서 반환됨) 및 리소스 사용량(getrusage()
에서 반환됨)은 지정되지 않습니다.
초기 예약 정책 및 우선순위는 지정되지 않습니다.
호스트 시스템의 역할
테스트 실행자가 직접 제어하는 사용자 컨텍스트의 측면 외에도 테스트가 실행되는 운영체제는 테스트 실행이 유효하려면 특정 속성을 충족해야 합니다.
파일 시스템
테스트에서 관찰한 루트 디렉터리는 실제 루트 디렉터리일 수도 있고 아닐 수도 있습니다.
/proc
을(를) 마운트해야 합니다.
모든 빌드 도구는 로컬 설치에서 사용하는 /usr
아래의 절대 경로에 있어야 합니다.
/home
로 시작하는 경로는 사용할 수 없습니다. 테스트는 이러한 경로에 액세스해서는 안 됩니다.
/tmp
는 쓸 수 있어야 하지만 테스트에서는 이러한 경로를 사용하지 않아야 합니다.
테스트는 상수 경로를 독점적으로 사용할 수 있다고 가정해서는 안 됩니다.
테스트는 마운트된 파일 시스템에 atime가 사용 설정되어 있다고 가정해서는 안 됩니다.
사용자 및 그룹
사용자 root, nobody, unittest가 있어야 합니다. 그룹 root, nobody, eng가 있어야 합니다.
테스트는 루트가 아닌 사용자로 실행해야 합니다. 실제 사용자 ID와 유효 사용자 ID는 같아야 합니다. 그룹 ID도 마찬가지입니다. 그 외 현재 사용자 ID, 그룹 ID, 사용자 이름, 그룹 이름은 지정되지 않습니다. 보조 그룹 ID 집합은 지정되지 않습니다.
현재 사용자 ID 및 그룹 ID에는 getpwuid()
및 getgrgid()
로 검색할 수 있는 상응하는 이름이 있어야 합니다. 보조 그룹 ID에는 적용되지 않을 수 있습니다.
현재 사용자에게 홈 디렉터리가 있어야 합니다. 쓰기 불가능할 수 있습니다. 테스트에서 여기에 쓰려고 시도해서는 안 됩니다.
네트워킹
호스트 이름이 지정되지 않았습니다. 점은 포함되거나 포함되지 않을 수 있습니다. 호스트 이름을 확인하면 현재 호스트의 IP 주소가 제공되어야 합니다. 첫 번째 점 뒤에서 잘린 호스트 이름을 확인하는 것도 작동해야 합니다. 호스트 이름 localhost가 확인되어야 합니다.
기타 리소스
테스트에는 하나 이상의 CPU 코어가 부여됩니다. 다른 방법을 사용할 수도 있지만 보장되지는 않습니다. 이 코어의 다른 성능 측면은 지정되지 않습니다. 테스트 규칙에 'cpu:n' (여기서 n은 양수) 태그를 추가하여 예약을 더 많은 수의 CPU 코어로 늘릴 수 있습니다. 머신의 총 CPU 코어가 요청된 것보다 적더라도 Bazel은 테스트를 실행합니다. 테스트에서 샤딩을 사용하는 경우 각 개별 샤드가 여기에 지정된 CPU 코어 수를 예약합니다.
테스트는 하위 프로세스를 만들 수 있지만 그룹이나 세션은 처리할 수 없습니다.
테스트에서 사용할 수 있는 입력 파일 수에는 제한이 있습니다. 이 한도는 변경될 수 있지만 현재 수만 개의 입력 범위입니다.
시간 및 날짜
현재 시간과 날짜가 지정되지 않습니다. 시스템 시간대가 지정되지 않았습니다.
X Windows를 사용할 수 있을 수도 있고 없을 수도 있습니다. X 서버가 필요한 테스트는 Xvfb를 시작해야 합니다.
파일 시스템과의 상호작용 테스트
테스트 환경 변수에 지정된 모든 파일 경로는 달리 지정되지 않는 한 로컬 파일 시스템의 특정 위치를 가리킵니다.
테스트는 $TEST_TMPDIR
및 $TEST_UNDECLARED_OUTPUTS_DIR
(설정된 경우)로 지정된 디렉터리 내에만 파일을 만들어야 합니다.
이러한 디렉터리는 처음에 비어 있습니다.
테스트에서 이러한 디렉터리를 삭제하거나 chmod를 실행하거나 다른 방식으로 변경하려고 해서는 안 됩니다.
이러한 디렉터리는 심볼릭 링크일 수 있습니다.
$TEST_TMPDIR/.
의 파일 시스템 유형은 지정되지 않은 상태로 유지됩니다.
테스트는 선언되지 않은 출력 파일에 주석을 추가하기 위해 .part 파일을 $TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR
에 쓸 수도 있습니다.
드물지만 테스트가 /tmp
에 파일을 만들도록 강제될 수 있습니다. 예를 들어 Unix 도메인 소켓의 경로 길이 제한을 적용하려면 일반적으로 /tmp
아래에 소켓을 만들어야 합니다. Bazel은 이러한 파일을 추적할 수 없습니다. 테스트 자체는 견고하고 고유한 경로를 사용하여 동시에 실행되는 다른 테스트 및 테스트 외 프로세스와 충돌하지 않도록 주의하고 /tmp
에서 생성된 파일을 정리해야 합니다.
JUnit4 TemporaryFolder
또는 Go TempDir
와 같은 일부 인기 테스트 프레임워크에는 /tmp
아래에 임시 디렉터리를 만드는 자체 방법이 있습니다. 이러한 테스트 프레임워크에는 /tmp
에서 파일을 정리하는 기능이 포함되어 있으므로 TEST_TMPDIR
외부에 파일을 만들더라도 사용할 수 있습니다.
테스트는 runfiles 메커니즘 또는 입력 파일을 사용할 수 있도록 하기 위한 실행 환경의 다른 부분을 통해 입력에 액세스해야 합니다.
테스트는 자체 실행 파일의 위치에서 추론된 경로에서 빌드 시스템의 다른 출력에 액세스해서는 안 됩니다.
runfiles 트리에 일반 파일, 기호 링크 또는 둘 다 포함되어 있는지는 지정되지 않습니다. runfiles 트리에는 디렉터리에 대한 심볼릭 링크가 포함될 수 있습니다.
테스트는 runfiles 트리 내에 ..
구성요소가 포함된 경로를 사용해서는 안 됩니다.
런파일 트리 내의 디렉터리, 파일 또는 심볼릭 링크 (심볼릭 링크를 통과하는 경로 포함)는 쓸 수 없어야 합니다. 따라서 초기 작업 디렉터리는 쓰기 가능해서는 안 됩니다. 테스트는 runfile의 일부가 쓰기 가능하거나 현재 사용자가 소유하고 있다고 가정해서는 안 됩니다 (예: chmod
및 chgrp
가 실패할 수 있음).
runfiles 트리 (심볼릭 링크를 통과하는 경로 포함)는 테스트 실행 중에 변경되어서는 안 됩니다. 상위 디렉터리와 파일 시스템 마운트는 runfiles 트리 내 경로 확인 결과에 영향을 미치는 방식으로 변경되어서는 안 됩니다.
조기 종료를 포착하기 위해 테스트는 시작 시 TEST_PREMATURE_EXIT_FILE
로 지정된 경로에 파일을 만들고 종료 시 이를 삭제할 수 있습니다. 테스트가 완료될 때 Bazel에 파일이 표시되면 테스트가 조기 종료되었다고 가정하고 실패로 표시합니다.
태그 규칙
테스트 규칙의 일부 태그에는 특별한 의미가 있습니다. tags
속성에 관한 Bazel 빌드 백과사전도 참고하세요.
태그 | 의미 |
---|---|
exclusive |
동시에 다른 테스트를 실행하지 않음 |
external |
테스트에 외부 종속 항목이 있음. 테스트 캐싱 사용 중지 |
large |
test_suite 규칙: 대규모 테스트 모음 |
manual * |
:... , :* , :all 와 같은 와일드 카드 타겟 패턴에 테스트 타겟을 포함하지 않습니다. |
medium |
test_suite 규칙: 중간 테스트 모음 |
small |
test_suite 규칙: 소규모 테스트 모음 |
smoke |
test_suite 규칙. 즉, 버전 제어 시스템에 코드 변경사항을 커밋하기 전에 실행해야 합니다. |
Runfiles
다음에서는 //deps/server:server
라벨이 지정된 규칙에 대한 런타임 종속 항목이 있는 //foo/bar:unittest
라벨이 지정된 *_binary() 규칙이 있다고 가정합니다.
위치
대상 //foo/bar:unittest
의 runfiles 디렉터리는 $(WORKSPACE)/$(BINDIR)/foo/bar/unittest.runfiles
디렉터리입니다. 이 경로를 runfiles_dir
라고 합니다.
종속 항목
runfiles 디렉터리는 *_binary()
규칙의 컴파일 시간 종속 항목으로 선언됩니다. runfiles 디렉터리 자체는 *_binary()
규칙 또는 컴파일 시간 또는 런타임 종속 항목에 영향을 미치는 BUILD 파일 세트에 종속됩니다. 소스 파일을 수정해도 runfiles 디렉터리의 구조는 영향을 받지 않으므로 빌드가 다시 트리거되지 않습니다.
목차
runfiles 디렉터리에는 다음이 포함됩니다.
- 런타임 종속 항목의 심볼릭 링크:
*_binary()
규칙의 런타임 종속 항목인 각 OutputFile 및 CommandRule은 runfiles 디렉터리의 심볼릭 링크 하나로 표현됩니다. 심볼릭 링크의 이름은$(WORKSPACE)/package_name/rule_name
입니다. 예를 들어 서버의 심볼릭 링크 이름은$(WORKSPACE)/deps/server/server
이고 전체 경로는$(WORKSPACE)/foo/bar/unittest.runfiles/$(WORKSPACE)/deps/server/server
입니다. 심볼릭 링크의 대상은 OutputFile 또는 CommandRule의 OutputFileName()이며 절대 경로로 표현됩니다. 따라서 심볼릭 링크의 대상은$(WORKSPACE)/linux-dbg/deps/server/42/server
일 수 있습니다. - 하위 실행 파일의 심볼릭 링크:
*_binary()
C의 런타임 종속 항목인 모든*_binary()
Z의 경우 C의 실행 파일 디렉터리에 Z의 실행 파일로 연결되는 두 번째 링크가 있습니다. 심볼릭 링크의 이름은$(WORKSPACE)/package_name/rule_name.runfiles
입니다. 심볼릭 링크의 대상은 runfiles 디렉터리입니다. 예를 들어 모든 하위 프로그램은 공통 runfiles 디렉터리를 공유합니다.