시간에 민감한 소프트웨어는 어떻게 테스트합니까?


9

시간에 민감하다는 것은 예를 들어 한 달에 한 번만 실행되는 스크립트 또는 지속적으로 실행되지만 한 달에 한 번만 특정 출력을 제공하는 스크립트를 의미합니다. 분명히 많은 경우에 대해 단위 테스트를 할 수 있지만 예외가 있습니다 (내 이해에는).

내가 만난 최근의 예는 매월 둘째 날에서 마지막 날에 크론 작업을 설정하는 것이 었습니다. 이것은 cron 탭이있는 쉘 스크립트를 사용하여 cron의 올바른 달을 가져와야했습니다.

1 0 [shell command] * * [my script]

나는 스크립트에 익숙하지 않고 일반적으로 쉘 스크립트에 익숙하지 않았으므로 달 말이 다가올 때까지 기다렸다가 스크립트가 올바르게 실행되는지 확인하는 것 외에 실제로 테스트하는 좋은 방법이 없었습니다 (실제로 내 솔루션은 cron 및 shell 스크립팅에 대해 더 많이 알고있는 작업자).

따라서 시간에 민감한 스크립트를 테스트하는 데 유용한 해결 방법이 있는지 궁금합니다.


3
VM에서이를 실행하고 스크립트 실행 전날 자정과 같은 편리한 시간으로 시스템 시간을 설정할 수 있습니다.
Vitor Py

2
crontab은 일반 쉘 스크립트를 실행합니다. crontab을 기다리지 않고 스크립트를 직접 (샌드 박스 또는 vm에서) 실행할 수 있습니다.
crasic

2
내 대답은 특정 사례에 비해 과도 할 수 있습니다 : 스크립트를 실행하십시오. 그러나 더 큰 문제는 가상화 및 계측과 같은 솔루션이 필요합니다.
Macneil

답변:


7

단위 테스트 외에도 OS 별 문제를 처리하기 위해 자동 테스트를 설정하는 다른 두 가지 전략이 있습니다.

  • 가상화 : 필요한 정확한 구성으로 여러 OS 이미지 (예 : VMWare 사용 )를 설정하고 테스트 할 바이너리를 자동으로 가져 오는 방법 (일반적으로 특수 디렉토리를 VM 공간에 마운트하여)을 설정 한 다음 테스트.

또는:

  • 인스 트루먼 테이션 : if프로그램이 다르게 작동하도록 특수 조건을 프로그램에 수동으로 추가 하십시오. 유닉스 환경에서는 다음과 같은 특정 환경 변수가 설정되어 있는지 확인하면됩니다 FOOBAR_TEST_TIME_WITH_T=500. 자동화 된 테스트는 환경 변수와 환경 변수의 다른 설정을 사용하여 필요한 것을 실행합니다.

상호 작용이 라이브러리 수준에서 표현 될 수있는 경우 다른 라이브러리에 연결할 수도 있습니다. 가상화 ( "라이브러리"가 OS 커널 인 경우) 또는 계측 기술로 생각할 수 있습니다. 오늘날 사용되는 가상화라는 용어는 거의 항상 VMWare와 같은 의미를 갖지만 두 용어가 모두 사용될 수 있습니다. 미리 준비된 값을 반환하거나 특정 상호 작용을 다시 실행하기위한 라이브러리는 모의 또는 스터브 방식입니다.

자동 인스 트루먼 테이션 도구도있어 바이너리를 다시 작성하여 파일 시스템이 가득 찬 것과 같은 다른 원하는 효과를 얻을 수 있습니다.

전반적으로, 당신의 목표는 버그를 찾는 것입니다. 파일 시스템이 가득 찬 것과 같은 이상한 경우를 확인하기 위해 프로그램을 수동으로 계측하여 가상화 또는 수동 시스템 구성 경로를 거의 사용하지 않는 것이 가장 쉽고 효과적입니다.


귀하의 '라이브러리 가상화'가 모의 또는 모의 라이브러리를 사용하는 것으로 더 잘 알려져 있다고 생각합니다.
Javier

10

가장 효과적-테스트중인 기계의 날짜를 변경하십시오. 실행해야 할 때를 조금 전에 설정하고 시작하고 올바르게 실행되는지 확인하십시오. 그러나 여러 기계가 관련되어 있거나 회사가 제어 할 수없는 자원이 필요한 경우에는 항상 가능하지는 않습니다. 그러나 여러 달 동안 수행하고 2 년을 테스트하기 위해 연도를 몇 차례 변경해야합니다.


1
제한된 시간 동안 (n 평가) 라이센스로 소프트웨어를 설치 한 경우 시계를 땜질하면 소프트웨어가 실행을 차단할 수 있습니다.
Marjan Venema

일부 회사에서는 네트워크에 로그인 한 모든 워크 스테이션이 "서버"시간에서 5 분을 벗어나지 않아야합니다. 그렇지 않으면 워크 스테이션이 잠 깁니다. 그것은 나에게 일어났다 :-)
OnesimusUnbound

1

스크립트에 대해 잘 모르지만 날짜를 설정할 수있는 일종의 매개 변수를 사용하려고합니다. 귀하의 경우, 날짜가 제공되지 않으면 기본적으로 월말로 설정됩니다. 코드에서 date 매개 변수를 사용하여 오늘이 이틀 전이면 실행하십시오. 테스트를 할 수있을뿐만 아니라 (지금부터 2 일 후에 통과), 정상적인 상황 (정전, 서버 다운 등)에서 실행이 불가능한 경우 다음 날에도 실행할 수 있습니다.


1

crontab을 언급 했으므로 nix 환경에서 실행한다고 가정합니다. 이 경우 libfaketime을 확인하는 것이 좋습니다.
http://www.code-wizards.com/projects/libfaketime/

LD_PRELOAD의 마법을 통해 인터페이스와 일치하는 한 라이브러리 함수의 사용자 정의 버전을로드 할 수 있습니다. libfaketime은 환경 변수를 통해 동작을 사용자 정의 할 수있는 시간 시스템 호출 버전을로드합니다. 상자의 다른 사람에게 영향을 미치지 않고 time ()이 현재 시간의 하드 코딩 된 값 또는 오프셋을 반환하도록 할 수 있습니다.


0

cron은 여러 세대에 걸쳐 테스트 ( "생산 테스트")되기 때문에 테스트 할 필요가 없습니다. 물론, 셸 스크립트로 작업하는 경우 가상 머신에서 날짜 / 시간을 설정할 수 있습니다.

이를 처리하기 위해 선호되는 방법은 하나의 프로그래밍 트릭을 사용하거나 다른 하나를 사용하여 시간을 허비하는 "시계 조롱"입니다. 쉘 스크립트에서 $ {:-} 구문을 사용하여 환경 변수에 설정된 날짜를 사용하고 강제하지 않으면 실제 시간으로 대체 할 수 있습니다.

다른 언어에서는 모의 라이브러리를 사용하거나 24 시간 동안 추상화를 만듭니다.

모의 시계는 테스트를 수동으로 설정하지 않고 자동화 할 수 있기 때문에 좋습니다. 이는 나중에 스크립트 / 코드를 수정하는 데 큰 이점이 있으며 여전히 작동하는지 여부를 쉽게 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.