Chrono Mock
언어한국어

파이프라인에서의 날짜 테스트

창은 탐색을 위한 것입니다. 이쪽은 나머지 절반으로, 설치할 런타임이 없는 약 2.4MB의 명령줄 빌드이며, 종료 코드는 대상의 종료 코드가 아니라 커버리지 판정입니다.

종료 코드가 곧 판정입니다

이 도구를 스크립트에서 쓸 수 있게 만드는 설계 결정입니다. 세션이 끝나면 종료 코드는 “앱이 무엇을 반환했는가”가 아니라 “시간 대체가 적용되었는가”에 답합니다. 그래서 파이프라인은 조용히 일어나지 않은 대체 때문에 실패할 수 있고, 이것이야말로 실패할 가치가 있는 실패입니다. 그 뒤에 오는 모든 것은 아무것도 증명하지 못한 테스트이기 때문입니다.

대상 자체의 종료 코드는 세션 데이터에 계속 보고됩니다.

코드의미
0동작함 - 시간을 읽은 모든 프로세스가 세션 시계를 보았음
10일부 동작함 - 일부 채널은 커버되고 일부는 커버되지 않음
11동작하지 않음 - 대체가 핵심 채널에 도달하지 못함
4판단 불가 - 커버리지를 확인할 수 없음
1사용 오류 - 잘못된 플래그 또는 잘못된 식
2대상을 실행하거나 인젝션할 수 없었음
12대상이 사라짐. 단일 인스턴스 애플리케이션임을 시사함
3내부 오류 - 엔진을 시작할 수 없었거나, 예기치 않은 상태를 만났거나, 세션을 닫기 전에 멈춤(엔진 자신의 종료 코드와 무관하게). 이런 실행에는 판정이 없습니다
5이 릴리스에는 해당 작업이 빌드되어 있지 않음
6실행이 중간에 끊김 - --timeout이 만료되었거나, 엔진이 15초 동안 응답하지 않아 중지됨. 이것은 판정이 아닙니다. 세션이 중단되었으므로 대상에 대해 어느 쪽으로도 아무것도 증명하지 못합니다
7다른 세션이 이미 실행 중임 - 세션은 한 번에 하나뿐입니다. 끝난 뒤 다시 시도하면 됩니다
8세션이 판정에 도달했지만 그 증거가 --report로 지정한 파일에 없음 - 디스크가 가득 찼거나 다른 프로그램이 이전 파일을 열어 두어, 그 파일은 그대로 남습니다. 판정은 명령이 출력하는 보고서에 그대로 있습니다

두 명령의 모든 플래그와 계산기용 같은 표는 명령줄 레퍼런스에 있습니다.

실행 시간 제한

파이프라인은 사람이 데스크톱 앱을 닫기를 기다릴 수 없습니다. --ticks N은 N번의 하트비트(각각 실제 1초) 뒤에 세션을 끝내고, 그때까지 알아낸 내용을 보고합니다. 커버리지는 어차피 프로세스의 맨 처음 순간에 확정되므로, 대개는 짧은 제한이면 충분합니다.

# 10초 동안 실행한 뒤 멈추고 보고
chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt

기계 판독용 출력과 증거

  • --json은 사람이 읽는 보고서 대신 기계가 읽을 수 있는 레코드로 세션을 출력합니다. 채널별 커버리지를 포함해 담긴 사실은 같습니다.
  • --report <path>는 사람이 읽는 보고서를 파일에 기록하며, 빌드 산출물로 쓰기에 알맞습니다. 판정이 동작함이 아닌 세션은 단서를 맨 아래에 묻어 두지 않고, 파일 맨 앞에 신뢰할 수 없는 증거라는 배너를 붙입니다.
  • 계산기도 --json을 지원하므로, 파이프라인이 필요한 날짜를 계산해 다시 입력으로 넘길 수 있습니다.
# 날짜를 계산한 뒤, 그 날짜로 실행
chrono calc --base today --snap eom --json
chrono run ".\build\test.exe" --preset month-end --ticks 10 --json

단계 하나의 예

- name: Month-end behaviour
  shell: pwsh
  run: |
    .\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
    # 여기서 0이 아닌 종료 코드가 나오면 대체가 적용되지 않았다는 뜻이므로,
    # 그 뒤의 테스트는 아무것도 증명하지 못했을 것이다

- name: Keep the evidence
  uses: actions/upload-artifact@v7
  with:
    name: chrono-evidence
    path: evidence.txt

러너에 관한 솔직한 주의 두 가지

  • Windows 러너가 필요합니다. Linux나 macOS 빌드는 없으며 앞으로도 만들지 않습니다. Linux에서는 libfaketime이 이미 이 역할을 합니다.
  • 호스팅된 러너의 백신이 인젝션을 막을 수 있습니다. 시간을 옮기려면 대상 프로세스에 라이브러리를 인젝션해야 하는데, 이는 문서화된 Windows 기법이지만 악성코드도 사용합니다. 이를 막는 러너는 거짓 통과 대신 그 사실을 알리는 종료 코드를 냅니다. 다만 의존하기 전에 미리 알아 두어야 할 점입니다.

같은 이유로 이 프로젝트 자체의 종단 간 테스트 모음은 호스팅된 러너가 아니라 실제 컴퓨터에서 실행됩니다. 지속적 통합은 모든 것을 빌드하고 단위 테스트하며, 대체 자체는 릴리스 전에 32비트와 64비트 빌드 모두에서 실제 애플리케이션을 대상으로 직접 시험합니다.

직접 써 보세요